Pytest概述
Pytest也是python测试框架,与Python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大。
Pytest特征如下:
>断言提示信息更清楚。
>自动化加载函数与模块。
>支持运行由nose、unittest编写的测试case。
>支持Python2.3、Python2.7以及Python3.X。
>丰富的插件以及社区支持。
>支持参数化。
>支持失败重跑。
>支持多线程运行测试用例。
>支持分布式。
由于Pytest不是python自带的,所以使用Pytest之前需要通过pip3命令安装。
C:\Users\xiang>pip3install-UPytest
查看Pytest版本如下。
C:\Users\xiang>Pytest--version
ThisisPytestversion4.0.2,importedfromc:\python37\lib\site-packages\Pytest.py
下面是Pytest测试上一节提到的测试建议计算器的代码。
案例:用Pytest框架实现测试简易计算器
#coding=utf-8
importPytest
fromUtilimportutil
fromCalculatorimportcalculator
fromparameterizedimportparameterized
classTestCalculator:
defsetup_class(self):
print("测试开始")
deftest_base(self):
j=calculator(4,2)
util.AssertEqual(j.myadd(),6)
util.AssertEqual(j.mysubs(),2)
util.AssertEqual(j.mymultiply(),8)
util.AssertEqual(j.mydivide(),2)
deftest_max_number(self):
j=calculator(9223372036854775808,9223372036854775808)
util.AssertEqual(j.mymultiply(),85070591730234615865843651857942052864)
deftest_subs(self):
mydata=[[4,2,2],[2,4,-2],[4,4,0]]
n=0
foriinmydata:
j=calculator(mydata[n][0],mydata[n][1])
util.AssertEqual(j.mysubs(),mydata[n][2])
n+=1
@parameterized.expand([
(4,2,2,),
(2,4,-2,),
(4,4,0,),
])
deftest_mysubs(self,a,b,p):
util.AssertEqual(calculator(a,b).mysubs(),p)
@Pytest.mark.website
deftest_multiply(self):
mydata=[[4,2,8],[4,-2,-8],[-4,2,-8],[-4,-2,8]]
n=0
judge=True
foriinmydata:
j=calculator(mydata[n][0],mydata[n][1])
util.AssertEqual(j.mymultiply(),mydata[n][2])
n+=1
@parameterized.expand([
(4,2,8,),
(4,-2,-8,),
(-4,2,-8,),
(-4,-2,8,),
])
deftest_mymultiply(self,a,b,p):
util.AssertEqual(calculator(a,b).mymultiply(),p)
deftest_divide(self):
j=calculator(4,0)
util.AssertEqual(j.mydivide(),0)
defteardown_class(self):
print("测试结束")
if__name__=='__main__':
Pytest.main(["-s","test_Calculator.py"])
由于Pytest没有自己的断言方法,所以只能用python自身的断言。在这里所有的断言封装在一个名为Util.py的文件中。
#!/usr/bin/envpython
#coding:utf-8
classutil:
#判断a是否等于b
defAssertEqual(a,b):
asserta==b
#判断a是否不等于b
defAssertNotEqual(a,b):
asserta!=b
#判断a是否大于等于b
defAssertMoreEqual(a,b):
asserta>=b
#判断a是否大于b
defAssertMore(a,b):
asserta>b
#判断a是否小与等于b
defAssertLessEqual(a,b):
asserta<=b
#判断a是否小于b
defAssertLess(a,b):
asserta<b
#判断a是否在b中
defAssertIn(a,b):
assertainb
#判断a是否不在b中
defAssertNotIn(a,b):
assertanotinb
#判断b是否为空
defAssertIsNone(b):
if(b):
assert1==1
else:
assert1==2
#判断b是否不为空
defAssertIsNone(b):
ifnot(b):
assert1==1
else:
assert1==2
#用于判断n是否为素数
defAssertPrime(n):
ifn<=1:
returnFalse
foriinrange(2,n):
ifn%i==0:
returnFalse
returnTrue
#用于判断n是否不为素数
defAssertNoPrime(n):
returnnotAssertPrime(n)
另外可以看到parameterized同样也可以在这里使用。运行输出结果如下。
===============RESTART:C:\python\unittest\test_Calculator.py===============
[1m=============================testsessionstarts=============================[0m
platformwin32--Python3.7.1,Pytest-4.0.2,py-1.7.0,pluggy-0.2.0
rootdir:C:\python\unittest,inifile:
[1mcollecting...[0m[1m
collected12items[0m
test_Calculator.py测试开始
[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m[32m.[0m除数不能为零
[32m.[0m测试结束
[32m[1m==========================12passedin0.68seconds==========================[0m
总结一下,Pytest必须遵循以下规则。
>如果想用Pytest寻找整个目录下的测试用例,那么文件名必须以test_开头或者以test结尾。
>测试类以Test开头,并且不能带有init方法。
>测试函数以test开头。
>Pytest不支持中文路径,如果项目路径中有中文会报错。
下一课,我们将讲解Pytest装饰器及Pytest常用命令行选项。