Add support to record custom properties on xml output
This commit is contained in:
parent
37ed391cc2
commit
24212fd97f
|
@ -53,6 +53,13 @@ def bin_xml_escape(arg):
|
||||||
return unicode('#x%04X') % i
|
return unicode('#x%04X') % i
|
||||||
return py.xml.raw(illegal_xml_re.sub(repl, py.xml.escape(arg)))
|
return py.xml.raw(illegal_xml_re.sub(repl, py.xml.escape(arg)))
|
||||||
|
|
||||||
|
def record_property(name, value):
|
||||||
|
if hasattr(record_property, 'binding'):
|
||||||
|
record_property.binding(name, value)
|
||||||
|
|
||||||
|
def pytest_namespace():
|
||||||
|
return dict(record_property=record_property)
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
group = parser.getgroup("terminal reporting")
|
group = parser.getgroup("terminal reporting")
|
||||||
group.addoption('--junitxml', '--junit-xml', action="store",
|
group.addoption('--junitxml', '--junit-xml', action="store",
|
||||||
|
@ -69,12 +76,17 @@ def pytest_configure(config):
|
||||||
config._xml = LogXML(xmlpath, config.option.junitprefix)
|
config._xml = LogXML(xmlpath, config.option.junitprefix)
|
||||||
config.pluginmanager.register(config._xml)
|
config.pluginmanager.register(config._xml)
|
||||||
|
|
||||||
|
def binding(name, value):
|
||||||
|
config._xml.record_property(name, value)
|
||||||
|
record_property.binding = binding
|
||||||
|
|
||||||
def pytest_unconfigure(config):
|
def pytest_unconfigure(config):
|
||||||
xml = getattr(config, '_xml', None)
|
xml = getattr(config, '_xml', None)
|
||||||
if xml:
|
if xml:
|
||||||
del config._xml
|
del config._xml
|
||||||
config.pluginmanager.unregister(xml)
|
config.pluginmanager.unregister(xml)
|
||||||
|
|
||||||
|
del record_property.binding
|
||||||
|
|
||||||
def mangle_testnames(names):
|
def mangle_testnames(names):
|
||||||
names = [x.replace(".py", "") for x in names if x != '()']
|
names = [x.replace(".py", "") for x in names if x != '()']
|
||||||
|
@ -89,6 +101,10 @@ class LogXML(object):
|
||||||
self.tests = []
|
self.tests = []
|
||||||
self.passed = self.skipped = 0
|
self.passed = self.skipped = 0
|
||||||
self.failed = self.errors = 0
|
self.failed = self.errors = 0
|
||||||
|
self.custom_properties = {}
|
||||||
|
|
||||||
|
def record_property(self, name, value):
|
||||||
|
self.custom_properties[str(name)] = bin_xml_escape(str(value))
|
||||||
|
|
||||||
def _opentestcase(self, report):
|
def _opentestcase(self, report):
|
||||||
names = mangle_testnames(report.nodeid.split("::"))
|
names = mangle_testnames(report.nodeid.split("::"))
|
||||||
|
@ -118,6 +134,10 @@ class LogXML(object):
|
||||||
def append(self, obj):
|
def append(self, obj):
|
||||||
self.tests[-1].append(obj)
|
self.tests[-1].append(obj)
|
||||||
|
|
||||||
|
def append_custom_properties(self):
|
||||||
|
self.tests[-1].attr.__dict__.update(self.custom_properties)
|
||||||
|
self.custom_properties.clear()
|
||||||
|
|
||||||
def append_pass(self, report):
|
def append_pass(self, report):
|
||||||
self.passed += 1
|
self.passed += 1
|
||||||
self._write_captured_output(report)
|
self._write_captured_output(report)
|
||||||
|
@ -179,6 +199,7 @@ class LogXML(object):
|
||||||
if report.when == "setup":
|
if report.when == "setup":
|
||||||
self._opentestcase(report)
|
self._opentestcase(report)
|
||||||
self.tests[-1].attr.time += getattr(report, 'duration', 0)
|
self.tests[-1].attr.time += getattr(report, 'duration', 0)
|
||||||
|
self.append_custom_properties()
|
||||||
if report.passed:
|
if report.passed:
|
||||||
if report.when == "call": # ignore setup/teardown
|
if report.when == "call": # ignore setup/teardown
|
||||||
self.append_pass(report)
|
self.append_pass(report)
|
||||||
|
|
|
@ -153,6 +153,15 @@ integration servers, use this invocation::
|
||||||
|
|
||||||
to create an XML file at ``path``.
|
to create an XML file at ``path``.
|
||||||
|
|
||||||
|
If you want to log additional information for a test, you can use
|
||||||
|
record_property("key", value)::
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
def test_function():
|
||||||
|
...
|
||||||
|
pytest.record_property("example_key", 1)
|
||||||
|
...
|
||||||
|
|
||||||
Creating resultlog format files
|
Creating resultlog format files
|
||||||
----------------------------------------------------
|
----------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -552,4 +552,13 @@ def test_unicode_issue368(testdir):
|
||||||
log.append_skipped(report)
|
log.append_skipped(report)
|
||||||
log.pytest_sessionfinish()
|
log.pytest_sessionfinish()
|
||||||
|
|
||||||
|
def test_record_property(testdir):
|
||||||
|
testdir.makepyfile("""
|
||||||
|
from pytest import record_property
|
||||||
|
def test_record():
|
||||||
|
record_property("foo", "<1");
|
||||||
|
""")
|
||||||
|
result, dom = runandparse(testdir)
|
||||||
|
node = dom.getElementsByTagName("testsuite")[0]
|
||||||
|
tnode = node.getElementsByTagName("testcase")[0]
|
||||||
|
assert_attr(tnode, foo="<1")
|
||||||
|
|
Loading…
Reference in New Issue