В Ruby, используя Cucumber, должен ли я издеваться над вызовами веб-сервиса?

Все,

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

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

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

Привет, Гордон


person Gordon McAllister    schedule 28.05.2010    source источник
comment
+1; Я в той же лодке, что и вы, за исключением того, что тестовые веб-службы не всегда работают, и я, конечно, не тестирую свой код на рабочих веб-службах.   -  person Pretzel    schedule 28.05.2010


Ответы (3)


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

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

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

ХТХ другие!

person Gordon McAllister    schedule 28.05.2010
comment
Отлично, что у вас получилось! Я определенно должен проверить FakeWeb. - person ponzao; 28.05.2010

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

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

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

person ponzao    schedule 28.05.2010
comment
Спасибо за руководство ponzao. Очень полезно для принятия решения, издеваться или нет. Но похоже, что кто-то уже сделал тяжелую работу за меня. См. мой собственный ответ о FakeWeb для деталей. - person Gordon McAllister; 28.05.2010

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

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

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

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

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

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

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

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

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);
}
...

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

Обратите внимание, что это копия ответа, который я дал на похожие вопросы: Mockup webservice for iPhone

Удачи

person Jonas Söderström    schedule 20.08.2010