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