一、Pytest简介
Pytest是主流的测试框架,推荐大家使用该框架。对于UnitTest框架来说,Pytest框架不需要像UnitTest那样单独创建继承类unittest.TestCase。它使用起来非常简单,只需要创建测试类或者测试文件,然后以test开头即可。Pytest测试矿建运行时,可以根据test找到测试用例并执行。
pytest测试框架主要有以下几个特点:
- 简单灵活,容易上手,文档丰富;
- 支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数;
- 支持参数化;
- 兼容UnitTest和nose测试集;
- 能够支持简单的的那元测试和复杂的功能测试,还可应用到接口自动化测试种;
- 丰富的插件生态,具有很多第三方插件,并且可以自定义扩展,如pytest-Selenium(集成Selenium)等;
- 支持重复执行失败的case等;
- 方便和持续集成工具Jenkins集成。
二、Pytest案例实战
1、Pytest基础案例
通过PyCharm在工程目录下创建pytestDemo的python package,Pytest的案例均存在pytestDemo下。
Pytest测试用例编写非常简单,Pytest可以在不同的函数、包中编写用例,但Pytest有如下约束:
- 文件名以test_(如test_*.py)开头或以_test(如*_test.py)结尾的py文件;
- 以test_开头的函数或test_开头的方法;
- 以Test开头的类,并且不能带有init方法;
- 要注意的是所有的包必须要有init.py文件(在PyCharm中会自动生成)。
(1)创建基础待测方法
在pytestDemo下新建test_demo.py文件,代码如下:
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
(2)运行测试方法
通过cmd进入test_demo.py所在的文件夹下,然后执行pytest命令,结果如下:
对test_demo.py文件代码进行改动,将实际值和期望值改成不一致,代码如下:
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 6
通过cmd命令进入test_demo.py所在的文件夹下,然后执行pytest命令,结果如下:
2、测试用例存放在类中
可将测试用例放在测试类中,通过执行测试类执行类中的测试用例。
(1)优化测试代码
将test_demo.py代码进行优化,代码如下:
def add(a, b):
return a + b
def minus(a, b):
return a - b
class TestClass:
def test_add(self):
assert add(2, 3) == 5
def test_minus(self):
assert minus(3, 2) ==2
(2)运行优化后的测试方法
通过cmd命令进入test_demo.py所在的文件夹中,然后执行pytest命令,结果如下:
三、测试用例的运行控制
Pytest提供了以下3中运行方式执行测试用例:
- pytest(一般采用该方式);
- pytest *_test.py 或 test_*.py;
- python-m pytest.
在pytestDemo目录下,新创建一个Demo_test.py文件,代码如下:
# 乘法,返回a*b的值
def multi(a, b):
return a * b
# 除法,返回a/b的值
def dividi(a, b):
return a/b
class TestClass:
def test_multi(self):
assert multi(3, 3) == 6
def test_dividi(self):
assert dividi(3, 2) == 4
1、方式1:pytest
命令格式为"pytest文件名/"或进入pytestDemo目录下,运行pytest,执行某个目录下所有的用例,结果如下。可以看到,Demo_test.py与test_demo.py两个测试文件均被执行。
2、方式2:pytest test_*.py
执行某个.py文件下的测试用例,命令格式为“pytest脚本名称.py”。通过cmd命令进入Demo_test.py所在的文件下,操作步骤及运行结果如下:
可以看到,程序仅仅运行了Demo_test.py文件,而test_demo.py文件并未运行。
3、方式3:python -m pytest
通过python -m pytest运行当前目录下的所有测试用例文件。
4、节点运行
通过节点运行方式可运行某个.py文件(模块)里某个函数或方法,如仅仅运行Demo_test.py文件中的test_multi方法,且不运行demo_test.py中的test_dividi方法。
命令pytest Demo_test.py::TestClass::test_multi运行后,在结果中可以看到仅仅运行了test_multi方法。
5、遇到错误停止测试
当Demo_test.py文件运行时,test_multi与test_dividi两个方法运行断言均会执行失败。通过命令pytest -x Demo_test.py执行时,遇到第一个方法或函数执行无法通过(test_multi运行后即停止运行),后面的方法或函数(test_dividi)将不被执行。
四、在编译器中配置Pytest
python默认自带的单元测试框架时UnitTest,因此在PyCharm编译器中默认的单元测试框架一般是UnitTest。如果像修改当前工程的单元测试框架,可通过修改PyCharm默认的test runner来指定的单元测试框架。
在PyCharm中一次选择File——>Settings——>Tools——>PyCharm Integrated Tools——>Default test runner——>pytest命令,将党员测试矿建指定为pytest。如图: