引自免费微信小程序:皆我百晓生
看起来你遇到的问题是pytest
插件验证错误,提示找不到名为pytest_runtest_markereport
的钩子。这个钩子函数是用来处理测试标记报告的,但在较新的pytest
版本中已经被弃用,取而代之的是pytest_runtest_protocol
。
为了修复这个问题,你需要将你的钩子函数更改为pytest_runtest_protocol
,并相应地调整内部逻辑。这是一个修改后的版本:
import time
import logging
# 设置日志配置
logging.basicConfig(filename='test_log.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def pytest_configure(config):
config.addinivalue_line("markers", "screenshot: Take a screenshot on test failure")
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_protocol(item, nextitem):
"""
用框架执行用例过程中判断执行结果,记录到日志中,并在失败时捕获屏幕截图。
"""
outcome = yield
report = outcome.get_result()
# 获取测试标记
marker = item.get_closest_marker('screenshot')
path = f"images/{time.time()}.png"
if report.when == "call":
o = report.outcome
s = f"用例执行结果:【{report.outcome}】"
if o == "failed" and marker is not None:
logger.error(s)
if "driver" in item.fixturenames:
driver = item.funcargs['driver']
driver.get_screenshot_as_file(path)
logger.info(f"页面截图:{path}")
elif o == "skip":
logger.warning(s)
else:
logger.info(s)
# 如果你的项目中没有包含driver fixture,你需要添加一个
@pytest.fixture
def driver(request):
# 这里是一个示例,你需要根据实际情况创建浏览器实例
browser = webdriver.Firefox() # 或者其他浏览器驱动
request.addfinalizer(browser.quit) # 确保浏览器在测试后关闭
return browser
这段代码首先设置了日志的基本配置,然后定义了一个名为screenshot
的测试标记。在pytest_runtest_protocol
钩子函数中,我们检查了当前测试是否有screenshot
标记,如果有且测试失败,那么就获取屏幕截图并保存。同时,确保在每个测试结束后正确关闭浏览器。
注意,你需要安装适当的Webdriver(例如geckodriver对于Firefox,chromedriver对于Chrome等),并将它们添加到系统PATH中,以便webdriver.Firefox()
能正常工作。
如果你的项目中还没有包含driver
fixture,你需要添加一个,如上面所示,这只是一个创建浏览器实例的示例,你需要根据实际使用的浏览器进行调整。