Рассмотрим параметризованный pytest
тест, который повторно использует тот же комплекс
Пример несколько раз. Чтобы сделать пример кода максимально простым,
Я смоделировал «сложные» примеры с очень длинными целыми числами.
from operator import add
from pytest import mark
parm = mark.parametrize
@parm(' left, right, result',
((9127384955, 1, 9127384956),
(9127384955, 2, 9127384957),
(9127384955, 3, 9127384958),
(9127384955, 4, 9127384959),
(4729336234, 1, 4729336235),
(4729336234, 2, 4729336236),
(4729336234, 3, 4729336237),
(4729336234, 4, 4729336238),
))
def test_one(left, right, result):
assert add(left, right) == result
Первые четыре (и следующие четыре) примера используют точно такое же значение для left
, но:
Я хотел бы прояснить, что точно такой же
пример используется повторно и избавляет себя от необходимости повторять один и тот же пример много раз. (Конечно, я мог бы связать пример с глобальной переменной и использовать эту переменную, но эта переменная должна была бы быть связана в некоторой отдаленной точке за пределами моей коллекции примеров, и я хочу видеть фактический пример в контексте в который используется (то есть рядом с другими значениями, используемыми в этом конкретном наборе), а не искать его где-либо еще.
Вот реализация, которая позволяет мне сделать это явно, используя синтаксис, который я считаю вполне приемлемым, но сама реализация ужасна: она использует глобальную переменную и не имеет шансов работать с выполнением распределенного теста.
class idem: pass
@parm(' left, right, result',
((9127384955, 1, 9127384956),
( idem , 2, 9127384957),
( idem , 3, 9127384958),
( idem , 4, 9127384959),
(4729336234, 1, 4729336235),
( idem , 2, 4729336236),
( idem , 3, 4729336237),
( idem , 4, 4729336238),
))
def test_two(left, right, result):
global previous_left
if left is idem: left = previous_left
else : previous_left = left
assert add(left, right) == result
Как эта идея может быть реализована более надежным способом? Есть ли какая-то особенность, встроенная в pytest, которая может помочь?