pytest 是一个第三方单元测试框架,更加简单、灵活,而且提供了更加丰富的扩展,弥补了 unittest 在做 Web 自动化测试时的一些不足。
1. pytest 简单例子
pytest 支持 pip 安装,pip install pytest
创建 test_sample.py 文件,代码如下:
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
命令行窗口,进入到 test_sample.py 文件所在目录,直接输入 “pytest” 即可。运行结果如下:
从上看出,pytest 的优点是它更加简单,不必创建测试类,使用 assert 断言也更加简单。
不过,pytest 也有自己的规则,即测试文件和测试函数必须以“test”开头。所以运行时才不用指定文件。
如果要像 unittest 通过 main() 方法执行测试用例,需要修改下 test_sample.py 文件:
import pytest
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
if __name__ == '__main__':
pytest.main()
main()方法默认执行当前文件中所有以“test”开头的函数。这样就可以直接在 IDE 中运行测试了。
2. pytest 的基本使用方法
前面我们学习了 unittest 的基础,现在只需对比 pytest 与 unittest 之间的不同即可。
(1)断言
unittest 单元测试框架中提供了丰富的断言方法,而pytest 单元测试框架并没有提供专门的断言方法,而是直接使用 Python 的 assert 进行断言。
下面创建 test_assert.py 文件,介绍 pytest 断言的用法:(借助 Python 的运算符号和关键字即可轻松实现不同数据类型的断言。)
# 功能:用于计算 a 与 b 相加的和
def add(a, b):
return a + b
# 功能:用于判断素数
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
# 测试相等
def test_add1():
assert add(3, 4) == 7
# 测试不相等
def test_add2():
assert add(17, 22) != 50
# 测试大于或等于
def test_add3():
assert add(17, 22) <= 50
# 测试小于或等于
def test_add4():
assert add(17, 22) >= 38
# 测试包含
def test_in():
a = 'hello'
b = 'he'
assert b in a
# 测试不包含
def test_not_in():
a = 'hello'
b = 'hi'
assert b not in a
# 判断是否为 True
def test_true_1():
assert is_prime(13)
# 判断是否为 True
def test_true_2():
assert is_prime(7) is True
# 判断是否不为 True
def test_true_3():
assert not is_prime(4)
# 判断是否不为 True
def test_true_4():
assert is_prime(6) is not True
# 判断是否为 False
def test_false_1():
assert is_prime(8) is False
(2)Fixture
Fixture 通常用来对测试方法、测试函数、测试类和整个测试文件进行初始化或还原测试环境。
创建 test_fixtures_01.py 文件:
# 功能函数
def multiply(a, b):
return a * b
# =====Fixture========
def setup_module(module):
print("setup_module=====================>")
def teardown_module(module):
print("teardown_module==================>")
def setup_function(function):
print("setup_function-------->")
def teardown_function(function):
print("teardown_function----->")
def setup():
print("setup------>")
def<