Python单元测试框架Pytest知识(1)

323 阅读3分钟
原文链接: zhuanlan.zhihu.com

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常用命令行选项。