Альтернативы использованию задержек при автоматическом тестировании веб-интерфейса AJAX

Я скоро буду работать на веб-страницах, управляемых AJAX, которые содержат много контента, созданного с помощью веб-службы (WCF).

Я тестировал подобные вещи в прошлом (и нашел это легко), но не с этим уровнем динамического контента.

Я развиваюсь в .NET 3.5 с помощью Visual Studio 2008. Я рассматриваю это тестирование в:

  • TestDriven.NET
  • MBUnit (это не тестирование Unit)
  • Какой-то инструмент автоматизации для (возможно, Selenium, хотя это может быть SWEA или Watin. Я думаю, IE, Firefox и, вероятно, Opera и Safari.)

В прошлом я использовал задержки при тестировании браузера. Мне не очень нравится это делать, и он тратит время.

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


Примечания 1. Более подробно после рассмотрения первых 3 ответов.

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

2) Еще одна деталь, я использую jQuery для запуска Ajax, поэтому он не построен в Asp.NET AJAX.

3) Я нашел статью, которая хорошо иллюстрирует ситуацию. Это от http://adamesterline.com/2007/04/23/watin-watir-and-selenium-reviewed/

3.1) Селен Пример (этот и следующий пример кода WatiN не отображаются на исходной веб-странице (в IE или Firefox), поэтому я их извлек и перечислил здесь.)

public void MinAndMaxPriceRestoredWhenOpenedAfterUsingBackButton(){
  OpenBrowserTo("welcome/index.rails");
  bot.Click("priceDT");
  WaitForText("Price Range");
  WaitForText("515 N. County Road");
  bot.Select("MaxDropDownList", "$5,000,000");
  WaitForText("Prewar 8 Off Fifth Avenue");
  bot.Select("MinDropDownList", "$2,000,000");
  WaitForText("of 86");
  bot.Click("link=Prewar 8 Off Fifth Avenue");
  WaitForText("Rarely available triple mint restoration");
  bot.GoBack();
  Thread.Sleep(20000);
  bot.Click("priceDT");
  WaitForText("Price Range");
  Assert.AreEqual("$5,000,000", bot.GetSelectedLabel("MaxDropDownList"));
  Assert.AreEqual("$2,000,000", bot.GetSelectedLabel("MinDropDownList"));}

3.2) WatiN образец

public void MinAndMaxPriceRestoredWhenOpenAfterUsingBackButton(){
  OpenBrowserTo("welcome/index.rails");
  ClickLink("Price");
  SelectMaxPrice("$5,000,000");
  SelectMinPrice("$2,000,000");
  ClickLink("Prewar 8 Off Fifth Avenue");
  GoBack();
  ClickLink("Price");
  Assert.AreEqual("$5,000,000", SelectedMaxPrice());
  Assert.AreEqual("$2,000,000", SelectedMinPrice());}

3.3) Если вы посмотрите на эти, по-видимому, эквивалентные образцы, вы увидите, что образец WatiN имеет отвлеченную ожидания.

3.4) Однако может быть, что WatiN нуждается в дополнительной поддержке для значений, измененных вызовами Ajax, как указано в http://watinandmore.blogspot.com/2008/01/using-watin-to-test-select-lists-in.html. В этой статье на странице дается дополнительное поле, которое может быть использовано для синтеза измененного события, например:

// Wait until the value of the watintoken attribute is changed
ie.SelectList("countries").WaitUntil(!Find.By("watintoken",watintoken));

4) Теперь то, что мне нужно, - это способ сделать что-то как то, что мы видим в коде WatiN без этого синтезированного события. Это может быть способ напрямую подключаться к событиям, например, к изменениям событий. У меня не было бы проблем с обратными вызовами, хотя это могло бы изменить способ кодирования тестов. Я также думаю, что мы увидим альтернативные способы написания тестов, поскольку последствия новых функций в С# 3, VB 9 и F # начнут погружаться (и не будут возражать против этого).

5) marxidad, у моего источника не было образца из WebAii, поэтому у меня нет комментариев по этому интересному, инструменту.


Примечания 2. 2008-09-29. После некоторой обратной связи, не зависящей от этой страницы.

5) Я попытался получить более полный источник для приведенного выше кода WatiN. К сожалению, он больше не доступен, ссылка мертва. При этом я заметил разговор о DSL, предположительно модели, которая отображает между веб-страницей и инструментом автоматизации. Я не нашел никаких подробностей об этом.

6) Для WebAii был предложен код, подобный этому (он не тестировался):

public void MinAndMaxPriceRestoredWhenOpenAfterUsingBackButton(){
  ActiveBrowser.NavigateTo("welcome/index.rails"); 
  Find.ByContent<HtmlAnchor>("Price").Click();
  HtmlSelect maxPrice = Find.ById<HtmlSelect>("MaxDropDownList"); 
  HtmlSelect minPrice = Find.ById<HtmlSelect>("MinDropDownList");
  maxPrice.SelectByText("$5,000,000"); 
  minPrice.SelectByText("$2,000,000");
  Find.ByContent<HtmlAnchor>("Prewar 8 Off Fifth Avenue").Click(); 
  ActiveBrowser.GoBack();
  Find.ByContent<HtmlAnchor>("Price").Click(); 
  maxPrice.AssertSelect().SelectedText("$5,000,000"); 
  minPrice.AssertSelect().SelectedText("$2,000,000");}

6) Из кода я могу четко избегать ожиданий и задержек с некоторыми из фреймворков, но мне нужно будет потратить больше времени, чтобы увидеть, подходит ли WatiN для меня.

Ответ 1

В большинстве инфраструктур автоматизации встроены встроенные функции синхронизации. Selenium не является исключением и включает в себя такие функции, как waitForText, waitForElementPresent и т.д.

Я только понял, что вы упомянули "ждет" выше, что я интерпретировал как "Спящие" (которые не очень хороши в автоматизации). Дайте мне знать, если я неверно истолковал, и я могу больше рассказать о функциях ожидания или альтернативах.

Ответ 2

WebAii имеет метод WaitForElement (s), который позволяет указать параметры элементов для подождите.