在用pytest执行测试用例的时候,有时需要根据用例执行的结果,做一些其他的操作,比如:在用selenium做自动化测试的时候,如果用例执行失败,需要截图,方便以后排查原因:
方法1:
from _pytest.runner import runtestprotocol
from _pytest.runner import pytest_runtest_makereport
def pytest_runtest_protocol(item):
reports = runtestprotocol(item)
for report in reports:
if report.when == 'call':
if report.outcome == 'failed':
if browser_option.screen_shot:
report_dir = browser_option.report_dir
picture_name = item.name + '.png'
picture_path = join(report_dir, picture_name)
context.browser.save_screenshot(picture_path)
方法2:
from _pytest.runner import runtestprotocol
from _pytest.runner import pytest_runtest_makereport
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
setattr(item, "rep_" + rep.when, rep)
if rep.when == 'call':
if rep.failed:
if browser_option.screen_shot:
report_dir = browser_option.report_dir
picture_name = item.name + '.png'
picture_path = join(report_dir, picture_name)
context.browser.save_screenshot(picture_path)
方法1虽然也能获取到中间结果,但是该方法由于调用了:runtestprotocol
,而导致同一个测试用例会被执行两次,而方法2则不会,所以方法2更加合适。
参考:
https://stackoverflow.com/questions/35703122/how-to-detect-when-pytest-test-case-failed
https://pytest.readthedocs.io/en/2.7.3/plugins.html
https://stackoverflow.com/questions/14121657/how-to-get-test-name-and-test-result-during-run-time-in-pytest