我正在通过pytest进行一些Selenium测试。下一步是开始做一些报告。我想写一些允许我运行测试,收集结果并发送电子邮件的东西。到目前为止,我发现的最接近的事情是将测试结果写入结果日志,然后使用插件检查存在状态并从那里发送电子邮件。这有效,但有点麻烦,我希望有一个更优雅的方式来做到这一点。虽然整体pytest文档很棒,但插件文档相当差 - 我甚至无法在任何地方找到pytest_sessionfinish
,即使它似乎有效。
import pytest
class MyPlugin:
def pytest_sessionfinish(self, exitstatus):
if exitstatus == 0:
#Send success email
pass
else:
#Read output.txt
#Add output.txt to email body
#Send email
pass
pytest.main("--resultlog=output.txt", plugins=[MyPlugin()])
问:运行和收集pytest结果的最佳方法是什么?
答案 0 :(得分:3)
生成结果报告的一种简单方法是在运行测试时使用pytest选项--junitxml
。 pytest将以JUnit格式生成测试报告。
由于JUnit被广泛使用,因此很容易找到解析报告并生成一些好看的输出的工具,比如HTML报告。据我所知,Jenkins上有一些插件可以很好地解析JUnit报告并提供很好的报告。
访问https://pytest.org/latest/usage.html并参考“创建JUnitXML格式文件”部分。
更重要的是,当你有权访问pytest对象请求或配置时,pytest提供了一种扩展JUnit XML报告的方法:
if hasattr(request.config, "_xml"):
request.config._xml.add_custom_property(name, value)
如果在测试用例中,pytest提供了一个夹具来做到这一点:
def test_function(record_xml_property):
record_xml_property("key", "value")
assert 0
这将为JUnit XML报告添加自定义属性。
答案 1 :(得分:1)
如果要实施报告,则有很多简单的pytest现成解决方案。以下是其中一些:
答案 2 :(得分:0)
安装pytest-html
,然后使用--html=pytest_report.html
选项运行测试。
答案 3 :(得分:0)
创建报告的另一种方法是先收集结果作为字典或数据框,然后用它做任何您喜欢的事(编写csv等)。
如果您想走这条路,可以使用pytest-harvest
。只需安装它,即可直接使用预定义的灯具:
import pytest
import time
@pytest.mark.parametrize('p', ['world', 'self'], ids=str)
def test_foo(p):
"""
A dummy test, parametrized so that it is executed twice
"""
print('\n hello, ' + p + ' !')
time.sleep(len(p) / 10)
def test_synthesis(module_results_df):
"""
Shows that the `module_results_df` fixture already contains what you need
"""
# drop the 'pytest_obj' column
module_results_df.drop('pytest_obj', axis=1, inplace=True)
print("\n `module_results_df` dataframe:\n")
print(module_results_df)
收益
>>> pytest -s -v
============================= test session starts =============================
...
collecting ... collected 3 items
test_basic.py::test_foo[world]
hello, world !
PASSED
test_basic.py::test_foo[self]
hello, self !
PASSED
test_basic.py::test_synthesis
`module_results_df` dataframe:
status duration_ms p
test_id
test_foo[world] passed 500.028610 world
test_foo[self] passed 400.022745 self
PASSED
========================== 3 passed in 0.05 seconds ===========================
您也可以从“ dict”装置开始,该装置包含有关设置/拆卸时间的更多详细信息,并使用提供的帮助器方法将其转换为数据框。 有关详细信息,请参见文档。
最后,如果您还希望使用参数,固定装置,步骤...,您可能希望看看这个datascience benchmark example
我是作者;)