我想运行pytest,然后存储结果并根据需要将结果呈现给用户(例如,将pytest结果存储到db中,然后通过web服务公开它们),我可以从命令行运行pytest,并选择将结果报告保存到文件中,然后查找并解析文件,但如果将结果保存在(pytest) python应用程序中,然后将其存储到文件中,然后立即查找文件,然后将其解析回python代码以供进一步处理,我觉得很傻。我知道我可以通过pytest.main(args)以编程方式运行pytest,但是它只返回一些退出代码,而不返回测试结果的详细信息--如何使用pytest.main()检索结果?
我在找smt
args = # arguments
ret_code = pytest.main(args=args) # pytest.main() as is only returns trivial return code
my_own_method_to_process(pytest.results) # how to retrieve any kind of pytest.results object that would contain test execution results data (list of executed tests, pass fail info, etc as pytest is displaying into console or saves into file reports)有几个类似的问题,但总是有一些偏差,不适用于我。我只想从我的代码中运行pytest --不管输出是什么格式--直接获取它并进行进一步的处理。(请注意,我所处的企业环境中,安装新的软件包(即pytest插件)是有限的,所以我希望在不向我的环境中安装任何其他模块/pytest插件的情况下实现这一点。
发布于 2022-05-17 17:42:47
编写一个小插件,为每个测试收集和存储报告。示例:
import time
import pytest
class ResultsCollector:
def __init__(self):
self.reports = []
self.collected = 0
self.exitcode = 0
self.passed = 0
self.failed = 0
self.xfailed = 0
self.skipped = 0
self.total_duration = 0
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(self, item, call):
outcome = yield
report = outcome.get_result()
if report.when == 'call':
self.reports.append(report)
def pytest_collection_modifyitems(self, items):
self.collected = len(items)
def pytest_terminal_summary(self, terminalreporter, exitstatus):
print(exitstatus, dir(exitstatus))
self.exitcode = exitstatus.value
self.passed = len(terminalreporter.stats.get('passed', []))
self.failed = len(terminalreporter.stats.get('failed', []))
self.xfailed = len(terminalreporter.stats.get('xfailed', []))
self.skipped = len(terminalreporter.stats.get('skipped', []))
self.total_duration = time.time() - terminalreporter._sessionstarttime
def run():
collector = ResultsCollector()
pytest.main(plugins=[collector])
for report in collector.reports:
print('id:', report.nodeid, 'outcome:', report.outcome) # etc
print('exit code:', collector.exitcode)
print('passed:', collector.passed, 'failed:', collector.failed, 'xfailed:', collector.xfailed, 'skipped:', collector.skipped)
print('total duration:', collector.total_duration)
if __name__ == '__main__':
run()https://stackoverflow.com/questions/72277284
复制相似问题