Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Unittest xUnit reports
Odoo addon: odoo_test_xmlrunner
## Installation
```bash
pip install odoo-bringout-oca-server-tools-odoo_test_xmlrunner
```
## Dependencies
This addon depends on:
- base
## Manifest Information
- **Name**: Unittest xUnit reports
- **Version**: 16.0.1.0.1
- **Category**: Tools
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/server-tools](https://github.com/OCA/server-tools) branch 16.0, addon `odoo_test_xmlrunner`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Odoo_test_xmlrunner Module - odoo_test_xmlrunner
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for odoo_test_xmlrunner. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- base

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon odoo_test_xmlrunner or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-server-tools-odoo_test_xmlrunner"
# or
uv pip install odoo-bringout-oca-server-tools-odoo_test_xmlrunner"
```

View file

@ -0,0 +1,11 @@
# Models
Detected core models and extensions in odoo_test_xmlrunner.
```mermaid
classDiagram
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: odoo_test_xmlrunner. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon odoo_test_xmlrunner
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon odoo_test_xmlrunner
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,205 @@
======================
Unittest xUnit reports
======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/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-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=16.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:%2016.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
- `Akretion <https://akretion.com>`__:
- Florian Mounier florian.mounier@akretion.com
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/16.0/odoo_test_xmlrunner>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1 @@
from . import odoo_tests # F401 imported but unused

View file

@ -0,0 +1,18 @@
{
"name": "Unittest xUnit reports",
"version": "16.0.1.0.1",
"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,
"installable": True,
"application": False,
"external_dependencies": {
"python": ["unittest-xml-reporting"],
},
}

View file

@ -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"

View file

@ -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"

View file

@ -0,0 +1 @@
from . import loader # F401 imported but unused

View file

@ -0,0 +1,47 @@
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"]:
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()

View file

@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View file

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

View file

@ -0,0 +1,4 @@
- [Smile](https://smile.eu/fr):
- Martin Deconinck <martin.deconinck@smile.fr>
- [Akretion](https://akretion.com):
- Florian Mounier <florian.mounier@akretion.com>

View file

@ -0,0 +1 @@
This module generate unittest reports using unittest-xml-reporting tool.

View file

@ -0,0 +1,3 @@
Install python library https://pypi.org/project/unittest-xml-reporting/
The module is automatically installed on the Odoo instance.

View file

@ -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'
```

View file

@ -0,0 +1 @@
unittest-xml-reporting

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,554 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Unittest xUnit reports</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
: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.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
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 }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="unittest-xunit-reports">
<h1 class="title">Unittest xUnit reports</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:dc5901a41067fac6a375c2ba99ceaf485afc9273c2248b73255cc1b99e6fddcf
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/server-tools/tree/16.0/odoo_test_xmlrunner"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-0-odoo_test_xmlrunner"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-tools&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module generate unittest reports using unittest-xml-reporting tool.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a><ul>
<li><a class="reference internal" href="#run-the-native-odoo-tests" id="toc-entry-3">Run the native Odoo tests</a><ul>
<li><a class="reference internal" href="#gitlab-ci-usage-example" id="toc-entry-4">Gitlab CI usage example</a></li>
<li><a class="reference internal" href="#github-actions-usage-example" id="toc-entry-5">Github Actions usage example</a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-6">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-7">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-8">Authors</a></li>
<li><a class="reference internal" href="#other-credits" id="toc-entry-9">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-10">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#toc-entry-1">Installation</a></h1>
<p>Install python library <a class="reference external" href="https://pypi.org/project/unittest-xml-reporting/">https://pypi.org/project/unittest-xml-reporting/</a></p>
<p>The module is automatically installed on the Odoo instance.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<div class="section" id="run-the-native-odoo-tests">
<h2><a class="toc-backref" href="#toc-entry-3">Run the native Odoo tests</a></h2>
<p>Run the native Odoo tests. See the <a class="reference external" href="https://www.odoo.com/documentation/17.0/fr/developer/reference/backend/testing.html">Odoo
documentation</a>
for more information.</p>
<div class="section" id="gitlab-ci-usage-example">
<h3><a class="toc-backref" href="#toc-entry-4">Gitlab CI usage example</a></h3>
<p>Add the following job to your <tt class="docutils literal"><span class="pre">.gitlab-ci.yml</span></tt> file:</p>
<pre class="code yaml literal-block">
<span class="nt">stages</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">test</span><span class="w">
</span><span class="nt">variables</span><span class="p">:</span><span class="w">
</span><span class="nt">POSTGRES_DB</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">odoo</span><span class="w">
</span><span class="nt">POSTGRES_USER</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">odoo</span><span class="w">
</span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">odoo</span><span class="w">
</span><span class="nt">POSTGRES_HOST_AUTH_METHOD</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">trust</span><span class="w">
</span><span class="nt">test</span><span class="p">:</span><span class="w">
</span><span class="nt">stage</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">test</span><span class="w">
</span><span class="nt">image</span><span class="p">:</span><span class="w">
</span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest</span><span class="w">
</span><span class="nt">services</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">postgres:15</span><span class="w">
</span><span class="nt">tags</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">gitlab-org-docker</span><span class="w">
</span><span class="nt">script</span><span class="p">:</span><span class="w">
</span><span class="c1"># install odoo and run tests</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">oca_install_addons &amp;&amp; oca_init_test_database &amp;&amp; oca_run_tests</span><span class="w">
</span><span class="c1"># generate coverage report</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">coverage html -d htmlcov &amp;&amp; coverage xml -o coverage.xml</span><span class="w">
</span><span class="c1"># read line-rate from coverage.xml and print it as percentage</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">total=$(grep -oP '&lt;coverage[^&gt;]*line-rate=&quot;\K[0-9.]+' coverage.xml | head -n 1 | awk '{print $1 * 100}') &amp;&amp; echo &quot;total ${total}%&quot;</span><span class="w">
</span><span class="nt">coverage</span><span class="p">:</span><span class="w"> </span><span class="s">'/(?i)total.*?</span><span class="nv"> </span><span class="s">(100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'</span><span class="w">
</span><span class="nt">artifacts</span><span class="p">:</span><span class="w">
</span><span class="nt">paths</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">htmlcov/*</span><span class="w">
</span><span class="nt">when</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">always</span><span class="w">
</span><span class="nt">reports</span><span class="p">:</span><span class="w">
</span><span class="nt">junit</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">test_results/*.xml</span><span class="w">
</span><span class="nt">coverage_report</span><span class="p">:</span><span class="w">
</span><span class="nt">coverage_format</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">cobertura</span><span class="w">
</span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">coverage.xml</span>
</pre>
</div>
<div class="section" id="github-actions-usage-example">
<h3><a class="toc-backref" href="#toc-entry-5">Github Actions usage example</a></h3>
<p>Add the following job to your <tt class="docutils literal">.github/workflows/main.yml</tt> file:</p>
<pre class="code yaml literal-block">
<span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">tests</span><span class="w">
</span><span class="nt">permissions</span><span class="p">:</span><span class="w">
</span><span class="nt">contents</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">read</span><span class="w">
</span><span class="nt">checks</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">write</span><span class="w">
</span><span class="nt">id-token</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">write</span><span class="w">
</span><span class="nt">on</span><span class="p">:</span><span class="w">
</span><span class="nt">push</span><span class="p">:</span><span class="w">
</span><span class="nt">branches</span><span class="p">:</span><span class="w"> </span><span class="p-Indicator">[</span><span class="s">&quot;main&quot;</span><span class="p-Indicator">]</span><span class="w">
</span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p-Indicator">[</span><span class="s">&quot;*&quot;</span><span class="p-Indicator">]</span><span class="w">
</span><span class="nt">pull_request</span><span class="p">:</span><span class="w">
</span><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span><span class="nt">test</span><span class="p">:</span><span class="w">
</span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">ubuntu-22.04</span><span class="w">
</span><span class="nt">container</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">${{ matrix.container }}</span><span class="w">
</span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">${{ matrix.name }}</span><span class="w">
</span><span class="nt">strategy</span><span class="p">:</span><span class="w">
</span><span class="nt">fail-fast</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">false</span><span class="w">
</span><span class="nt">matrix</span><span class="p">:</span><span class="w">
</span><span class="nt">include</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">container</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">ghcr.io/oca/oca-ci/py3.10-odoo17.0:latest</span><span class="w">
</span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">test with Odoo</span><span class="w">
</span><span class="nt">services</span><span class="p">:</span><span class="w">
</span><span class="nt">postgres</span><span class="p">:</span><span class="w">
</span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">postgres:12.0</span><span class="w">
</span><span class="nt">env</span><span class="p">:</span><span class="w">
</span><span class="nt">POSTGRES_USER</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">odoo</span><span class="w">
</span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">odoo</span><span class="w">
</span><span class="nt">POSTGRES_DB</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">odoo</span><span class="w">
</span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="l-Scalar-Plain">5432:5432</span><span class="w">
</span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">actions/checkout&#64;v3</span><span class="w">
</span><span class="nt">with</span><span class="p">:</span><span class="w">
</span><span class="nt">persist-credentials</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">false</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">Install addons and dependencies</span><span class="w">
</span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">oca_install_addons</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">Check licenses</span><span class="w">
</span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">manifestoo -d . check-licenses</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">Check development status</span><span class="w">
</span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">manifestoo -d . check-dev-status --default-dev-status=Beta</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">Initialize test db</span><span class="w">
</span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">oca_init_test_database</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">Run tests</span><span class="w">
</span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">oca_run_tests</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">codecov/codecov-action&#64;v4</span><span class="w">
</span><span class="nt">with</span><span class="p">:</span><span class="w">
</span><span class="nt">token</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">${{ secrets.CODECOV_TOKEN }}</span><span class="w">
</span><span class="p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">Publish Test Report</span><span class="w">
</span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">mikepenz/action-junit-report&#64;v4</span><span class="w">
</span><span class="nt">if</span><span class="p">:</span><span class="w"> </span><span class="l-Scalar-Plain">success() || failure()</span><span class="w"> </span><span class="c1"># always run even if the previous step fails</span><span class="w">
</span><span class="nt">with</span><span class="p">:</span><span class="w">
</span><span class="nt">report_paths</span><span class="p">:</span><span class="w"> </span><span class="s">'test_results/*.xml'</span>
</pre>
</div>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-6">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20odoo_test_xmlrunner%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-7">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-8">Authors</a></h2>
<ul class="simple">
<li>Smile</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#toc-entry-9">Other credits</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://smile.eu/fr">Smile</a>:<ul>
<li>Martin Deconinck <a class="reference external" href="mailto:martin.deconinck&#64;smile.fr">martin.deconinck&#64;smile.fr</a></li>
</ul>
</li>
<li><a class="reference external" href="https://akretion.com">Akretion</a>:<ul>
<li>Florian Mounier <a class="reference external" href="mailto:florian.mounier&#64;akretion.com">florian.mounier&#64;akretion.com</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-10">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/16.0/odoo_test_xmlrunner">OCA/server-tools</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-oca-server-tools-odoo_test_xmlrunner"
version = "16.0.0"
description = "Unittest xUnit reports -
This module override Odoo testing method to run them with xmlrunner tool.
"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-base>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["odoo_test_xmlrunner"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]