Как можно протестировать веб-приложение, особенно в отношении одновременного доступа? - PullRequest
2 голосов
/ 05 апреля 2011

Я работаю над веб-приложением, которое использует CGI.pm для реализации взаимодействия с пользователем. Теперь мне нравится проверять свои изменения, выполняя юнит-тесты. Это мои требования:

  1. Perlish way
  2. Небольшое усилие для реализации модульного теста, подтверждающего простой рабочий процесс . Мое веб-приложение состоит в основном из двух форм, отображающих и изменяющих содержимое базы данных плоских файлов.
  3. Разрешить тестирование одновременного доступа для нескольких пользователей. Это должно гарантировать, что, например, блокировка выполняется правильно. Я не заинтересован в измерении производительности.
  4. Интеграция с Ecplise ( EPIC )
  5. Читаемые и Разговорные Модульные тесты

На данный момент я нашел эти пакеты: CGI :: Test , Test :: HTTP , HTTP :: WebTest и Test :: WWW :: Mechanize .

  • CGI :: Test , поскольку проект выглядит довольно мертвым, последнее изменение в октябре 2003 года.
  • Test :: HTTP фокусируется на HTTP-соединении.
  • HTTP :: WebTest выполняет тесты из спецификаций тестов. Еще много пакетов, но последнее изменение в сентябре 2003 года.
  • Test :: WWW :: Mechanize всеобъемлющий и современный интерфейс. Поддерживается в течение некоторого времени несколькими людьми. Читаемые тесты, но швы, чтобы сосредоточиться на тестировании статических страниц (возможно, это не правильно, но только на основе количества методов). Заполнение формы возможно с использованием submit_form_ok, но нет примера, показывающего, что можно проверить возвращенную страницу. Тестирование одновременного доступа для меня тоже неочевидно.

Так что мое исследование привело бы к Test :: WWW :: Mechanize. Это будет правильный путь?

Заранее спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011

Test :: WWW :: Mechanize - это хороший путь.

Test :: WWW :: Mechanize является подклассом WWW :: Mechanize , а Test::WWW::Mechanize->new возвращает объект, который является подклассом LWP :: UserAgent . Так что вам очень поможет, если вы прочитаете и поймете документацию для этих библиотек. Например, документация WWW :: Mechanize объяснит вам, как отправить форму и получить ее содержимое.

Пример

Вот пример, который проверяет одновременный доступ 2 пользователей и показывает, как проверить результаты (адаптировано из учебника по тестированию Catalyst ):

my $ua1 = Test::WWW::Mechanize->new;  # user agent 1, Bud
my $ua2 = Test::WWW::Mechanize->new;  # user agent 2, Ace

# Log in as each user
$ua1->get_ok("http://localhost/login?username=Bud&password=xxx", "Login 'Bud'");
$ua2->get_ok("http://localhost/login?username=Ace&password=xxx", "Login 'Ace'");

# Go back to the login page and it should show that we are already logged in
$_->get_ok("http://localhost/login", "Return to '/login'") for $ua1, $ua2;
$_->title_is("Login", "Check for login page") for $ua1, $ua2;
$_->content_contains("Please Note: You are already logged in as ",
    "Check we ARE logged in" ) for $ua1, $ua2;

Краткое объяснение:

get_ok ($ url, $ msg):

Проверяет, можно ли получить $ url. $ msg отображается при сбое теста.

title_is ($ title, $ msg):

Проверяет содержимое тегов ... . $ msg отображается при сбое теста.

content_contains ($ content, $ msg):

Проверяет, соответствует ли регулярное выражение $ content чему-либо в теле html. $ msg отображается при сбое теста.

Еще о чем подумать

Возможно, вы захотите взглянуть на Test :: WWW :: Mechanize :: CGI . Это позволяет вам тестировать без запуска веб-сервера.

WWW :: Mechanize :: FAQ может быть полезным для вас, если вы ищете примеры.

3 голосов
/ 05 апреля 2011

Предлагаю разделить тестирование на две части:

  1. Интерфейс тестирования с Test :: WWW :: Mechanize. Test :: WWW :: Mechanize хорош как для статических, так и для динамических страниц, но его назначение - динамические страницы. После submit_form_ok вам нужно использовать такие методы, как content_contains, content_like и другие методы группы «CONTENT CHECKING». Кроме того, Test :: WWW :: Mechanize является подклассом WWW :: Mechanize, поэтому вы можете использовать любые методы WWW :: Mechanize, например «content».
  2. Тестирование параллельного доступа. Разделите эту часть вашей программы на отдельную библиотеку и протестируйте ее, используя Test :: More и fork.
...