Возобновить предыдущий пример в параметре pytest - PullRequest
0 голосов
/ 03 ноября 2018

Рассмотрим параметризованный 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, которая может помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...