Какова лучшая стратегия тестирования BDD, основанная на данных - PullRequest
5 голосов
/ 12 мая 2011

Каковы некоторые стратегии написания тестов BDD, которые могут тестировать поведение, основанное на определенных данных в системе?

Например, скажем, я работал со следующим сценарием:

Feature: Search for friend
    In order to find a friend
    As a user
    I want to search my list of friends
    And filter by 'first name'

Как этот тест мог быть успешным, если / пока в систему не были введены некоторые "фиктивные" друзья?

Более конкретно, какие "фиктивные" критерии будет использовать тест?


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

Но что если я перенесу свой код в новую среду с новой базой данных?


Или я должен написать код для ручной вставки фиктивных данных в систему перед выполнением каждого теста?

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


Или я бы создал другие сценарии / тесты, в которых данные создаются с использованием интерфейса программы?

Например, «Добавление: добавление нового друга в мой список». Затем я мог бы запустить этот тест, чтобы добавить пользователя с именем «Люси», а затем запустить тесты «Поиск друга» для поиска «Люси», который теперь будет существовать в базе данных.

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


Какая стратегия лучшая? Или есть лучший способ?

Ответы [ 2 ]

5 голосов
/ 12 мая 2011

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

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

Background:
  Given I have the following friends:
    | andy smith   |
    | andy jones   |
    | andrew brown |

Чтобы добавить этидрузья, вы можете вставить записи непосредственно в базу данных:

def add_friend(name)
  Friend.create!(:name => name)
end

или автоматизировать пользовательский интерфейс, например:

def add_friend(name)
  visit '/friends/new'
  fill_in 'Name', :with => name
  click_button 'Add'
end

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

Scenario: Searching for a existing person by first name
  When I search for 'andy'
  Then I should see the friends:
    | andy smith |
    | andy jones |
  But I should not see "andrew brown"

Scenario: Searching for a non-existing person by first name
  When I search for 'peter'
  Then I should not see any friends

Вы правы, что тесты должны быть независимыми, поэтому не следует полагаться на другие сценарии, чтобы оставить базу данных в определенном состоянии.Вам, вероятно, понадобится какой-то механизм для очистки после каждого теста.Например, драгоценный камень «очиститель базы данных», если вы используете Cucumber и Rails.

2 голосов
/ 12 мая 2011

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

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

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