
pytest 的设计思想,围绕测试用例的发现、执行、管理和报告展开,其灵活性和可扩展性也主要服务于测试用例的高效编写和维护。
安装 pytest
pip install -U pytest
测试用例
测试用例通常是一个以 test_ 开头的普通 Python 函数(也可以是类中的方法)。pytest 会自动发现并执行这些函数。测试用例所在的模块名也需要以 test_ 开头。
# 示例:一个简单的测试用例
def test_addition():
assert 1 + 1 == 2
def test_string():
assert "hello".upper() == "HELLO"
断言
pytest 使用 Python 原生的 assert 语句进行断言。
# test_mod.py
list_list = 'hello!'
def test_list_fail():
assert 'hello1!' == list_list, "两个值不同"
def test_list_pass():
assert 'hello!' == list_list, "两个值不同"
assert 后接两个参数。第一个参数用于判断,第二个参数是字符串(自定义信息),用于描述问题。
判断为 True(真),该测试用例继续进行直至结束;判断为 False(假) ,测试失败, pytest 停止执行该测试用例、报告错误并打印第二个参数。
运行结果如下:
===================================================================== test session starts ======================================================================
collected 2 items
Test/test_mod1.py::test_list_fail FAILED [ 50%]
Test/test_mod1.py::test_list_pass PASSED [100%]
=========================================================================== FAILURES ===========================================================================
________________________________________________________________________ test_list_fail ________________________________________________________________________
def test_list_fail():
> assert 'hello1!' == list_list, "两个值不同"
E AssertionError: 两个值不同
E assert 'hello1!' == 'hello!'
E
E - hello!
E + hello1!
E ? +
Test\test_mod1.py:7: AssertionError
=================================================================== short test summary info ====================================================================
FAILED Test/test_mod1.py::test_list_fail - AssertionError: 两个值不同
================================================================= 1 failed, 1 passed in 0.07s ==================================================================
第一个参数可以如下:
- 比较表达式
# 等于
assert 10 == 5 # False
# 不等于
assert 10 != 5 # True
# 大于
assert 10 > 5 # True
# 小于
assert 10 < 5 # False
# 大于等于
assert 10 >= 5 # True
# 小于等于
assert 10 <= 5 # False
- 逻辑表达式
# 逻辑与
assert (10 > 5) and (5 < 10) # True
# 逻辑或
assert (10 > 5) or (5 > 10) # True
# 逻辑非
assert not (10 > 5) # False
- 成员表达式
# in 操作符
assert 5 in [1, 2, 3, 4, 5] # True
# not in 操作符
assert 6 not in [1, 2, 3, 4, 5] # True
- 身份表达式
a = [1, 2, 3]
b = [1, 2, 3]
c = a
# is 操作符
assert a is c # True,因为 a 和 c 引用同一个对象
# is not 操作符
assert a is not b # True,因为 a 和 b 是不同的对象
- 布尔值的隐式转换
# 空列表、空字符串、零等会被视为 False,而非空列表、非空字符串、非零等会被视为 True
# 空列表
assert [] # False
# 非空列表
assert [1, 2, 3] # True
# 空字符串
assert "" # False
# 非空字符串
assert "Hello" # True
# 零
assert 0 # False
# 非零
assert 10 # True
- 布尔值
# True
assert True
# False
assert False
测试用例中,可以有多个断言,任意断言失败,不再执行该测试用例,判定失败:
def test_case1():
assert True, "成功"
assert True, "成功"
assert True, "成功"
def test_case2():
assert True, "成功"
assert False, "失败"
assert True, "成功"
运行结果:
===================================================================== test session starts ======================================================================
collected 2 items
Test/test_mod1.py::test_case1 PASSED [ 50%]
Test/test_mod1.py::test_case2 FAILED [100%]
=========================================================================== FAILURES ===========================================================================
__________________________________________________________________________ test_case2 __________________________________________________________________________
def test_case2():
assert True, "成功"
> assert False, "失败"
E AssertionError: 失败
E assert False
Test\test_mod1.py:9: AssertionError
=================================================================== short test summary info ====================================================================
FAILED Test/test_mod1.py::test_case2 - AssertionError: 失败
================================================================= 1 failed, 1 passed in 0.07s ==================================================================
测试用例组
pytest 框架里有测试组概念,用类(class)表达,可以在类里编写某个功能的所有测试用例。
# C:\PythonTest\Test\test_mod.py
class TestCaseGroup:
@staticmethod
def test_case1():
x = "this"
assert "h" in x, "字符串中没有 h"
@staticmethod
def test_case2():
x = 1
y = 2
assert type(x) == type(y), "x 不等于 y"
运行结果:
===================================================================== test session starts ======================================================================
collected 2 items
Test/test_mod1.py::TestCaseGroup::test_case1 PASSED [ 50%]
Test/test_mod1.py::TestCaseGroup::test_case2 FAILED [100%]
=========================================================================== FAILURES ===========================================================================
___________________________________________________________________ TestCaseGroup.test_case2 ___________________________________________________________________
@staticmethod
def test_case2():
x = 1
y = 2
> assert type(x) != type(y), "x 不等于 y"
E AssertionError: x 不等于 y
E assert <class 'int'> != <class 'int'>
E + where <class 'int'> = type(1)
E + and <class 'int'> = type(2)
Test\test_mod1.py:13: AssertionError
=================================================================== short test summary info ====================================================================
FAILED Test/test_mod1.py::TestCaseGroup::test_case2 - AssertionError: x 不等于 y
================================================================= 1 failed, 1 passed in 0.07s ==================================================================
运行测试用例
编写测试用例后,可以在命令行中运行测试用例。以 Windows 为例:
- 终端中运行 C:\PythonTest\test\test_mod.py 中所有测试用例:
pytest -v C:\PythonTest\test\test_mod.py
- 终端中运行 C:\PythonTest\test\test_mod.py 中的 test_list_fail 测试用例:
pytest -v C:\PythonTest\test\test_mod.py::test_list_fail
- 在终端中运行 C:\PythonTest\test\test_mod.py 中的 TestAdd 测试用例组:
pytest -v C:\PythonTest\test\test_mod.py::TestClassOne
- 在终端中运行 C:\PythonTest\test\test_mod.py 中 TestAdd 中的 test_error 测试用例:
pytest -v C:\PythonTest\test\test_mod.py::TestClassOne::test_error
END

© 转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-ND 4.0