Альтернативы использованию задержек при автоматическом тестировании веб-интерфейса AJAX - PullRequest
10 голосов
/ 26 сентября 2008

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

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

Я занимаюсь разработкой в ​​.NET 3.5 с использованием Visual Studio 2008. Я планирую провести это тестирование в:

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

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

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


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

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

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

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

3.1) Selenium Образец (Этот и следующий, 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 без этого синтезированного события . Это может быть способ напрямую подключаться к событиям, таким как измененные события. У меня также не будет проблем с обратными вызовами, хотя это может изменить способ кодирования тестов. Я также думаю, что мы увидим альтернативные способы написания тестов, так как последствия новых функций в C # 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.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2008

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

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

0 голосов
/ 26 сентября 2008

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

...