收集和报告pytest结果

时间:2015-04-13 04:42:35

标签: python selenium-webdriver pytest

我正在通过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结果的最佳方法是什么?


4 个答案:

答案 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

我是作者;)