freeipa/ipatests/ipa-run-tests
Stanislav Levin 6d8d167036
ipatests: Specify Pytest XML report schema
Pytest 5.2+ warns if tests XML report is generated but its format (schema)
is not explicitly specified:
```
/root/.local/lib/python3/site-packages/_pytest/junitxml.py:417
  /root/.local/lib/python3/site-packages/_pytest/junitxml.py:417: PytestDeprecationWarning: The 'junit_family' default value will change to 'xunit2' in pytest 6.0.
  Add 'junit_family=xunit1' to your pytest.ini file to keep the current format in future versions of pytest and silence this warning.
    _issue_warning_captured(deprecated.JUNIT_XML_DEFAULT_FAMILY, config.hook, 2)
```

For example, xunit2 is used by jenkins and Pytest strictly conforms its
schema [0]. Pytest's xunit1, in turn, allows to attach user fields to
report.

The only known client of IPA tests results is Azure. Azure supports
[1] JUnit, which is likely the same as Pytest's xunit1, while Azure's
xUnit2 is actually xUnit.net v2. This means that Azure supports (in
one form or another) Pytest's both xunit1 and xunit2 as JUnit.

[0]: https://github.com/jenkinsci/xunit-plugin/blob/xunit-2.3.2/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
[1]: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/test/publish-test-results?view=azure-devops&tabs=yaml

Fixes: https://pagure.io/freeipa/issue/8101
Signed-off-by: Stanislav Levin <slev@altlinux.org>
Reviewed-By: Sergey Orlov <sorlov@redhat.com>
2020-04-21 13:24:50 +02:00

75 lines
2.5 KiB
Python
Executable File

#!/usr/bin/python3
# Authors:
# Petr Viktorin <pviktori@redhat.com>
# Jason Gerard DeRose <jderose@redhat.com>
#
# Copyright (C) 2008-2013 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Pytest wrapper for running an installed (not in-tree) IPA test suite
Any command-line arguments are passed directly to pytest.
The current directory is changed to the location of the ipatests package,
so any relative paths given will be based on the ipatests module's path.
"""
import os
import sys
import pytest
import ipatests
# This is set to store --with-xunit report in an accessible place:
os.environ['IPATEST_XUNIT_PATH'] = os.path.join(os.getcwd(), 'nosetests.xml')
HERE = os.path.dirname(os.path.abspath(ipatests.__file__))
def has_option(option):
if option in sys.argv:
return True
for arg in sys.argv:
for argi in arg.split("="):
if option in argi:
return True
return False
# don't override specified command line options
if not has_option("confcutdir"):
sys.argv.insert(1, "--confcutdir={}".format(HERE))
# for backward compatibility
if not has_option("cache_dir"):
sys.argv[1:1] = ["-o", 'cache_dir={}'.format(os.path.join(os.getcwd(),
".pytest_cache"))]
# Pytest 5.2 deprecation: The default value of junit_family option will change
# to xunit2 in pytest 6.0. Current XML scheme is xunit1.
if not has_option("junit_family"):
sys.argv[1:1] = ["-o", 'junit_family=xunit1']
pyt_args = [sys.executable, "-c",
"import sys,pytest;sys.exit(pytest.main())"] + sys.argv[1:]
# shell is needed to perform globbing
sh_args = ["/bin/sh", "--norc", "--noprofile", "-c", "--"]
pyt_args_esc = [
f"'{x}'" if not x or " " in x else x
for x in pyt_args
]
args = sh_args + [" ".join(pyt_args_esc)]
os.chdir(HERE)
sys.stdout.flush()
os.execv(args[0], args)