2012-06-22 2 views
4

У меня есть функция «Импорт статей с внешнего сайта». В моем первом сценарии я тестирую импорт списка ссылок с внешнего веб-сайта.Как поделиться состоянием между сценариями с использованием огурца

Feature: Importing articles from external website 
    Scenario: Searching articles on example.com and return the links 
    Given there is an Importer 
    And its URL is "http://example.com" 
    When we search for "demo" 
    Then the Importer should return 25 links 
    And one of the links should be "http://example.com/demo.html" 

В моих шагов у меня есть 25 ссылок в @result массиве.

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

Теперь, очевидно, я не хочу идти на внешний сайт каждый раз, особенно сейчас, когда проходит первый сценарий.

Как это сделать, чтобы я мог проводить тестирование без запроса HTTP-запроса для первого сценария? Или я должен запустить его один раз и сохранить массив @result по остальным сценариям, чтобы я мог продолжать работать с фактическим набором результатов?

ответ

8

Это намеренно очень сложно сделать! Состояние совместного использования между тестами - это, как правило, очень плохая вещь, не в последнюю очередь потому, что она заставляет ваши тесты работать последовательно (ваш первый сценарий ДОЛЖЕН запускаться до последующих, а не то, что Огурец поддерживает явно).

Мое предложение было бы пересмотреть свою стратегию тестирования. Нахождение внешних сервисов в тестах - отличный способ заставить их работать медленно и быть ненадежными (что происходит, когда внешняя служба отключается?). В этом случае я бы предложил использовать что-то вроде webmock или vcr, чтобы создать фальшивую версию внешнего сайта, которая возвращает тот же ответ, что и на реальном сайте, но вы можете ударить столько раз, сколько хотите, без беспокоиться о производительности или недоступности.

2

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

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

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

Scenario: Query external system 
    # These two lines setup expected data in a mocked version of the external system 
    Given there the system x contains an article named "y" 
    And the article contains the text "Lorep ipsum" 
    When I query for article "y" 
    Then I should see the text "Lorem ipsum" 

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

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

Может потребоваться некоторое время, чтобы получить правильную фреймворк, но в конце концов, это того стоит.

3

я обнаружил, что это технически возможно использовать

@@ global_variable на этапе определения разделять глобальное состояние.

Однако, как и другие люди, это может быть не очень хорошая идея.

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

0

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

я произвожу пользователь:

@randomName = [*('a'..'z')].sample(8).join 

Затем я сохранить пользователь в файл:

File.open("randomName.txt", 'w') {|f| f.write("#{@randomName}") } 

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

@randomName = data = File.read("randomName.txt") 
0

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

некоторые решения 1) Огурцы обеспечивают Фон тег для выполнения предварительных условий для каждого сценария.

2) Огурцы обеспечивают крючки @ Перед и после, которые могут быть настроены для каждого сценария.

Смежные вопросы