Какова наилучшая практика для написания тестов / примеров RSpec?Напишите примеры для проверки положительного / положительного, отрицательного или того и другого? - PullRequest
3 голосов
/ 11 августа 2011

Совершенно новый для BDD и RSpec, и мне действительно любопытно, что люди обычно делают, когда пишут свои тесты / примеры RSpec, особенно когда это касается положительных и отрицательных тестов одного и того же.

Возьмите, например, проверку для имени пользователя и правило, что действительное имя пользователя содержит только буквенно-цифровые символы.

Положительный / положительный тест будет выглядеть примерно так:

it "should be valid if it contains alphanumeric characters"
  username = 'abc123'
  username.should be_valid
end

В то время как отрицательный тест будетбыть примерно таким:

it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid
end

Вы бы написали один тест, но не другой?Вы бы написали оба?Вы бы соединили их в одном тесте?Я видел примеры, когда люди делают что-то из вышеперечисленного, поэтому мне было интересно, есть ли лучшая практика и если да, то что это?

Пример написания положительного и отрицательного теста:

it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid

  username = 'abc123'
  username.should be_valid
end

Я видел примеры людей, делающих это таким образом, но я, честно говоря, не фанат такого подхода.Я склонен ошибаться в том, чтобы держать вещи в чистоте и отличаться с единственной целью, очень похоже на то, как мы должны писать методы, поэтому я с большей вероятностью напишу два отдельных теста, а не соединю их в один.Так есть ли лучшая практика, которая утверждает что-то в этом роде?Эти примеры должны проверять один элемент / поведение под одним углом, а не со всех углов.

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

Я нахожу в любой ситуации, подобной этой, это может помочь понять, что то, что вы делаете, на самом деле не тестирует.Вы предоставляете примеры того, как / почему использовать класс, и некоторые описания его поведения.Если вам нужно более одного примера для привязки ценного поведения, я думаю, что можно включить оба.

Так, например, если бы я описывал поведение списка, у меня было бы два примера для описания "Список должен сказать мне, если он пуст ".Ни пустой пример, ни полный пример сами по себе не являются ценными.

С другой стороны, если у вас есть ситуация по умолчанию, в которой что-то является допустимым, за которым следует ряд исключительных случаев, эта "допустимая" ситуациянезависимо цененПозже могут возникнуть другие ситуации, например:

  • должно быть недопустимым для не алфавитно-цифровых символов
  • должно быть недопустимым для уже занятых имен
  • должно быть недопустимымтолько для чисел
  • должно быть действительным для букв с акцентом

и т. д.

В этом случае ваше поведение имеет два примера по совпадению, а не потому, что они образуют двастороны ценного аспекта поведения.Действительное поведение само по себе ценно.Таким образом, у меня был бы один пример на тест в этом случае, но один аспект поведения на тест в целом.

Это может относиться и к другому, не булевому поведению.Например, если я пишу программное обеспечение для банкомата, я бы хотел предоставить как наличные, так и дебетовать счет.Ни одно поведение не является ценным без другого.

«Одно утверждение на тест» - хорошее правило.Я нахожу, что это может быть чрезмерно использовано, и иногда вместо этого есть случай «один аспект поведения на тест».Это не один из тех случаев, но я подумал, что стоит упомянуть в любом случае.

2 голосов
/ 11 августа 2011

В этом конкретном случае я бы написал их как для положительного, так и для отрицательного . Это потому, что вы действительно хотите убедиться, что людям с действительными именами пользователей разрешено иметь их, и что люди, которые пытаются иметь недопустимые имена пользователей, не могут этого сделать.

Кроме того, таким образом, если имя пользователя, которое должно / не должно быть действительным, идет вразрез с тем, что должно быть, у вас уже есть эти тесты, и просто добавить ошибочный тест в правильную категорию в ваши тесты, подтверждающие, что тест действительно не прошел, исправляя его, а затем подтверждая, что тест затем проходит.

Так что да, тест для обоих в этом случае. Не просто один или другой.

1 голос
/ 12 августа 2011

Этот шаблон обычно известен как «одно утверждение на тест»:

...