一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就来谈谈关于软件测试中的“Python单元测试框架—Pytest”。
Pytest概述
Pytest也是python测试框架,与Python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大。
Pytest特征如下。
l 断言提示信息更清楚。
l 自动化加载函数与模块。
l 支持运行由nose、unittest编写的测试case。
l 支持Python2.3、Python2.7以及Python3.X。
l 丰富的插件以及社区支持。
l 支持参数化。
l 支持失败重跑。
l 支持多线程运行测试用例。
l 支持分布式。
由于Pytest不是python自带的,所以使用Pytest之前需要通过pip3命令安装。
C:\Users\xiang>pip3 install -U Pytest
查看Pytest版本如下。
C:\Users\xiang>Pytest --version
This is Pytest version 4.0.2,imported from c:\python37\lib\site-packages\Pytest.py
下面是Pytest测试上一节提到的测试建议计算器的代码。
案例2-8:用Pytest框架实现测试简易计算器。
#coding=utf-8
import Pytest
from Util import util
from Calculator import calculator
from parameterized import parameterized
class TestCalculator:
def setup_class(self):
print("测试开始")
def test_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)
def test_max_number(self):
j=calculator(9223372036854775808,9223372036854775808)
util.AssertEqual(j.mymultiply(),85070591730234615865843651857942052864)
def test_subs(self):
mydata = [[4,2,2],[2,4,-2],[4,4,0]]
n=0
for i in mydata:
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,),
])
def test_mysubs(self,a,b,p):
util.AssertEqual(calculator(a,b).mysubs(),p)
@Pytest.mark.website
def test_multiply(self):
mydata = [[4,2,8],[4,-2,-8],[-4,2,-8],[-4,-2,8]]
n=0
judge=True
for i in mydata:
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,),
])
def test_mymultiply(self,a,b,p):
util.AssertEqual(calculator(a,b).mymultiply(),p)
def test_divide(self):
j=calculator(4,0)
util.AssertEqual(j.mydivide(),0)
def teardown_class(self):
print("测试结束")
if __name__ == '__main__':
Pytest.main(["-s","test_Calculator.py"])
由于Pytest没有自己的断言方法,所以只能用python自身的断言。在这里所有的断言封装在一个名为Util.py的文件中。
#!/usr/bin/env python
#coding:utf-8
class util:
#判断a是否等于b
def AssertEqual(a,b):
assert a == b
#判断a是否不等于b
def AssertNotEqual(a,b):
assert a != b
#判断a是否大于等于b
def AssertMoreEqual(a,b):
assert a >= b
#判断a是否大于b
def AssertMore(a,b):
assert a > b
#判断a是否小与等于b
def AssertLessEqual(a,b):
assert a <= b
#判断a是否小于b
def AssertLess(a,b):
assert a < b
#判断a是否在b中
def AssertIn(a,b):
assert a in b
#判断a是否不在b中
def AssertNotIn(a,b):
assert a not in b
#判断b是否为空
def AssertIsNone(b):
if (b):
assert 1==1
else:
assert 1==2
#判断b是否不为空
def AssertIsNone(b):
if not (b):
assert 1==1
else:
assert 1==2
#用于判断n是否为素数
def AssertPrime(n):
if n <= 1:
return False
for i in range(2,n):
if n % i == 0:
return False
return True
#用于判断n是否不为素数
def AssertNoPrime(n):
return not AssertPrime(n)
另外可以看到parameterized同样也可以在这里使用。运行输出结果如下。
=============== RESTART: C:\python\unittest\test_Calculator.py ===============
[1m============================= test session starts =============================[0m
platform win32 -- Python 3.7.1,Pytest-4.0.2,py-1.7.0,pluggy-0.2.0
rootdir: C:\python\unittest,inifile:
[1mcollecting ... [0m[1m
collected 12 items [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========================== 12 passed in 0.68 seconds ==========================[0m
总结一下,Pytest 必须遵循以下规则。
如果想用Pytest寻找整个目录下的测试用例,那么文件名必须以test_开头或者以test结尾。
测试类以Test开头,并且不能带有init方法。
测试函数以test开头。
Pytest不支持中文路径,如果项目路径中有中文会报错。