Разделы портала

Онлайн-тренинги

.
Обзор Lightweight Test Automation Framework
12.12.2009 00:42

Автор: Сычев Игорь

Оригинальная публикация

В продолжение своего изучения инструментов тестирования для .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 в дополнение к уже существующим инструментам тестирования.

Хочется пожелать удачи команде разработчиков. Инструмент оставил в целом очень приятные ощущение после работы с ним.

Обсудить в форуме