From ea575b62281b2400c21187881e2c23b810442a64 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 25 May 2024 21:05:43 +0200 Subject: [PATCH 01/15] [17.0][ADD] odoo_test_xmlrunner module --- odoo_test_xmlrunner/README.rst | 201 +++++++ odoo_test_xmlrunner/__init__.py | 1 + odoo_test_xmlrunner/__manifest__.py | 19 + odoo_test_xmlrunner/odoo_tests/__init__.py | 1 + odoo_test_xmlrunner/odoo_tests/loader.py | 33 ++ odoo_test_xmlrunner/pyproject.toml | 3 + odoo_test_xmlrunner/readme/CONFIGURATION.md | 2 + odoo_test_xmlrunner/readme/CREDITS.md | 2 + odoo_test_xmlrunner/readme/DESCRIPTION.md | 1 + odoo_test_xmlrunner/readme/INSTALL.md | 3 + odoo_test_xmlrunner/readme/USAGE.md | 108 ++++ odoo_test_xmlrunner/requirements.txt | 1 + .../static/description/index.html | 547 ++++++++++++++++++ 13 files changed, 922 insertions(+) create mode 100644 odoo_test_xmlrunner/README.rst create mode 100644 odoo_test_xmlrunner/__init__.py create mode 100644 odoo_test_xmlrunner/__manifest__.py create mode 100644 odoo_test_xmlrunner/odoo_tests/__init__.py create mode 100644 odoo_test_xmlrunner/odoo_tests/loader.py create mode 100644 odoo_test_xmlrunner/pyproject.toml create mode 100644 odoo_test_xmlrunner/readme/CONFIGURATION.md create mode 100644 odoo_test_xmlrunner/readme/CREDITS.md create mode 100644 odoo_test_xmlrunner/readme/DESCRIPTION.md create mode 100644 odoo_test_xmlrunner/readme/INSTALL.md create mode 100644 odoo_test_xmlrunner/readme/USAGE.md create mode 100644 odoo_test_xmlrunner/requirements.txt create mode 100644 odoo_test_xmlrunner/static/description/index.html diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst new file mode 100644 index 00000000000..c8d5c9881e5 --- /dev/null +++ b/odoo_test_xmlrunner/README.rst @@ -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 `__ +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 ']*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 `_. +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Smile + +Other credits +------------- + +- `Smile `__: + + - 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 `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/odoo_test_xmlrunner/__init__.py b/odoo_test_xmlrunner/__init__.py new file mode 100644 index 00000000000..48ff93bf29f --- /dev/null +++ b/odoo_test_xmlrunner/__init__.py @@ -0,0 +1 @@ +from . import odoo_tests # F401 imported but unused diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py new file mode 100644 index 00000000000..21e67c9a0e7 --- /dev/null +++ b/odoo_test_xmlrunner/__manifest__.py @@ -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"], + }, +} diff --git a/odoo_test_xmlrunner/odoo_tests/__init__.py b/odoo_test_xmlrunner/odoo_tests/__init__.py new file mode 100644 index 00000000000..4ad46195b0f --- /dev/null +++ b/odoo_test_xmlrunner/odoo_tests/__init__.py @@ -0,0 +1 @@ +from . import loader # F401 imported but unused diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py new file mode 100644 index 00000000000..1e8ab4590d4 --- /dev/null +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -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 diff --git a/odoo_test_xmlrunner/pyproject.toml b/odoo_test_xmlrunner/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/odoo_test_xmlrunner/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/odoo_test_xmlrunner/readme/CONFIGURATION.md b/odoo_test_xmlrunner/readme/CONFIGURATION.md new file mode 100644 index 00000000000..aa2c51f2d0a --- /dev/null +++ b/odoo_test_xmlrunner/readme/CONFIGURATION.md @@ -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. \ No newline at end of file diff --git a/odoo_test_xmlrunner/readme/CREDITS.md b/odoo_test_xmlrunner/readme/CREDITS.md new file mode 100644 index 00000000000..41c88d09352 --- /dev/null +++ b/odoo_test_xmlrunner/readme/CREDITS.md @@ -0,0 +1,2 @@ +* [Smile](https://smile.eu/fr): + * Martin Deconinck \ No newline at end of file diff --git a/odoo_test_xmlrunner/readme/DESCRIPTION.md b/odoo_test_xmlrunner/readme/DESCRIPTION.md new file mode 100644 index 00000000000..16d28d3c5f9 --- /dev/null +++ b/odoo_test_xmlrunner/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module generate unittest reports using unittest-xml-reporting tool. \ No newline at end of file diff --git a/odoo_test_xmlrunner/readme/INSTALL.md b/odoo_test_xmlrunner/readme/INSTALL.md new file mode 100644 index 00000000000..8079d04b1d7 --- /dev/null +++ b/odoo_test_xmlrunner/readme/INSTALL.md @@ -0,0 +1,3 @@ +Install python library https://pypi.org/project/unittest-xml-reporting/ + +The module is automatically installed on the Odoo instance. \ No newline at end of file diff --git a/odoo_test_xmlrunner/readme/USAGE.md b/odoo_test_xmlrunner/readme/USAGE.md new file mode 100644 index 00000000000..647f60df8fd --- /dev/null +++ b/odoo_test_xmlrunner/readme/USAGE.md @@ -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 ']*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' + +``` \ No newline at end of file diff --git a/odoo_test_xmlrunner/requirements.txt b/odoo_test_xmlrunner/requirements.txt new file mode 100644 index 00000000000..718199204e9 --- /dev/null +++ b/odoo_test_xmlrunner/requirements.txt @@ -0,0 +1 @@ +unittest-xml-reporting diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html new file mode 100644 index 00000000000..e545c902885 --- /dev/null +++ b/odoo_test_xmlrunner/static/description/index.html @@ -0,0 +1,547 @@ + + + + + +Unittest xUnit reports + + + +
+

