单元测试框架---pytest
一、优化 - pytest
pytest:基于unittest之上的单元测试框架
1、自动发现测试模块和测试方法;
2、断言使用assert+表达式即可;
3、可以设置会话级、模块级、类级、函数级的fixtures
4、有丰富的插件库,目前300以上
安装命令:
pip install pytest
安装html报告的插件:
pip install pytest-html
pytest插件地址:
http://plugincompat.herokuapp.com/
二、pytest - mark
对测试用例打标签。在运行测试用例的时候,可根据标签名来过滤要运行的用例。
使用方法:
在测试用例/测试类前面加上:@pytest.mark.标记名
示例:
@pytest.mark.smoke
三、pytest - 收集测试用例
pytest收集测试用例的规则:
1、默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索;
2、搜索规则:
1)符合命名规则 test_*.py或者*_test.py的文件;
2)以test_开头的函数名;
3)以Test开头的测试类(没有__init__函数)当中,以test_开头的函数
四、pytest - 用例运行方式
指定测试模块:pytest test_mod.py
指定测试目录:pytest testing/
通过关键字表达式过滤执行:
pytest -k "MyClass and not method"
这条命令会匹配文件名、类名、方法名匹配表达式的用例
通过节点id来运行测试用例:
节点id的组成:py模块名::类名::函数名 或者 py模块名::函数名
示例:pytest test_xxx.py::TestXXX::func_XXX
通过标记表达式执行:
pytest -m smoke
这条命令会执行被装饰器 @pytest.mark.smoke装饰的所有测试用例
五、优化 - pytest - html
需要安装pytest - html插件
pytest可以生成多种样式的结果:
1、生成JunitXML格式的测试报告:--juintxml=path
2、生成result log格式的测试报告: --resultlog=report\log.txt
3、生成Html格式的测试报告:--html=report\test_one_func.html
六、pytest - 定义fixture
fixture:计测试用例执行的环境准备和清理,在unittet中即指setup(),tesrdown()
fixture主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。
比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步也是冗余。
1、定义fixture
把一个函数定义为Fixture很简单,在函数声明之前加上@pytest.fixture。
表示此函数为测试环境数据的准备和清理。
那么在一个fixture内部如何区分环境准备、环境清理呢?
在函数内部使用yield关键字。
yield关键字以后的代码,就是环境清理的代码。即在测试用例执行完成之后会执行的代码。
2、fixture返回值
fixture的参数中,有scope作用域:
function:每个test都运行,默认是function的scope。即unittest中的Setup和tearDown
class:每个class的所有test只运行一次。即unittest中的setupClass和teardownClass
module:每个module的所有的test只运行一次
session:每个session只运行一次
fixture中设置返回值:
有的时候,我们在测试环境初始化时,会对资源进行处理后,在测试用例中要使用这个资源。
yield 返回值
示例:
@pytest.fixture #默认scope为function
def myfixture():
driver = wendriver.Chrome()
yield driver #将driver作为返回值。在测试用例中需要使用driver
driver.close() #测试用例执行完成之后,要执行的清理操作
driver.quit() #测试用例执行完成之后,要执行的清理操作
七、pytest - 调用fixture
调用fixture的三种方式:
1、在测试用例中直接调用它:
将fixture的函数名字作为测试用例的参数。
如果ficture有返回值,那么测试用例中的fixture函数名字就接收返回值。
示例:
def test_ttt(self,myfixture):#fixture函数作为参数参入
myfixture.find_element_by_xpath("XXX") #函数名字代表了fixture的返回值,即driver
2、用fixture装饰器调用fixture
在测试用例/测试类前面加上@pytest.mark.usefixfures("fixture函数名字")
ps:定义conftest.py文件,在此文件中可定义多个fixture,pytest会自动搜索此文件。
3、用autos调用fixture
在定义fixture时,有一个参数是autouse,默认设置为False。
当默认为False,就可以选择用上面两种方式来试用fixture。
当设置为Ture时,在一个session内的所有的test都会自动调用这个fixture。
权限大,责任也大,所以用该功能时也要小心谨慎。
八、pytest - conftest.py
定义公共的fixture,多个测试类中都可以调用。
pytest提供了conftest.py文件,可以将fixture定义在此文件中。
运行测试用例时,不需要去导入这个文件,会自动去查找conftest.py文件,然后去找到对应的fixture.

浙公网安备 33010602011771号