进行下面实验前,需要安装 python 和 pytest,我一般用 poetry 来管理,如何创建就是以下几个命令:
poetry init
poetry add pytest --group test
假设被测试对象就是一个计算加减乘除的一个服务,这里把一个方法就等同于一个 API 接口,实际上也确实没有
太大区别,一个是本地调用,一个是远程调用,远程调用需要一个客户端,本地调用直接就用这个类调用了
"""
service functions for calculation
"""
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
return a * 1.0 / b
使用如下方法就可以进行单独的方法测试,基本原则就是: 一个方法一个测试,测试数据都固定
import allure
import pytest
from app.module_a.service import subtract, add
@allure.feature("减法结果为正")
def test_subtract_positive():
result = subtract(2, 1)
assert result == 1
@allure.feature("减法结果为为负数")
def test_subtract_negative():
result = subtract(1, 2)
assert result == -1
如果遇到: 测试方法 B 但是需要先执行测试方法 A,这里面有一些小问题就是:
这个问题可以通过 pytest 的插件 pytest-order 来解决:
poetry add pytest-order
测试代码如下: 通过@pytest.mark.order定于显示的定于运行顺序,好处有两个:
context = {}
@pytest.mark.order(1)
def test_add_positive():
result = add(1, 2)
assert result == 3
context['USED_FOR_SUBTRACT'] = result
@allure.feature("被减数是加法函数计算出来的结果")
@pytest.mark.order(2)
def test_subtract_order():
result = subtract(1, context['USED_FOR_SUBTRACT'])
assert result == -2
如果使用 pytest-dependency 插件解决,代码也类似,就不多说明了:
context = {}
@pytest.mark.order(1)
@user8cy()
def test_add_positive():
result = add(1, 2)
assert result == 3
context['USED_FOR_SUBTRACT'] = result
@user9cy(depends=["test_add_positive"])
def test_subtract_dep():
result = subtract(1, context['USED_FOR_SUBTRACT'])
assert result == -2
这里面注意一点: 用来存数据的用字典会好那么一点,为了避免一些想不到的麻烦我自己就一直用字典了,也没有用 global 这样的东西。
fixed_params = [(1, 2, 3), (-1, 1, 0)]
@user10ize('a,b,expected', fixed_params)
def test_add_parameterized(a, b, expected):
actual = add(a, b)
assert actual == expected
def dynamic_cases():
d_params = [(1, 2, 3), (-1, 1, 0)]
dynamic_case = (1, add(1, 2), 4)
d_params.append(dynamic_case)
return d_params
@user11ize('a,b,expected', dynamic_cases())
def test_add_parameterized(a, b, expected):
actual = add(a, b)
assert actual == expected
有时可能更复杂,那么其实呢,我自己的做法就是: