Skip to content

Commit

Permalink
[17.0][ADD] odoo_test_xmlrunner module
Browse files Browse the repository at this point in the history
  • Loading branch information
madecsmile committed May 25, 2024
1 parent 7a68734 commit deae97b
Show file tree
Hide file tree
Showing 12 changed files with 373 additions and 0 deletions.
200 changes: 200 additions & 0 deletions odoo_test_xmlrunner/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
======================
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
-------

* martin.deconinck@smile.fr

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 tests # noqa: E8130,F401
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": "martin.deconinck@smile.fr, 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'],
},
}
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
1 change: 1 addition & 0 deletions odoo_test_xmlrunner/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import loader # F401 imported but unused
32 changes: 32 additions & 0 deletions odoo_test_xmlrunner/tests/loader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from odoo.tests import loader as odoo_loader
from odoo.tests.result import OdooTestResult
import xmlrunner
import threading
import os
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

0 comments on commit deae97b

Please sign in to comment.