Как мне протестировать сайт веб-форм?

26

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

Если это невозможно, существует ли действительная автоматизированная альтернатива?

Том Сквайрс
источник
2
Если вы хотите автоматизировать тестирование пользовательского интерфейса, вам понадобится что-то вроде Selenium. Но если вы хотите автоматизировать модульное тестирование , то вам не нужен Selenium. Вам просто нужны правильные шаблоны на месте. Смотри мой ответ.
Мэтью Родатус

Ответы:

22

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

Есть два распространенных способа сделать это.

Простой способ - переосмыслить все ваши обработчики событий с точки зрения «Какую информацию система предоставляет мне? Какую информацию мне нужно заполнить на странице?» а затем предоставить класс обслуживания, который выполняет это преобразование.

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

Более сложным, но более эффективным способом является использование шаблона Presenter Model Viewer . Когда мы попробовали это, мы обнаружили, что докладчики быстро стали тесно связаны с платформой, и чем больше мы разрабатывали MVP, тем яснее становилось то, что MVP действительно хотел быть MVC, но не мог.

Тем не менее, другие сделали это очень успешно - даже есть платформа webformsmvp, доступная для снятия тяжестей - поэтому ваш пробег может варьироваться.

прецизионный самописец
источник
1
@jmoreno: Хороший улов! Я забыл, что WebForms и MVP существуют даже за последние 5 лет.
pdr
16

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

  • модульное тестирование отдельных компонентов страницы (любые методы, которые выполняют актуальную логику)
  • компоненты модульного теста, используемые страницей (пользовательские элементы управления, базовая бизнес-логика и т. д.)
  • автоматическое тестирование функциональности (путем удаленного управления браузером или отправки HTTP-запросов через что-то вроде cURL)
  • автоматическое тестирование на проникновение (есть инструменты, которые попытаются найти возможные точки внедрения и автоматически выполнить безобидные, но обнаруживаемые атаки на вашу страницу)
  • нагрузочное тестирование
  • проверка компоновки по списку пунктов юзабилити и стиля дома (хотя это очень сложно автоматизировать; обычно более целесообразно просто делать это время от времени)
tdammers
источник
-1 Извините, но нагрузочное тестирование, тестирование на проникновение и проверку макета не имеют ничего общего с модульным тестированием
Том Сквайр
2
@ TomSquires: конечно, нет, и если вы внимательно прочитаете мой ответ, вы заметите, что я никогда не говорил, что это так. Но вопрос, кажется, путает понятия модульных тестов и автоматического тестирования в целом, поэтому я перечислил различные значимые автоматические тесты, которые вы можете бросить в веб-форму.
tdammers
согласитесь, тестирование веб-страницы, скорее всего, будет какой-то формой интеграционного тестирования, а не модульным тестом по строгим определениям, хотя все равно хорошо автоматизировать все, что вы можете
jk.
6
@TomSquires: совершенно неоправданное снижение. Ваш собственный вопрос начинается с тестирования всего сайта, который не имеет ничего общего с модульным тестированием. Tdammers определили различные способы тестирования целого и частей и определили, где подходит юнит-тестирование. +1
ажеглов
3
Справедливо. Я забираю это назад
Том Сквайрс
9

Прошу прощения за то, что пропустил "единичную" часть вопроса ...

SeleniumHQ - ваш друг для тестов с внешнего интерфейса. Это не модульное тестирование, скорее тестирование черного ящика. Вам все еще нужно подумать о допустимых тестовых случаях ...

WarrenFaith
источник
1
+1 Ваш ответ появился, когда я нажимал «опубликовать свой ответ», чтобы сказать точно то же самое.
Яннис
2
Кроме того, поскольку op спрашивает о модульном тестировании, давайте просто добавим, что на самом деле речь идет о функциональном тестировании , которое более уместно (разумно, выполнимо) при тестировании элементов пользовательского ввода.
Яннис
+1, потому что я продолжаю использовать его, но так и не нашел. Кто-нибудь использовал это, это хорошо и стоит реализовать?
НимЧимпский
6
Selenium - фантастический инструмент, но он не имеет ничего общего с модульным тестированием.
фунтовые
Правда, кажется, я пропустил эту информацию в вопросе: /
WarrenFaith
6

Если говорить по опыту: только если все сделано правильно. Под «правильным» я подразумеваю минимальное выделение кода и что-то вроде вышеупомянутого Model-View-Presenter, чтобы сделать веб-форму «глупой». Это обычно оказывается очень сложным в приложениях для «коричневых полей», потому что они не были разработаны с учетом этого, и это почти что геркулесовская попытка реорганизовать / переписать страницы, чтобы использовать их.

Уэйн Молина
источник
1

WatiN

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

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

http://watin.org/ - еще один инструмент для веб-тестирования, но для C # / .NET. Вы пишете тесты как модульные тесты:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

В настоящее время он основан на IE, но имеет некоторую экспериментальную поддержку Firefox и Chrome. Вы можете в значительной степени автоматизировать все, что вы будете делать в ручных тестах, включая взаимодействие с Javascript.

Крис С
источник
Похоже, это 2016 год. Сегодняшнее посещение сайта WatiN указывает на то, что WatiN, возможно, мертв. Документы редки, не обновлены, а видео не воспроизводятся. Я не жалуюсь - я очень благодарен за добровольные инструменты с открытым исходным кодом - этот комментарий, чтобы помочь другим недавно прибывшим людям как я. Ответ хороший, просто указав на то, что для начала работы может потребоваться самостоятельное практическое обучение.
qxotk
1
Дополнительная помощь для тех, кто думает о пути WatiN, подтверждение того, что он находится в застойном состоянии + где искать в настоящее время здесь: stackoverflow.com/questions/118531/…
qxotk
0

Вы не можете провести модульное тестирование веб-сайта просто потому, что веб-запросы происходят по проводам (или через стек TCP). Таким образом, тесты не соответствуют определению «модульный тест», они, скорее всего, будут сквозными тестами.

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

Что еще более интересно, меня немного беспокоит, зачем вам вообще нужно тестировать веб-формы. Разве вы не вкладываете слишком много логики в код, и у вас случайно нет анемичной бизнес-логики?

Sklivvz
источник
-1

жасмин

За последние 5 лет Жасмин превратилась в ключевой инструмент для тестирования модульного интерфейса. Он часто включается в автоматическое тестирование сборки с Node и npm

По https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine - это тестовая среда с открытым исходным кодом для JavaScript. [2] Он нацелен на запуск на любой платформе с поддержкой JavaScript, чтобы не мешать ни приложению, ни среде IDE, и иметь легкий для чтения синтаксис. На него сильно влияют другие платформы модульного тестирования, такие как ScrewUnit, JSSpec, JSpec и RSpec. [3]

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

Майкл Даррант
источник
Хотя javascript используется в веб-формах, он не является основным методом обновления пользовательского интерфейса
Том Сквайр
Правда. Однако альтернатива ...? Вот почему, хотя и не предназначенная для этой цели, Жасмин работает очень хорошо. Плюс синтаксис почти идентичен RSpec, который любят программисты на Ruby.
Майкл Даррант
-2

ASP.NET

При разработке сайта ASP.NET мы смогли запустить модульные тесты на:

  • Домен
  • BL контроллеры / ведущие
  • код позади страниц веб-форм

Все это возможно для TDD, в зависимости от вашей архитектуры. Единственное, что вы не можете выполнить модульное тестирование - это расположение файла разметки.

Keiths
источник
3
Этот ответ говорит «да, это возможно» на вопрос «как». Не совсем полезно.
RubberDuck