pytest是第三方提供的单元测试框架,提供了更多的扩展,方便使用。
下载:pip install pytest
与unittest区别:unittest在定义测试用例时需在测试类中进行定义,而pytest可以直接定义测试用例函数,但为了代码规范,建议还是在特定测试类内集中定义测试用例。
测试文件和测试函数必须以“test”开头,测试类必须以“Test”开头,python对大小写敏感。
pytest都是使用assert进行断言,而unittest是用assertEqual()、assertIn()、assertTrue()、assertIs()等方法断言。下方列举几个pytest断言方法:
assert b in a :测试包含
assert b not in a:测试不包含
assert b is True:判断是否为True
assert b :判断是否为True
assert not b:判断是否不为True
assert b is not True:判断是否不为True
assert b is False:判断是否为False
对测试方法、测试函数、测试类、测试模块、整个测试文件进行初始化和还原环境。
(1)模块级别和函数级别
setup_module/teardown_module:在当前文件中,在所有测试用例执行之前与之后执行。
setup_function/teardown_function:在每个测试函数之前与之后执行。
setup()/teardown():在每个测试函数之前与之后执行,执行在setup_function()之后、teardown_function()之前。
(2)类级别和方法级别
setup_class/teardown_class:在当前测试类的开始与结束时执行
setup_method/teardown_method:在每个测试方法开始与结束执行。
setup()/teardown():在每个测试方法开始与结束执行,执行在setup_method()之后、teardown_method()之前。
pytest通过pytest.mark.parametrize()方法设置参数,示例代码:
import pytest
import math
#python 参数化
@pytest.mark.parametrize(
"base,exponent,expexted",
[(2,2,4),
(2,3,8),
(1,9,1),
(0,9,0)],
ids=["case1","case2","case3","case4"]
)
def test_pow(base,exponent,expected):
assert math.pow(base,exponent) == expected
先定义参数名称,即“base,exponent,expexted”,接着就是测试用例列表,列表内包含一个个的测试用例数据元祖,ids
是用以定义测试用例的名称,默认为None。注意:参数化定义的参数名称,必须和测试函数的参数名字相同,否则无法正常获取数据。
(1)Mark机制:在每一个测试用例前加一个marker,在运行时可以只运行带有该marker的测试用例,相当于用marker实现分类,运行时就能只跑某一类的测试用例。
注:支持一个测试用例有多个marker
示例:
import pytest
class TestA(object):
def inc(self,x):
return x+2
@pytest.mark.webtest
def test_anser(self):
assert self.inc(3) == 5
def test_bnser(self):
assert self.inc(4) == 7
在测试用例前方加上:@pytest.mark.webtest, webtest即标注该测试用例的marker;
命令行执行:pytest -v -m "webtest" test2.py
(2)选择运行特定的测试用例
命令行执行:
pytest -v test.py::TestClass::test_method
(3)选择运行特定的某个类,即某个类所有的测试用例
pytest -v test.py::TestClass
(4)用-k进行关键字匹配来运行测试用例名字子串
pytest -v -k http test.py
表示运行test模块中,名称含“http”子串的测试用例集合
(5)运行某个目录下的测试用例
pytest +路径(绝对路径/相对路径)
s:关闭捕捉,从而输出打印信息。
-v:增加测试用例冗长,即 将每个测试用例的运行情况展示出来。
-q:减少测试用例冗长,只展示运行结果情况。
-k:运行名称包含某字符串的用例。
-x:如果出现一条测试用例失败,则退出测试。
1.生成JUnit XML文件:主要用于存放测试结果
例:pytest ./test_dir --junit-xml=./report/log.xml
2.生成在线测试报告:即生成一个链接,浏览器打开链接查看报告。
例:pytest ./test_dir --pastebin=all
3.生成HTML格式的测试报告
~需按照pytest-html扩展:pip install pytest-html
例:pytest ./ --html=./report/result.html
pytest-rerunfailures:在测试用例失败时进行重试,通过“–reruns”参数设置测试用例运行失败后的重试次数。
pytest-parallel:实现测试用例的并行运行,在每个测试用例中分别设置sleep()模拟运行时间较长的测试用例。
运行时通过“–test-per-worker”指定线程数,“auto”表示自动分配
例:pytest -q test.py --test-per-worker auto