Автор: Сычев Игорь
Оригинальная публикация
В продолжение своего изучения инструментов тестирования для .Net приложений, хочу рассказать о Lightweight Test Automation Framework (LTAF). LTAF — это фреймворк для регрессионного тестирования web приложений Asp.Net, с открытым исходным кодом, созданный QA Team. На русском языке я не нашел никаких материалов о нем, поэтому решил написать эту обзорную статью.
Текущий (ноябрьский) релиз LTAF можно скачать тут: aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=35501 Рассмотрим пример применения
Я хочу автоматизировать для некоторого сайта тест на авторизацию пользователя и перехода его между страницами сайта. В visual studio с помощью типа теста -«Web test» и ie можно понажимать на кнопки и ссылки, записать эти действия, сгенерировать из этого код, то он будет в виде запросов к web серверу:
WebTestRequest request1 = new WebTestRequest("http://microsoft.com/"); request1.ExpectedResponseUrl = "http://www.microsoft.com/en/us/default.aspx"; WebTestRequest request1Dependent1 = new WebTestRequest("http://www.microsoft.com/global/En/us/RichMedia/WindowPane_R2.xaml"); request1Dependent1.ThinkTime = 1; request1.DependentRequests.Add(request1Dependent1); * This source code was highlighted with Source Code Highlighter.
Это все очень интересно, но я хочу видеть саму страницу в момент тестирования, поэтому стандартные средства мне не подходят. В тоже время LDAF позволяет писать тесты, во время выполнения которых мы можем и выбирать и произвольно запускать любые сочетания тестов и видеть реакцию браузера наши тесты.
Окно состоит из 2 фреймов. Левое с списком тестов( сейчас вы видите список тестов из имеющихся в проекте). Мы можем выбирать нужные тесты из списка. После начала тестирования в нижнее окошко(можно перенаправить вывод не на экран а в файл для дальнейшего анализа) будет выводится лог происходящего с правым фреймов, в котором находится сами тестируемые страницы. Выглядит интересно, самое время узнать как всю эту красоту сделать самому. Для того, чтобы работать с LDAF, необходимо в проект с сами сайтов включить папку Test с 2мя страничками и dll
В App_Code хрянятся сами тесты, которые и запускаются. Вот так выглядят тесты из samples
using System; using Microsoft.Web.Testing.Light; namespace NexusLightTest { [WebTestClass] public class AlertTest { [WebTestMethod] public void Alert() { HtmlPage page = new HtmlPage(); page.Navigate("AlertPage.aspx"); page.Elements.Find("AlertButton").Click(new CommandParameters(WaitFor.None, PopupAction.AlertOK)); Assert.AreEqual("hi", page.Elements.Find("log").GetInnerText()); } [WebTestMethod] public void GetTextFromAlert() { HtmlPage page = new HtmlPage(); page.Navigate("AlertPage.aspx"); CommandParameters parameters = new CommandParameters(WaitFor.None, PopupAction.AlertOK); page.Elements.Find("AlertButton").Click(parameters); Assert.AreEqual("hi", parameters.PopupText); } }} * This source code was highlighted with Source Code Highlighter.
Выглядит все банально и просто, до тех пор пока не начинаешь писать сам что-ни будь. Вот мой первый проект, в котором я тренировался на макете сайта вуза(сам сайт писал не я, да и это лишь пару страниц без кода). За пару часов можно в общем виде понять как функционирует код фреймворка и написать маленький тестик, перехода между 2 страничками и заполнением форм.
using System; using System.Collections.Generic; using System.Web; using Microsoft.Web.Testing.Light; namespace LTAF.Code { [WebTestClass] public class Tests { [WebTestMethod] public void TestMarks() { HtmlPage page = new HtmlPage("http://localhost:1256/PagesMgupi/Anketa.aspx"); page.Elements.Find("ctl00_ContentPlaceHolder1_alg").SetText("5"); page.Elements.Find("ctl00_ContentPlaceHolder1_geo").SetText("5"); page.Elements.Find("ctl00_ContentPlaceHolder1_fiz").SetText("5"); page.Elements.Find("ctl00_ContentPlaceHolder1_Next").Click(WaitFor.Postback); Assert.StringContains(page.Elements.Find("ctl00_ContentPlaceHolder1_Login1_UserName").GetInnerText(), ""); } } [WebTestClass] public class TestsAnother { [WebTestMethod] public void TestCaf() { HtmlPage page = new HtmlPage("http://localhost:1256/PagesMgupi/Cafedras.aspx"); page.Elements.Find("ctl00_ContentPlaceHolder1_Login1_UserName").SetText("it4"); page.Elements.Find("ctl00_ContentPlaceHolder1_Login1_Password").SetText("P@ssw0rd"); page.Elements.Find("ctl00_ContentPlaceHolder1_Login1_LoginButton").Click(WaitFor.Postback); //не понятно почему, о значение ноль он там не обнаруживает Assert.IsTrue(page.Elements.Find("ctl00_ContentPlaceHolder1_alg").GetInnerText() == ""); } } } * This source code was highlighted with Source Code Highlighter.
Код примера находится dump.ru/file/3919655 Конечно было бы удобнее, если можно было бы записывать щелчки мыши и клавиатурный ввод, а не сидеть кодить и искать названия и идентификаторы, но надеюсь, это появится в следующих версиях. DOM модель
У LDAF есть очень большое преимущество перед стандартными средствами visual studio или watin framework - умение работать с dom моделью страницы. Довольно просто работать со всеми элементами разметки html. В качестве примера приведу слегка изменённый пример из блога QA Team Приложение загружает страницу, находит в нем таблицу и в оригинале выбирает все новые посты из форума (я немного модифицировал пример, но честно говоря это не принципиально.) Приложение загружает страницу, находит в нем таблицу и в оригинале выбирает все новые посты из форума (я немного немного модифицировал пример, но честно говоря это не принципиально.)
using System; using System.Net; using System.IO; using Microsoft.Web.Testing.Light; using System.Text.RegularExpressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //Создаем запрос по URL. WebRequest request = WebRequest.Create("http://forums.asp.net/1193.aspx"); // Получаем ответ HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream dataStream = response.GetResponseStream(); // Открываем поток использую StreamReader для упрощенного доступа. StreamReader reader = new StreamReader(dataStream); <font color="#008000 string responseFromServer = reader.ReadToEnd(); // Удаляем DOCTYPE иначе будет ошибка responseFromServer = Regex.Replace(responseFromServer, @"\<\!DOCTYPE.*?\>", String.Empty); // Загружаем ответ в HtmlElement HtmlElement rootElement = HtmlElement.Create(responseFromServer); //ищим все строки HtmlElementFindParams findParams = new HtmlElementFindParams(); findParams.TagName = "tr"; findParams.Attributes.Add("class", "CommonListRow"); foreach (HtmlElement tableRow in rootElement.ChildElements.FindAll(findParams)) { //Находим первую ссылку в строке HtmlAnchorElement link = (HtmlAnchorElement) tableRow.ChildElements.Find("a", 0); Console.WriteLine(String.Format("\"{0}\"",link.CachedInnerText)); //Выводим ссылки на консоль Console.WriteLine(String.Format("\thttp://forums.asp.net{0}\n",link.CachedAttributes.HRef)); } reader.Close(); dataStream.Close(); response.Close(); } } } * This source code was highlighted with Source Code Highlighter.
Поддержка различных браузеров: Из описания проекта LDAF, его создателями — «This framework supports running tests in Microsoft Internet Explorer, Mozilla Firefox, Apple Safari, and Opera.»
В классе BrowserUtilityTest есть методы для: public void GetBrowserIE6() public void GetBrowserIE7() public void GetBrowserIE8() public void GetBrowserIEFutureVersion() public void GetBrowserFireFox1() public void GetBrowserFireFox2() public void GetBrowserFireFox3() public void GetBrowserFireFoxFutureVersion() а так же аналогичные для Chrome версии 2 public void GetBrowserChrome() а так же Safari и Opera 9-10.
Так что интересы любителй различных браузеров и возможность тестировать в них разработчиками были соблюдены. Личный опыт (ложка дегтя в бочке меда): Работа с html тегами куда удобнее чем самому парсить строку, но есть куча проблем по идентификации элементов. ведь в одном документе с одними и теми же стилями могут быть множество div, table, ссылок и прочих элементов и не всегда получается их легко определить. Но это уже издержки производства что называется. К сожалению не нашел способа запустить эти же тесты через стандартные средства visual studio и посмотреть какой код был при этом вызван. Ссылка на блог QA Team из которых я и черпал информацию weblogs.asp.net/asptest/ А так же блог из которого я узнал об этом frameworkе blog.codeville.net/2009/03/27/first-steps-with-lightweight-test-automation-framework/ P.S. Прочитав RoadMap проекта, узнал что замечательный инструмент в виде dll в версию .Net 4.0 включать не планируется, хотя было бы логично включить стандартный инструментарий Microsoft с помощью которых они тестируют web приложения в .Net 4.0 в дополнение к уже существующим инструментам тестирования. Хочется пожелать удачи команде разработчиков. Инструмент оставил в целом очень приятные ощущение после работы с ним.
|