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

[14.0] [BACKPORT] odoo_test_xmlrunner + fixes #3126

Open
wants to merge 2 commits into
base: 14.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
205 changes: 205 additions & 0 deletions odoo_test_xmlrunner/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
======================
Unittest xUnit reports
======================

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

.. |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/14.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-14-0/server-tools-14-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=14.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:%2014.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 [email protected]

- `Akretion <https://akretion.com>`__:

- Florian Mounier [email protected]

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/14.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": "14.0.1.0.0",
"depends": [],
"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,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
"auto_install": True,
"auto_install": False,

See : #3156

"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
31 changes: 31 additions & 0 deletions odoo_test_xmlrunner/odoo_tests/loader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import os
from unittest.mock import patch

from xmlrunner import XMLTestRunner

from odoo.tests.common import OdooSuite
from odoo.tools import config

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.common.OdooSuite.run", run).start()
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.
4 changes: 4 additions & 0 deletions odoo_test_xmlrunner/readme/CREDITS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- [Smile](https://smile.eu/fr):
- Martin Deconinck <[email protected]>
- [Akretion](https://akretion.com):
- Florian Mounier <[email protected]>
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