优化 - pytest - html
需要安装pytest - html插件
pytest可以生成多种样式的结果
1.生成 JunitXML 格式的测试报告: 命令: --junitxml=path
2.生成result log格式的测试报告: 命令: --resultlog=report\log.txt
3.生成html格式的测试报告: 命令: --html=report\test_one_func.html
main方法运行测试用例
pytest.main('命令行')
示例:
pytest.main(['-m smoke','--html=Outputs/report/webReport.html','--junitxml=Outputs/report/webReport.xml'])
fixture使用
fixture:即测试用例执行的环境准备和清理
在unittest中即指setUp(),tearDowm(),setUpClass(),tearDownClass()
fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容
比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余
定义fixture
把一个函数定义为fixture很简单,在函数声明之前加上@pytest.fixture
表示此函数为测试环境数据的准备和清理
在一个fixture内部如何区分环境准备\环境清理:
在函数内使用yield关键字
yield关键字以后的代码,就是环境清理的代码,即在测试用例执行完成之后会执行的代码
fixture作用域
fixture的参数中,有scope作用域:
function:每个test都运行,默认是function的scope.即unittest中的setUp和tearDown
class:每个class的所有test只运行一次.即unittest中的setUpClass和tearDownClass
module:每个module的所有test只运行一次
session:每个session只运行一次
fixture中设置返回值:
有的时候,我们在测试环境初始化时,会对资源进行处理后,在测出用例中药使用这个资源
yield返回值
示例:
import pytest
from selenium import webdriver
from testDatas import common_datas as cd
from pageObjects.login_page import LoginPage@pytest.fixture # 默认scope为function
def init_driver():global driverdriver = webdriver.Chrome()driver.maximize_window()driver.get(cd.web_url)LP = LoginPage(driver)yield (driver,LP) # 将driver作为返回值,在测试用例中需要使用driverdriver.close() # 测试用例执行完成之后,要执行的清理操作driver.quit() # 测试用例执行完成之后,要执行的清理操作@pytest.fixture(scope='class')
def init_class():print('我是class级别的fixture')@pytest.fixture(scope='session')
def init_sess():print('我是session级别的fixture')
调用fixture
测试用例/测试类中调用fixture的三种方式:
1.在测试用例中直接调用它
将fixture的函数名字作为测试用例的参数
如果fixture有返回值,那么测试用例中的fixture函数名字就接收返回值
示例代码:
class TestLogin:@pytest.fixture # 默认scope为functiondef init_driver():global driverdriver = webdriver.Chrome()driver.maximize_window()driver.get(cd.web_url)LP = LoginPage(driver)yield (driver,LP) # 将driver作为返回值,在测试用例中需要使用driverdriver.close() # 测试用例执行完成之后,要执行的清理操作driver.quit() # 测试用例执行完成之后,要执行的清理操作@pytest.mark.parametrize('data',ld.wrong_data)def test_login_wrongData(self,data,init_driver): # fixture函数名作为参数传入init_driver[1].login(data['user'],data['passwd']) # 函数名代表了fixture
2.用fixture装饰器调用fixture:
在测试用例/测试类前面加上@pytest.mark.usefixtures("fixture函数名字")
ps:定义conftest.py文件,在此文件中可定义多个fixture.pytest会自动搜索词文件
示例代码:
@pytest.mark.parametrize('data',ld.wrong_data)
@pytest.mark.usefixtures("init_driver")
def test_login_wrongData(self,data,init_driver): # fixture函数名作为参数传入init_driver[1].login(data['user'],data['passwd']) # 函数名代表了fixture的返回值# 断言assert (data['check'] in init_driver[1].get_wrongMsg_byForm())
3.用autos调用fixture -- 不推荐使用
在定义fixture时,有一个参数是autouse,默认设置为False
当默认为False,就可以选择用上面两种方式来使用fixture
当设置为True时,在一个session内的所有的test都会自动调用这个fixture
权限大,责任也大,所以用该功能时也要谨慎小心
conftest.py文件
定义公共的fixture,多个测试类中都可以调用
pytest提供了conftest.py文件,可以将fixture定义在此文件中
运行测试用例时,不需要去导入这个文件,会自动去查找conftest.py文件,然后去找到对应的fixture
示例代码(conftest.py文件):
@pytest.fixture # 默认scope为function
def init_driver():global driverdriver = webdriver.Chrome()driver.maximize_window()driver.get(cd.web_url)LP = LoginPage(driver)yield (driver,LP) # 将driver作为返回值,在测试用例中需要使用driverdriver.close() # 测试用例执行完成之后,要执行的清理操作driver.quit() # 测试用例执行完成之后,要执行的清理操作