В Ruby, использующем Cucumber, я должен макетировать звонки в веб-сервис? - PullRequest
3 голосов
/ 28 мая 2010

All

Я использую Cucumber для приемочного тестирования утилиты командной строки Ruby. Эта утилита извлекает данные из веб-службы.

Я понимаю, что Cucumber предназначен для приемочного тестирования и тестирует весь стек, но мне все еще нужно предоставить согласованные ответы от веб-службы.

Должен ли я издеваться над веб-сервисом? Если да, то как? Какой лучший подход здесь?

Ура, Гордон

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

Итак, немного подумав! Потом немного погуглил я нашел FakeWeb . Делает именно то, что мне нужно!

Проверьте Слайды доктора Ника - особенно слайд 17.

И это было легко - менее чем за 2 часа мне удалось его настроить, переписать свои тесты, все пройти и проверить все обратно в git hub !!

HTH другие!

1 голос
/ 28 мая 2010

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

  • Насколько надежны веб-сервисы? Если они много не работают, время от времени ваши тесты будут проваливаться, и нет ничего более раздражающего, чем поиск причины провала теста только для осознания это было то время месяца снова.
  • Могут ли ваши веб-службы пройти тестирование? Если у вас есть несколько разработчиков, выполняющих эти тесты очень часто, и ваши веб-службы находятся на сервере компании-партнера, им может не понравиться тот факт, что вы тестируете против них.
  • Вы доверяете их выводу? Для меня самая большая причина не высмеивать зависимость - это если я не знаю, какие именно данные я собираюсь получить от службы. Если я пользуюсь услугами, которые хорошо документированы и легко понятны, я обычно не высмеиваю их, но если они не совсем ясны или часто меняются, я рекомендую проверить их.
  • Насколько сложно смоделировать зависимость? Замена зависимостей не всегда проста, особенно если впоследствии добавляется тестовый код. К счастью, в динамических языках это обычно намного проще, чем, скажем, на Java. Я бы все-таки подумал, сколько нужно работы, чтобы создать фиктивную службу, которая ответит на вопросы, которые вы действительно хотите.
  • Какую выгоду в скорости я получаю от мошенничества? Интеграционные тесты медленны, мошенничество с зависимостью от веб-службы сделает ваш тест более быстрым, насколько быстрее? Я не знаю, но это, вероятно, имеет значение.

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

0 голосов
/ 20 августа 2010

Макет веб-сервиса

Я бы написал оболочку для вызовов к веб-сервису в приложении.
Пример в псевдокоде

CallWebService (action, options,...) {
    // Code for connectiong to Webservice
}

Тогда вы просто высмеиваете эту функцию, просто как любую другую функцию

CallWebService (action, options,...) {
    return true;
}

Таким образом, вы можете издеваться над веб-сервисом, не беспокоясь о том, что он является веб-сервисом, подключением к базе данных или чем-то еще. И вы можете заставить его вернуть значение true или что-то еще.

Проверьте, как ваш код обрабатывает ответы от веб-службы

Чтобы продвинуть эту идею на шаг вперед и сделать ваши тесты еще более мощными, вы могли бы использовать какие-либо параметры тестирования или параметры среды для управления тем, что происходит в методе фиктивного веб-сервиса. Затем вы можете успешно проверить, как ваши коды обрабатывают различные ответы от веб-сервисов.
Опять в псевдокоде:

CallWebService (action, options,...) {
    if TEST_WEBSERVICE_PARAMETER == CORRUPT_XML
        return "<xml><</xmy>";
    else if TEST_WEBSERVICE_PARAMETER == TIME_OUT
        return wait(5000);
    else if TEST_WEBSERVICE_PARAMETER == EMPTY_XML
        return "";
    else if TEST_WEBSERVICE_PARAMETER == REALLY_LONG_XML_RESPONSE
        return generate_xml_response(1000000);
}

И соответствующие тесты:

should_raise_error_on_empty_xml_response_from_webservice() {
    TEST_WEBSERVICE_PARAMETER = EMPTY_XML;
    CallWebService(action, option, ...);
    assert_error_was_raised(EMPTY_RESPONSE_FROM_WEBSERVICE);
    assert_written_in_log(EMPTY_RESPONSE_LOG_MESSAGE);
}
...

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

Обратите внимание, что это копия ответа, который я сделал на подобные вопросы: Макет веб-сервиса для iPhone

Удачи

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