我正在Pytest中编写一个测试套件。我有一个看起来像这样的灯具:
import pytest
@pytest.fixture(scope="session", params=["cpu", "gpu"])
def device(request):
return request.param
这是因为我希望我的代码在CPU和GPU上都能相同地工作。 (从技术上讲,这个事实与我的问题无关,但是我想举一个用例的实际例子。)表示设备无关代码的所有其他装置都依赖于device
,就像这样:
@pytest.fixture(scope="session")
def data(device):
return LoadData(path, device)
到目前为止,一切都很好。使用load_data
的任何测试都会被调用两次:
def test_data_is_loaded(data):
assert data.success
但这是我的问题:如果我想比较同一灯具的两个不同参数化的输出怎么办?
def test_devices_load_same_amount_of_data(data_cpu, data_gpu):
assert len(data_cpu) == len(data_gpu)
def test_gpu_is_faster_than_cpu(data_cpu, data_gpu):
cpu_start = time.time()
data_cpu.process()
cpu_duration = time.time() - cpu_start
gpu_start = time.time()
data_gpu.process()
gpu_duration = time.time() - gpu_start
assert gpu_duration < cpu_duration
我希望能够做类似的事情而无需将data
分成多个装置;我已经尝试过了,但是它使我的测试代码易于出错并且很难更改(因为有很多无用的重复)。
如果我必须写新的固定装置,挂钩或标记,也可以。它们只是出于减少代码重复而不是添加的目的。
如果有第三方插件可以做到这一点也没关系。