Unittest xUnit reports

+ + +

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

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

+

Table of contents

+ +
+

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 +for more information.

+
+

Gitlab CI usage example

+

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

+
+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:

+
+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. +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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Smile
  • +
+
+
+

Other credits

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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 project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 9e9fd90322bf0cd57709b428e83ff07ab30427f4 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Thu, 21 Nov 2024 11:59:52 +0100 Subject: [PATCH 02/15] [BACKPORT] odoo_test_xmlrunner to 16.0 Also implement a better patch and merge test results. --- odoo_test_xmlrunner/README.rst | 20 +++--- odoo_test_xmlrunner/__init__.py | 2 +- odoo_test_xmlrunner/__manifest__.py | 2 +- odoo_test_xmlrunner/odoo_tests/__init__.py | 2 +- odoo_test_xmlrunner/odoo_tests/loader.py | 68 +++++++++++-------- odoo_test_xmlrunner/readme/CONFIGURATION.md | 2 +- odoo_test_xmlrunner/readme/CREDITS.md | 6 +- odoo_test_xmlrunner/readme/DESCRIPTION.md | 2 +- odoo_test_xmlrunner/readme/INSTALL.md | 2 +- odoo_test_xmlrunner/readme/USAGE.md | 2 +- .../static/description/index.html | 23 ++++--- 11 files changed, 79 insertions(+), 52 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index c8d5c9881e5..e4bd556217d 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -7,7 +7,7 @@ Unittest xUnit reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:782b2ed22876a72d28e0e67c5ff949d6d104c2da4bd0cf36ca7dbf3597900604 + !! source digest: sha256:c168ead1259f832fbcdbe238c9bd5a9eb692d3e0c712130ab2103e4a2dcba36b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -17,13 +17,13 @@ Unittest xUnit reports :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 + :target: https://github.com/OCA/server-tools/tree/16.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 + :target: https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-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 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -164,7 +164,7 @@ Bug Tracker Bugs are tracked on `GitHub 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -179,9 +179,13 @@ Authors Other credits ------------- -- `Smile `__: +- `Smile `__: - - Martin Deconinck martin.deconinck@smile.fr + - Martin Deconinck martin.deconinck@smile.fr + +- `Akretion `__: + + - Florian Mounier florian.mounier@akretion.com Maintainers ----------- @@ -196,6 +200,6 @@ 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 `_ project on GitHub. +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/odoo_test_xmlrunner/__init__.py b/odoo_test_xmlrunner/__init__.py index 48ff93bf29f..382130c7586 100644 --- a/odoo_test_xmlrunner/__init__.py +++ b/odoo_test_xmlrunner/__init__.py @@ -1 +1 @@ -from . import odoo_tests # F401 imported but unused +from . import odoo_tests # F401 imported but unused diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 21e67c9a0e7..3425fb207e5 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "17.0.1.0.0", + "version": "16.0.1.0.0", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/odoo_test_xmlrunner/odoo_tests/__init__.py b/odoo_test_xmlrunner/odoo_tests/__init__.py index 4ad46195b0f..571c37ecce6 100644 --- a/odoo_test_xmlrunner/odoo_tests/__init__.py +++ b/odoo_test_xmlrunner/odoo_tests/__init__.py @@ -1 +1 @@ -from . import loader # F401 imported but unused +from . import loader # F401 imported but unused diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py index 1e8ab4590d4..297e54ceffa 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,33 +1,47 @@ import os -import threading +from unittest.mock import patch -import xmlrunner +from xmlrunner import XMLTestRunner +from xmlrunner.result import _XMLTestResult -from odoo.tests import loader as odoo_loader from odoo.tests.result import OdooTestResult +from odoo.tests.suite import OdooSuite 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 +if config["test_enable"]: + unpatched_run = OdooSuite.run + + def run(self, result): + # 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) + + # Suite run method will be called by the XMLTestRunner, + # so we need to run the original run method + with patch.object(self, "run", lambda result: unpatched_run(self, result)): + # Override : XMLTestRunner to run the tests and generate XML reports + results = XMLTestRunner( + output=test_result_directory, + verbosity=2, + ).run(self) + + result.update(results) + return result + + patch("odoo.tests.suite.OdooSuite.run", run).start() + + unpatched_update = OdooTestResult.update + + def update(self, other): + # Adapt _XMLTestResult to OdooTestResult + if isinstance(other, _XMLTestResult): + self.failures_count += len(other.failures) + self.errors_count += len(other.errors) + self.skipped += len(other.skipped) + self.testsRun += other.testsRun + else: + unpatched_update(self, other) + + patch("odoo.tests.result.OdooTestResult.update", update).start() diff --git a/odoo_test_xmlrunner/readme/CONFIGURATION.md b/odoo_test_xmlrunner/readme/CONFIGURATION.md index aa2c51f2d0a..ebd8c0c3852 100644 --- a/odoo_test_xmlrunner/readme/CONFIGURATION.md +++ b/odoo_test_xmlrunner/readme/CONFIGURATION.md @@ -1,2 +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. \ No newline at end of file +- **test_result_directory** (default: *test_results*) : The path (created if not exists) where the reports will be written to. diff --git a/odoo_test_xmlrunner/readme/CREDITS.md b/odoo_test_xmlrunner/readme/CREDITS.md index 41c88d09352..25c6a27a7d8 100644 --- a/odoo_test_xmlrunner/readme/CREDITS.md +++ b/odoo_test_xmlrunner/readme/CREDITS.md @@ -1,2 +1,4 @@ -* [Smile](https://smile.eu/fr): - * Martin Deconinck \ No newline at end of file +- [Smile](https://smile.eu/fr): + - Martin Deconinck +- [Akretion](https://akretion.com): + - Florian Mounier diff --git a/odoo_test_xmlrunner/readme/DESCRIPTION.md b/odoo_test_xmlrunner/readme/DESCRIPTION.md index 16d28d3c5f9..a6e2fc9ef35 100644 --- a/odoo_test_xmlrunner/readme/DESCRIPTION.md +++ b/odoo_test_xmlrunner/readme/DESCRIPTION.md @@ -1 +1 @@ -This module generate unittest reports using unittest-xml-reporting tool. \ No newline at end of file +This module generate unittest reports using unittest-xml-reporting tool. diff --git a/odoo_test_xmlrunner/readme/INSTALL.md b/odoo_test_xmlrunner/readme/INSTALL.md index 8079d04b1d7..bd127a850b9 100644 --- a/odoo_test_xmlrunner/readme/INSTALL.md +++ b/odoo_test_xmlrunner/readme/INSTALL.md @@ -1,3 +1,3 @@ Install python library https://pypi.org/project/unittest-xml-reporting/ -The module is automatically installed on the Odoo instance. \ No newline at end of file +The module is automatically installed on the Odoo instance. diff --git a/odoo_test_xmlrunner/readme/USAGE.md b/odoo_test_xmlrunner/readme/USAGE.md index 647f60df8fd..6e22e01c08a 100644 --- a/odoo_test_xmlrunner/readme/USAGE.md +++ b/odoo_test_xmlrunner/readme/USAGE.md @@ -105,4 +105,4 @@ jobs: with: report_paths: 'test_results/*.xml' -``` \ No newline at end of file +``` diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index e545c902885..c71e686f9ed 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,9 +367,9 @@

Unittest xUnit reports

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

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

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

Table of contents

@@ -511,7 +512,7 @@

Bug Tracker

Bugs are tracked on GitHub 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.

+feedback.

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

@@ -529,16 +530,22 @@

Other credits

  • Martin Deconinck martin.deconinck@smile.fr
  • +
  • Akretion: +
  • Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +Odoo Community Association +

    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 project on GitHub.

    +

    This module is part of the OCA/server-tools project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    From 903d712bdefc817b4adc8b502cf4335973d7fe48 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 27 Dec 2024 09:22:18 +0000 Subject: [PATCH 03/15] [UPD] Update odoo_test_xmlrunner.pot --- odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot diff --git a/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot new file mode 100644 index 00000000000..78d58d53fe0 --- /dev/null +++ b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" From a7fa0a8f0721c5e01642615c690c0ed979d7df83 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 27 Dec 2024 09:30:37 +0000 Subject: [PATCH 04/15] [BOT] post-merge updates --- odoo_test_xmlrunner/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 odoo_test_xmlrunner/static/description/icon.png diff --git a/odoo_test_xmlrunner/static/description/icon.png b/odoo_test_xmlrunner/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From ee8e4b1a102c63a81c7231a4bdc01fde48c1b5fa Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Wed, 8 Jan 2025 23:24:59 +0100 Subject: [PATCH 05/15] [FIX] odoo_test_xmlrunner: set auto_install to False. - It doesn't make sense to make this module auto installable. - As the module depends only on 'base' AND introduces a new external dependency to an extra library (unittest-xml-reporting) all the instances that are cloning server-tools repo will have trouble, because it will not be possible to install this module, due to missing dependency --- odoo_test_xmlrunner/README.rst | 8 ++++---- odoo_test_xmlrunner/__manifest__.py | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index e4bd556217d..b3d6961392d 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -179,13 +179,13 @@ Authors Other credits ------------- -- `Smile `__: +- `Smile `__: - - Martin Deconinck martin.deconinck@smile.fr + - Martin Deconinck martin.deconinck@smile.fr -- `Akretion `__: +- `Akretion `__: - - Florian Mounier florian.mounier@akretion.com + - Florian Mounier florian.mounier@akretion.com Maintainers ----------- diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 3425fb207e5..09358b62e11 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -10,7 +10,6 @@ "website": "https://github.com/OCA/server-tools", "category": "Tools", "sequence": 20, - "auto_install": True, "installable": True, "application": False, "external_dependencies": { From 1f694a898e5bb71e1bc18aacae626e630538a34f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 8 Jan 2025 22:34:38 +0000 Subject: [PATCH 06/15] [BOT] post-merge updates --- odoo_test_xmlrunner/README.rst | 10 +++++----- odoo_test_xmlrunner/__manifest__.py | 2 +- odoo_test_xmlrunner/static/description/index.html | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index b3d6961392d..4dc21559332 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -7,7 +7,7 @@ Unittest xUnit reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c168ead1259f832fbcdbe238c9bd5a9eb692d3e0c712130ab2103e4a2dcba36b + !! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -179,13 +179,13 @@ Authors Other credits ------------- -- `Smile `__: +- `Smile `__: - - Martin Deconinck martin.deconinck@smile.fr + - Martin Deconinck martin.deconinck@smile.fr -- `Akretion `__: +- `Akretion `__: - - Florian Mounier florian.mounier@akretion.com + - Florian Mounier florian.mounier@akretion.com Maintainers ----------- diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 09358b62e11..88569e6be15 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "16.0.1.0.0", + "version": "16.0.1.0.1", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index c71e686f9ed..f2d8d581973 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -367,7 +367,7 @@

    Unittest xUnit reports

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:c168ead1259f832fbcdbe238c9bd5a9eb692d3e0c712130ab2103e4a2dcba36b +!! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

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

    From c5db4a4414eeeaecf4efd2cecf7e134c40f00686 Mon Sep 17 00:00:00 2001 From: mymage Date: Fri, 10 Jan 2025 12:29:52 +0000 Subject: [PATCH 07/15] Added translation using Weblate (Italian) --- odoo_test_xmlrunner/i18n/it.po | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 odoo_test_xmlrunner/i18n/it.po diff --git a/odoo_test_xmlrunner/i18n/it.po b/odoo_test_xmlrunner/i18n/it.po new file mode 100644 index 00000000000..73388557f6d --- /dev/null +++ b/odoo_test_xmlrunner/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" From 6c5260dd260d81ac94023e574157f44088596608 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 15:18:45 +0200 Subject: [PATCH 08/15] [MIG] odoo_test_xmlrunner: Migration to 18.0 --- odoo_test_xmlrunner/README.rst | 10 +++++----- odoo_test_xmlrunner/__manifest__.py | 2 +- odoo_test_xmlrunner/static/description/index.html | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index 4dc21559332..c3bef9dafd2 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -17,13 +17,13 @@ Unittest xUnit reports :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/16.0/odoo_test_xmlrunner + :target: https://github.com/OCA/server-tools/tree/18.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-16-0/server-tools-16-0-odoo_test_xmlrunner + :target: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-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=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -164,7 +164,7 @@ Bug Tracker Bugs are tracked on `GitHub 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -200,6 +200,6 @@ 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 `_ project on GitHub. +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 88569e6be15..395b79fc803 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "16.0.1.0.1", + "version": "18.0.1.0.0", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index f2d8d581973..cb3de94c822 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -369,7 +369,7 @@

    Unittest xUnit reports

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

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

    Table of contents

    @@ -512,7 +512,7 @@

    Bug Tracker

    Bugs are tracked on GitHub 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.

    +feedback.

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

    @@ -545,7 +545,7 @@

    Maintainers

    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 project on GitHub.

    +

    This module is part of the OCA/server-tools project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    From 06879f5bdc1bbddb6ddbeed3935a6866774abad1 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 15:19:40 +0200 Subject: [PATCH 09/15] [FIX] odoo_test_xmlrunner: Import odoo tests only in test mode This removes the new warning in 18.0 --- odoo_test_xmlrunner/odoo_tests/loader.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py index 297e54ceffa..a6f96102bfd 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,14 +1,15 @@ import os from unittest.mock import patch -from xmlrunner import XMLTestRunner -from xmlrunner.result import _XMLTestResult - -from odoo.tests.result import OdooTestResult -from odoo.tests.suite import OdooSuite from odoo.tools import config if config["test_enable"]: + from xmlrunner import XMLTestRunner + from xmlrunner.result import _XMLTestResult + + from odoo.tests.result import OdooTestResult + from odoo.tests.suite import OdooSuite + unpatched_run = OdooSuite.run def run(self, result): From 99425261be2d0e65f8e6157d9eaa3549b297bb4f Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Tue, 30 Sep 2025 15:21:27 +0200 Subject: [PATCH 10/15] [FIX] odoo_test_xmlrunner: Patch manually to avoid patch being restored at test end --- odoo_test_xmlrunner/odoo_tests/loader.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py index a6f96102bfd..5ce61cc4e23 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,5 +1,4 @@ import os -from unittest.mock import patch from odoo.tools import config @@ -21,17 +20,21 @@ def run(self, result): # Suite run method will be called by the XMLTestRunner, # so we need to run the original run method - with patch.object(self, "run", lambda result: unpatched_run(self, result)): - # Override : XMLTestRunner to run the tests and generate XML reports + unpatched_sub_run = self.run + self.run = lambda result, debug=False: unpatched_run(self, result, debug) + # Override : XMLTestRunner to run the tests and generate XML reports + try: results = XMLTestRunner( output=test_result_directory, verbosity=2, ).run(self) + finally: + self.run = unpatched_sub_run result.update(results) return result - patch("odoo.tests.suite.OdooSuite.run", run).start() + OdooSuite.run = run unpatched_update = OdooTestResult.update @@ -45,4 +48,4 @@ def update(self, other): else: unpatched_update(self, other) - patch("odoo.tests.result.OdooTestResult.update", update).start() + OdooTestResult.update = update From b0b7aeae0abf30eb17efd9ff970e94cbad3f147b Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 28 Jan 2026 11:11:40 +0000 Subject: [PATCH 11/15] [UPD] Update odoo_test_xmlrunner.pot --- odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot index 78d58d53fe0..aadee09bfed 100644 --- a/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot +++ b/odoo_test_xmlrunner/i18n/odoo_test_xmlrunner.pot @@ -3,7 +3,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" From 90431bd30dbd52b9a78cfea30f6bad07f4ad3e6a Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 28 Jan 2026 11:20:06 +0000 Subject: [PATCH 12/15] [BOT] post-merge updates --- odoo_test_xmlrunner/README.rst | 8 +++-- .../static/description/index.html | 36 +++++++++++-------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index c3bef9dafd2..9c7913840b0 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ====================== Unittest xUnit reports ====================== @@ -7,13 +11,13 @@ Unittest xUnit reports !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf + !! source digest: sha256:43d1f3fd22d63205a1755865145c5af7d858b24ac2c1683e7dfd8e791535373f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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 diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index cb3de94c822..e71f15fb742 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -3,7 +3,7 @@ -Unittest xUnit reports +README.rst -
    -

    Unittest xUnit reports

    +
    + + +Odoo Community Association + +
    +

    Unittest xUnit reports

    -

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

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

    Table of contents

    @@ -393,19 +398,19 @@

    Unittest xUnit reports

    -

    Installation

    +

    Installation

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

    The module is automatically installed on the Odoo instance.

    -

    Usage

    +

    Usage

    -

    Run the native Odoo tests

    +

    Run the native Odoo tests

    Run the native Odoo tests. See the Odoo documentation for more information.

    -

    Gitlab CI usage example

    +

    Gitlab CI usage example

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

     stages:
    @@ -445,7 +450,7 @@ 

    Gitlab CI usage example

    -

    Github Actions usage example

    +

    Github Actions usage example

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

     name: tests
    @@ -508,7 +513,7 @@ 

    Github Actions usage example<

    -

    Bug Tracker

    +

    Bug Tracker

    Bugs are tracked on GitHub 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 @@ -516,15 +521,15 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Smile
    -

    Other credits

    +

    Other credits

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -550,5 +555,6 @@

    Maintainers

    +
    From 9b465b31a3137896809164ef092dbef2aee497af Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 15 Apr 2026 12:48:04 +0100 Subject: [PATCH 13/15] [IMP] odoo_test_xmlrunner: pre-commit auto fixes --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index dfd6b25509f..3af8ad258dc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ dataclasses numpy odoorpc openupgradelib +unittest-xml-reporting From 911cd36700d59b930f8b641753fa1c36295307bb Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 15 Apr 2026 13:02:57 +0100 Subject: [PATCH 14/15] [MIG] odoo_test_xmlrunner: Migration to 19.0 --- odoo_test_xmlrunner/README.rst | 21 ++++++++++++++----- odoo_test_xmlrunner/__manifest__.py | 3 ++- .../static/description/index.html | 8 ++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/odoo_test_xmlrunner/README.rst b/odoo_test_xmlrunner/README.rst index 9c7913840b0..c3dae2dc164 100644 --- a/odoo_test_xmlrunner/README.rst +++ b/odoo_test_xmlrunner/README.rst @@ -21,13 +21,13 @@ Unittest xUnit reports :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/18.0/odoo_test_xmlrunner + :target: https://github.com/OCA/server-tools/tree/19.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-18-0/server-tools-18-0-odoo_test_xmlrunner + :target: https://translation.odoo-community.org/projects/server-tools-19-0/server-tools-19-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=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -168,7 +168,7 @@ Bug Tracker Bugs are tracked on `GitHub 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -204,6 +204,17 @@ 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 `_ project on GitHub. +.. |maintainer-yajo| image:: https://github.com/yajo.png?size=40px + :target: https://github.com/yajo + :alt: yajo +.. |maintainer-rafaelbn| image:: https://github.com/rafaelbn.png?size=40px + :target: https://github.com/rafaelbn + :alt: rafaelbn + +Current `maintainers `__: + +|maintainer-yajo| |maintainer-rafaelbn| + +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/odoo_test_xmlrunner/__manifest__.py b/odoo_test_xmlrunner/__manifest__.py index 395b79fc803..b9f65b75f54 100644 --- a/odoo_test_xmlrunner/__manifest__.py +++ b/odoo_test_xmlrunner/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Unittest xUnit reports", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "depends": ["base"], "author": "Smile, Odoo Community Association (OCA)", "license": "AGPL-3", @@ -12,6 +12,7 @@ "sequence": 20, "installable": True, "application": False, + "maintainers": ["yajo", "rafaelbn"], "external_dependencies": { "python": ["unittest-xml-reporting"], }, diff --git a/odoo_test_xmlrunner/static/description/index.html b/odoo_test_xmlrunner/static/description/index.html index e71f15fb742..faa7ab6237b 100644 --- a/odoo_test_xmlrunner/static/description/index.html +++ b/odoo_test_xmlrunner/static/description/index.html @@ -374,7 +374,7 @@

    Unittest xUnit reports

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:43d1f3fd22d63205a1755865145c5af7d858b24ac2c1683e7dfd8e791535373f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/server-tools Translate me on Weblate Try me on Runboat

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

    Table of contents

    @@ -517,7 +517,7 @@

    Bug Tracker

    Bugs are tracked on GitHub 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.

    +feedback.

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

    @@ -550,7 +550,9 @@

    Maintainers

    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 project on GitHub.

    +

    Current maintainers:

    +

    yajo rafaelbn

    +

    This module is part of the OCA/server-tools project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    From 80c224f9c47826a7de3c3193522aa14ecd0a39b4 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Thu, 30 Jul 2026 08:31:47 +0100 Subject: [PATCH 15/15] [FIX] odoo_test_xmlrunner: attribute class-level errors to the right file When setUpClass or tearDownClass fails, unittest creates an _ErrorHolder without running _XMLTestResult.startTest, so xmlrunner kept the source file of the previous test in self.filename. This made the JUnit report assign the failure to an unrelated module and left classname empty. Resolve the real test class from the _ErrorHolder description (setUpClass/tearDownClass (module.ClassName)), look up its source file and line with inspect, and patch the stored test info in addError/addFailure before the report is generated. Include a regression test that reproduces the wrong-file issue and verifies the fix. Assisted-by: OpenCode + kimi-k2.7-code --- odoo_test_xmlrunner/odoo_tests/loader.py | 84 ++++++++++++++- odoo_test_xmlrunner/tests/__init__.py | 1 + odoo_test_xmlrunner/tests/test_xmlrunner.py | 108 ++++++++++++++++++++ 3 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 odoo_test_xmlrunner/tests/__init__.py create mode 100644 odoo_test_xmlrunner/tests/test_xmlrunner.py diff --git a/odoo_test_xmlrunner/odoo_tests/loader.py b/odoo_test_xmlrunner/odoo_tests/loader.py index 5ce61cc4e23..5a44d9add53 100644 --- a/odoo_test_xmlrunner/odoo_tests/loader.py +++ b/odoo_test_xmlrunner/odoo_tests/loader.py @@ -1,10 +1,14 @@ +import inspect import os +import re from odoo.tools import config if config["test_enable"]: + from unittest.suite import _ErrorHolder + from xmlrunner import XMLTestRunner - from xmlrunner.result import _XMLTestResult + from xmlrunner.result import _XMLTestResult, failfast from odoo.tests.result import OdooTestResult from odoo.tests.suite import OdooSuite @@ -49,3 +53,81 @@ def update(self, other): unpatched_update(self, other) OdooTestResult.update = update + + _ERROR_HOLDER_PATTERN = re.compile( + r"\((?P[a-zA-Z_][a-zA-Z0-9_.]*)\." + r"(?P[a-zA-Z_][a-zA-Z0-9_]*)\)" + ) + + def _get_error_holder_source(test): + """Return the source file and line for an unittest ``_ErrorHolder``. + + ``_ErrorHolder`` instances are created by :class:`unittest.suite.TestSuite` + when a class-level ``setUpClass`` or ``tearDownClass`` fails. They carry a + description such as ``setUpClass (module.ClassName)`` but have no reference + to the actual class, so :class:`xmlrunner.result._XMLTestResult` cannot + determine their source location and falls back to the previously recorded + file (often belonging to a completely different test). This helper parses the + description and uses :mod:`inspect` to locate the real class. + """ + match = _ERROR_HOLDER_PATTERN.search(str(test)) + if not match: + return None, None + try: + module = __import__( + match.group("module"), fromlist=[match.group("classname")] + ) + test_class = getattr(module, match.group("classname")) + filename = inspect.getsourcefile(test_class) + _, lineno = inspect.getsourcelines(test_class) + return filename, lineno + except Exception: + return None, None + + unpatched_xml_start_test = _XMLTestResult.startTest + + def xml_start_test(self, test): + unpatched_xml_start_test(self, test) + if isinstance(test, _ErrorHolder) or test.__class__.__name__ == "_ErrorHolder": + filename, lineno = _get_error_holder_source(test) + if filename is not None: + self.filename = filename + self.lineno = lineno + + _XMLTestResult.startTest = xml_start_test + + unpatched_xml_add_error = _XMLTestResult.addError + + @failfast + def xml_add_error(self, test, err): + # ``_XMLTestResult.startTest`` is never called for ``_ErrorHolder`` + # instances created when ``setUpClass``/``tearDownClass`` fails, so + # ``self.filename`` retains the value from a previous test and the + # produced ``_TestInfo`` ends up with the wrong source file. Compute + # the real source file from the error holder description before + # delegating to the original implementation, then patch the recorded + # test info. + filename = lineno = None + if getattr(test, "__class__", None).__name__ == "_ErrorHolder": + filename, lineno = _get_error_holder_source(test) + unpatched_xml_add_error(self, test, err) + if filename is not None: + self.errors[-1][0].filename = filename + self.errors[-1][0].lineno = lineno + + _XMLTestResult.addError = xml_add_error + + unpatched_xml_add_failure = _XMLTestResult.addFailure + + @failfast + def xml_add_failure(self, test, err): + # Same fix as ``addError`` for class-level failures. + filename = lineno = None + if getattr(test, "__class__", None).__name__ == "_ErrorHolder": + filename, lineno = _get_error_holder_source(test) + unpatched_xml_add_failure(self, test, err) + if filename is not None: + self.failures[-1][0].filename = filename + self.failures[-1][0].lineno = lineno + + _XMLTestResult.addFailure = xml_add_failure diff --git a/odoo_test_xmlrunner/tests/__init__.py b/odoo_test_xmlrunner/tests/__init__.py new file mode 100644 index 00000000000..7ebaf434909 --- /dev/null +++ b/odoo_test_xmlrunner/tests/__init__.py @@ -0,0 +1 @@ +from . import test_xmlrunner diff --git a/odoo_test_xmlrunner/tests/test_xmlrunner.py b/odoo_test_xmlrunner/tests/test_xmlrunner.py new file mode 100644 index 00000000000..691e98c8eff --- /dev/null +++ b/odoo_test_xmlrunner/tests/test_xmlrunner.py @@ -0,0 +1,108 @@ +# Copyright 2026 Moduon Team SL +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import io +import os +import tempfile +import unittest +from unittest.suite import _ErrorHolder + +from odoo.tests.common import BaseCase +from odoo.tools import config + +if config["test_enable"]: + from xmlrunner import XMLTestRunner + + from ..odoo_tests.loader import _get_error_holder_source + + # Helper classes used by ``test_class_level_error_reported_in_own_file``. + # They are declared at module level so ``_get_error_holder_source`` can + # import them from their description. The ``_`` prefix keeps unittest + # discovery from picking them up as standalone test cases. + class _PassingTest(unittest.TestCase): + __unittest_skip__ = False + + def test_pass(self): + pass + + class _FailingTest(unittest.TestCase): + __unittest_skip__ = False + + @classmethod + def setUpClass(cls): + super().setUpClass() + raise ValueError("boom") + + def test_method(self): + pass + + class TestXMLRunnerFix(BaseCase): + """Check that JUnit reports attribute errors to the right file.""" + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._output_dir = tempfile.mkdtemp() + + def test_error_holder_source_lookup(self): + """_get_error_holder_source resolves module.ClassName descriptions.""" + err = _ErrorHolder( + "setUpClass (odoo.addons.odoo_test_xmlrunner.tests.test_xmlrunner" + ".TestXMLRunnerFix)" + ) + filename, lineno = _get_error_holder_source(err) + self.assertTrue(filename.endswith("/test_xmlrunner.py")) + self.assertIsInstance(lineno, int) + return True + + def test_class_level_error_reported_in_own_file(self): + """A failing setUpClass is reported against its own test file.""" + + # Use a plain unittest suite to avoid re-entering the OdooSuite + # monkey patch installed by this addon, which would run an inner + # XMLTestRunner and return a result object lacking the ``update`` + # method used by the outer runner. + suite = unittest.TestSuite( + [_FailingTest("test_method"), _PassingTest("test_pass")] + ) + runner = XMLTestRunner( + output=self._output_dir, + verbosity=0, + stream=io.StringIO(), + ) + result = runner.run(suite) + self.assertEqual(len(result.errors), 1) + # The failing class is the first one executed, so the result object + # did not have a chance to pick up a stale filename from a previous + # test. Verify that the produced XML file still points to this test + # module rather than to ``unittest/suite.py``. + error_holder_files = [ + fn for fn in os.listdir(self._output_dir) if "_ErrorHolder" in fn + ] + self.assertTrue( + error_holder_files, + "Expected an XML file for the _ErrorHolder test case", + ) + xml_path = os.path.join(self._output_dir, error_holder_files[0]) + with open(xml_path) as xml_file: + xml_content = xml_file.read() + # The xmlrunner path is whatever ``inspect.getsourcefile`` returns + # for the helper class; with editable installs it includes the + # ``odoo/addons`` namespace. Verify the testcase points somewhere + # under this module's path. + self.assertIn( + 'testcase classname="" name="setUpClass ' + '(odoo.addons.odoo_test_xmlrunner.tests.test_xmlrunner._FailingTest)"', + xml_content, + ) + self.assertIn( + 'odoo_test_xmlrunner/tests/test_xmlrunner.py"', + xml_content, + ) + return True + + class TestXMLRunner(BaseCase): + """Backward-compatible class name used by the original upstream tests.""" + + def test_run(self): + """Smoke test that the XML test runner still works.""" + self.assertTrue(True)