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 ================================================================== 

第一个参数可以如下:

  1. 比较表达式
# 等于
assert 10 == 5  # False

# 不等于
assert 10 != 5  # True

# 大于
assert 10 > 5   # True

# 小于
assert 10 < 5   # False

# 大于等于
assert 10 >= 5  # True

# 小于等于
assert 10 <= 5  # False
  1. 逻辑表达式
# 逻辑与
assert (10 > 5) and (5 < 10)  # True

# 逻辑或
assert (10 > 5) or (5 > 10)   # True

# 逻辑非
assert not (10 > 5)           # False
  1. 成员表达式
# in 操作符
assert 5 in [1, 2, 3, 4, 5]  # True

# not in 操作符
assert 6 not in [1, 2, 3, 4, 5]  # True
  1. 身份表达式
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 是不同的对象
  1. 布尔值的隐式转换
# 空列表、空字符串、零等会被视为 False,而非空列表、非空字符串、非零等会被视为 True

# 空列表
assert []  # False

# 非空列表
assert [1, 2, 3]  # True

# 空字符串
assert ""  # False

# 非空字符串
assert "Hello"  # True

# 零
assert 0  # False

# 非零
assert 10  # True
  1. 布尔值
# 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 为例:

  1. 终端中运行 C:\PythonTest\test\test_mod.py 中所有测试用例:
pytest -v C:\PythonTest\test\test_mod.py
  1. 终端中运行 C:\PythonTest\test\test_mod.py 中的 test_list_fail 测试用例:
pytest -v C:\PythonTest\test\test_mod.py::test_list_fail
  1. 在终端中运行 C:\PythonTest\test\test_mod.py 中的 TestAdd 测试用例组:
pytest -v C:\PythonTest\test\test_mod.py::TestClassOne
  1. 在终端中运行 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