Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[17.0][ADD] odoo_test_xmlrunner module #2957

Open
wants to merge 1 commit into
base: 17.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 201 additions & 0 deletions odoo_test_xmlrunner/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
======================
Unittest xUnit reports
======================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:782b2ed22876a72d28e0e67c5ff949d6d104c2da4bd0cf36ca7dbf3597900604
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/17.0/odoo_test_xmlrunner
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-tools-17-0/server-tools-17-0-odoo_test_xmlrunner
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module generate unittest reports using unittest-xml-reporting tool.

**Table of contents**

.. contents::
:local:

Installation
============

Install python library https://pypi.org/project/unittest-xml-reporting/

The module is automatically installed on the Odoo instance.

Usage
=====

Run the native Odoo tests
-------------------------

Run the native Odoo tests. See the `Odoo
documentation <https://www.odoo.com/documentation/17.0/fr/developer/reference/backend/testing.html>`__
for more information.

Gitlab CI usage example
~~~~~~~~~~~~~~~~~~~~~~~

Add the following job to your ``.gitlab-ci.yml`` file:

.. code:: yaml


stages:
- test

variables:
POSTGRES_DB: odoo
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_HOST_AUTH_METHOD: trust

test:
stage: test
image:
name: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest
services:
- name: postgres:15
tags:
- gitlab-org-docker
script:
# install odoo and run tests
- oca_install_addons && oca_init_test_database && oca_run_tests
# generate coverage report
- coverage html -d htmlcov && coverage xml -o coverage.xml
# read line-rate from coverage.xml and print it as percentage
- total=$(grep -oP '<coverage[^>]*line-rate="\K[0-9.]+' coverage.xml | head -n 1 | awk '{print $1 * 100}') && echo "total ${total}%"
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
artifacts:
paths:
- htmlcov/*
when: always
reports:
junit: test_results/*.xml
coverage_report:
coverage_format: cobertura
path: coverage.xml

Github Actions usage example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Add the following job to your ``.github/workflows/main.yml`` file:

.. code:: yaml

name: tests

permissions:
contents: read
checks: write
id-token: write

on:
push:
branches: ["main"]
tags: ["*"]
pull_request:

jobs:
test:
runs-on: ubuntu-22.04
container: ${{ matrix.container }}
name: ${{ matrix.name }}
strategy:
fail-fast: false
matrix:
include:
- container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest
name: test with Odoo
services:
postgres:
image: postgres:12.0
env:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_DB: odoo
ports:
- 5432:5432
steps:
- uses: actions/checkout@v3
with:
persist-credentials: false
- name: Install addons and dependencies
run: oca_install_addons
- name: Check licenses
run: manifestoo -d . check-licenses
- name: Check development status
run: manifestoo -d . check-dev-status --default-dev-status=Beta
- name: Initialize test db
run: oca_init_test_database
- name: Run tests
run: oca_run_tests
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Publish Test Report
uses: mikepenz/action-junit-report@v4
if: success() || failure() # always run even if the previous step fails
with:
report_paths: 'test_results/*.xml'

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/server-tools/issues/new?body=module:%20odoo_test_xmlrunner%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Smile

Other credits
-------------

- `Smile <https://smile.eu/fr>`__:

- Martin Deconinck martin.deconinck@smile.fr

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/17.0/odoo_test_xmlrunner>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions odoo_test_xmlrunner/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import odoo_tests # F401 imported but unused
19 changes: 19 additions & 0 deletions odoo_test_xmlrunner/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "Unittest xUnit reports",
"version": "17.0.1.0.0",
"depends": ["base"],
"author": "Smile, Odoo Community Association (OCA)",
"license": "AGPL-3",
"summary": """
This module override Odoo testing method to run them with xmlrunner tool.
""",
"website": "https://github.com/OCA/server-tools",
"category": "Tools",
"sequence": 20,
"auto_install": True,
"installable": True,
"application": False,
"external_dependencies": {
"python": ["unittest-xml-reporting"],
},
}
1 change: 1 addition & 0 deletions odoo_test_xmlrunner/odoo_tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import loader # F401 imported but unused
33 changes: 33 additions & 0 deletions odoo_test_xmlrunner/odoo_tests/loader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import os
import threading

import xmlrunner

from odoo.tests import loader as odoo_loader
from odoo.tests.result import OdooTestResult
from odoo.tools import config


def new_run_suite(suite, module_name=None):
# Override : Get and create a config dir
test_result_directory = config.get("test_result_directory", "test_results")
# create test result directory if not exists
if not os.path.exists(test_result_directory):
os.makedirs(test_result_directory)

# avoid dependency hell
from odoo.modules import module

module.current_test = module_name
threading.current_thread().testing = True
results = OdooTestResult()

# Override : XMLTestRunner to run the tests and generate XML reports
xmlrunner.XMLTestRunner(output=test_result_directory, verbosity=2).run(suite)

threading.current_thread().testing = False
module.current_test = None
return results


odoo_loader.run_suite = new_run_suite
3 changes: 3 additions & 0 deletions odoo_test_xmlrunner/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
2 changes: 2 additions & 0 deletions odoo_test_xmlrunner/readme/CONFIGURATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add to your odoo Configuration file:
- **test_result_directory** (default: *test_results*) : The path (created if not exists) where the reports will be written to.
2 changes: 2 additions & 0 deletions odoo_test_xmlrunner/readme/CREDITS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* [Smile](https://smile.eu/fr):
* Martin Deconinck <martin.deconinck@smile.fr>
1 change: 1 addition & 0 deletions odoo_test_xmlrunner/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module generate unittest reports using unittest-xml-reporting tool.
3 changes: 3 additions & 0 deletions odoo_test_xmlrunner/readme/INSTALL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Install python library https://pypi.org/project/unittest-xml-reporting/

The module is automatically installed on the Odoo instance.
108 changes: 108 additions & 0 deletions odoo_test_xmlrunner/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@

## Run the native Odoo tests

Run the native Odoo tests. See the [Odoo documentation](https://www.odoo.com/documentation/17.0/fr/developer/reference/backend/testing.html) for more information.

### Gitlab CI usage example

Add the following job to your `.gitlab-ci.yml` file:

```yaml

stages:
- test

variables:
POSTGRES_DB: odoo
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_HOST_AUTH_METHOD: trust

test:
stage: test
image:
name: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest
services:
- name: postgres:15
tags:
- gitlab-org-docker
script:
# install odoo and run tests
- oca_install_addons && oca_init_test_database && oca_run_tests
# generate coverage report
- coverage html -d htmlcov && coverage xml -o coverage.xml
# read line-rate from coverage.xml and print it as percentage
- total=$(grep -oP '<coverage[^>]*line-rate="\K[0-9.]+' coverage.xml | head -n 1 | awk '{print $1 * 100}') && echo "total ${total}%"
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
artifacts:
paths:
- htmlcov/*
when: always
reports:
junit: test_results/*.xml
coverage_report:
coverage_format: cobertura
path: coverage.xml
```
### Github Actions usage example

Add the following job to your `.github/workflows/main.yml` file:

```yaml
name: tests

permissions:
contents: read
checks: write
id-token: write

on:
push:
branches: ["main"]
tags: ["*"]
pull_request:

jobs:
test:
runs-on: ubuntu-22.04
container: ${{ matrix.container }}
name: ${{ matrix.name }}
strategy:
fail-fast: false
matrix:
include:
- container: ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest
name: test with Odoo
services:
postgres:
image: postgres:12.0
env:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_DB: odoo
ports:
- 5432:5432
steps:
- uses: actions/checkout@v3
with:
persist-credentials: false
- name: Install addons and dependencies
run: oca_install_addons
- name: Check licenses
run: manifestoo -d . check-licenses
- name: Check development status
run: manifestoo -d . check-dev-status --default-dev-status=Beta
- name: Initialize test db
run: oca_init_test_database
- name: Run tests
run: oca_run_tests
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Publish Test Report
uses: mikepenz/action-junit-report@v4
if: success() || failure() # always run even if the previous step fails
with:
report_paths: 'test_results/*.xml'

```
1 change: 1 addition & 0 deletions odoo_test_xmlrunner/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
unittest-xml-reporting
Loading
Loading