前言:pytest框架本身就提供了一个html测试报告的模板,而且使用也非常简单,只是简单的同时,报告上一些要素就会不足。但是我们也可以通过Hook函数追加一些关键信息,所以追求完美的你,一定不会错过下面的追加内容的 。
目录
一、生成html测试报告
二、添加测试人
三、添加测试执行时间
四、添加错误截屏
一、生成html测试报告
首先需要导入一个类库:pytest--html然后打开Terminal,执行命令:pytest --html=XXX.html,在当前脚本所在文件中即可生成一个最简单的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
- 在框架根目录下创建一个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
- 同样进入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 = '' % 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方法我运行之后不知道怎么就是没法生成测试报告,就不纠结了。
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 = '' % 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版本如下,多了报错截图,包括代码截图以及网页截图:



