前言:pytest框架本身就提供了一个html测试报告的模板,而且使用也非常简单,只是简单的同时,报告上一些要素就会不足。但是我们也可以通过Hook函数追加一些关键信息,所以追求完美的你,一定不会错过下面的追加内容的 👀。
目录
一、生成html测试报告
- 首先需要导入一个类库:pytest--html
- 然后打开Terminal,执行命令:pytest --html=XXX.html,在当前脚本所在文件中即可生成一个最简单的html测试报告。
报告1.0版本如下:
二、添加测试人
- 在框架根目录下创建一个conftest.py文件,我们需要将追加内容放在这个文件下,以便使其对所有报告都生效。
- 追加内容要使用optionalhook标签,同时这里还需要再导入一个类库 from py.xml import html。
- 在conftest.py文件中添加命令如下:
from py.xml import html import pytest # 在html测试报告中添加测试人信息 @pytest.mark.optionalhook def pytest_html_results_summary(prefix, summary, postfix): prefix.extend([html.p("测试人: Tom")])
- 添加好之后还是回到之前运行命令的地方,命令不变:pytest --html=XXX.html
报告2.0版本如下,多了一个测试人:
三、添加测试执行时间
- 同样进入conftest.py文件进行追加内容,可以和前面的内容共存的。我这就不写在一起了以免看的太乱了
- 使用使用optionalhook标签,并导入time类库,追加命令如下:
import time import pytest # 在html测试报告中添加测试执行时间 @pytest.mark.optionalhook def pytest_html_results_table_row(report, cells): cells.insert(1, html.td(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), class_='col-time')) cells.pop()
- 添加好之后还是回到之前运行命令的地方,命令不变:pytest --html=XXX.html
报告3.0版本如下,多了测试时间:
四、添加错误截屏
- 同样进入conftest.py文件进行配置
- 因为要用到selenium的截屏方法,所以要导入selenium的类库,同时这边的标签也变成了hookwrapper了,具体命令如下:
-
import pytest from selenium import webdriver # 定义全局的driver变量 driver = None # 设置一个browser固件 @pytest.fixture(scope='session', autouse=True) def browser(): global driver if driver is None: driver = webdriver.Chrome() return driver # 定义截屏方法 def _capture_screenshot(): return driver.get_screenshot_as_base64() # 定义添加错误图片的钩子函数 @pytest.mark.hookwrapper def pytest_runtest_makereport(item): """ 当测试失败的时候,自动截图,展示到html报告中 :param item: """ pytest_html = item.config.pluginmanager.getplugin('html') outcome = yield report = outcome.get_result() extra = getattr(report, 'extra', []) if report.when == 'call' or report.when == "setup": xfail = hasattr(report, 'wasxfail') if (report.skipped and xfail) or (report.failed and not xfail): file_name = report.nodeid.replace("::", "_") + ".png" screen_img = _capture_screenshot() if file_name: html = '<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:600px;height:300px;" ' \ 'onclick="window.open(this.src)" align="right"/></div>' % screen_img extra.append(pytest_html.extras.html(html)) report.extra = extra
- 但美中不足的是,如果要使用添加错误截屏方法,就会导致pytest不支持初始化方法和回收方法,一些代码重用的问题就没法避免了。同时我们之前定义的driver也不能使用了,一定要使用它提供的browser方法。所以测试方法修改如下:
-
# Django自动化测试平台selenium自动化测试脚本--pytest封装 # 功能名称:登录 import pytest # from selenium import webdriver from selenium.webdriver.common.by import By # 1、创建测试类 class Test_Django_Login(): # 2、创建测试方法 # 登录初始化 # def setup_method(self): # self.url = "http://xxxxxxxxxxxxxxxxxxxxxxxx" # self.driver = webdriver.Chrome() # self.driver.get(self.url) def test_login_01(self, browser): self.url = "http://xxxxxxxxxxxxxxxxxxxxxxxxxx" browser.get(self.url) browser.find_element(By.NAME, "username").send_keys('atstudy1') browser.find_element(By.NAME, "password").send_keys('51testing') browser.find_element(By.XPATH, '//*[@id="login-form"]/div[3]/input').click() # # 统一检查点 result = browser.find_element(By.XPATH, '//*[@id="content"]/p').text # 3、通过断言进行判断 assert "请输入11" in result if __name__ == '__main__': pytest.main(['test_login.py', '--html=loginReport.html'])
- 还是进入命令台运行之前的命令。main方法我运行之后不知道怎么就是没法生成测试报告,就不纠结了。
报告3.0版本如下,多了报错截图,包括代码截图以及网页截图: