前话

代码测试用于检验代码运行结果是否符合预期。优势一: 编写测试函数,更规范,高效的核对代码运行结果,当被测试对象进行了调整和重构的时候,可以节省大量人工排查问题的时间。优势二:编写测试代码可以对代码功能更具底气,可以拥有适合的测试覆盖度,避免隐藏的问题代码。

使用模块

pytest 长久保存测试代码,可多次重复使用,并支持扩展应用程序和库的复杂功能测试。

使用示例

简单函数测试

函数测试,先创建测试脚本,编写测试代码,如下:

# 当前文件名 test_assert1.py
# 被测试函数
def f():
    return 3

# 测试函数
def test_function():
    assert f() == 4   # 预期的测试结果

再从命令行运行测试脚本:
pytest test_assert1.py

使用类分组多个测试:

# content of test_class.py
class TestClass:
    def test_one(self):
        x = "this"
        assert "h" in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, "check")

配置已知参数的数据库或者数据集

@pytest.fixture 装饰器, 可以定义一些公用的数据集合,但后续不用再去调用即可直接使用,如下,my_fruit 函数没有再进行调用即可直接使用进行结果比较。

def fruit(name):
    return name

@pytest.fixture
def my_fruit():
    return "apple"

def test_fruit(my_fruit):
    assert my_fruit == fruit('apple')

为测试函数添加标记

@pytest.mark 装饰器可以轻松给测试函数添加自定义标记:

@pytest.mark.webtest
def test_send_http():
    pass  # perform some webtest test for your app

def test_something_quick():
    pass

class TestClass:
    def test_method(self):
        pass

只运行标记为 webtest 的测试函数:
pytest -v -m webtest

运行除 webtest 之外的所有测试函数:
pytest -v -m "not webtest"

只运行指定测试类/测试类下的某个测试函数:
pytest -v test_server.py::TestClass
pytest -v test_server.py::TestClass::test_method