Testpyramiden

Testautomatisering gennem brugergrænsefladen (UI) er ofte meget langsomt og skrøbeligt. En lille ændring i systemet/applikationen kan meget nemt ødelægge disse test, og vedligeholdelsen bliver meget omfattende og dyr. Skrøbeligheden gør også, at tilliden til testresultaterne kan blive undermineret.

Testpyramiden argumenterer for at vi skal lave meget mere automatiseret test gennem unittest end gennem brugergrænsefladetest.

Testpyramiden - Mike Cohn

Testpyramiden – Mike Cohn

Det var Mike Cohn, der “opfandt” testpyramide-koncept i hans bog “Succeeding with Agile”.

Mike Cohn’s originale testpyramide indeholder tre lag, som vores testsuite skal/bør indeholde:

1. Unittest
2. Servicetest
3. Brugergrænsefladetest (User Interface Tests)

Disse tre lag skal tages som en tommelfingerregel for hvor vi skal lægge vores testindsats:

Jo højre i lagene vi når, des færre test skal vi have.

Fordelene ved at automatisere på unit-niveau er, at vi kan skrive testene meget tidligt i udviklingsforløbet.

Når vi tester på brugergrænsefladen (toppen af pyramiden) er det ofte længere flow, vi tester, og det gør, at vi får meget redundant test.

NUnit og app.config filen

I forbindelse med afvikling af tests i NUnit, kan det være, at du har brug for at hente værdier fra app.config-filen. NUnit finder app.config-filen ved at kigge efter en fil, der er navngivet med dit assembly-navn: AssemblyNavn.config.

Du kan dog få NUnit til at læse app.config-filen, ved at flytte/kopiere filen til rod-biblioteket: \source\MitTestProjekt

NUnit og Visual Studio

Det er muligt at benytte NUnits forunderlige verden (funktionalitet og afviklingsplatform) sammen med Selenium WebDriver.

Følg nedenstående steps:

 

1) Download NUnit her og ekstrakt mappen til f.eks. C:\NUnit.

 

2) Tilknyt NUnit framework-dll’en via Add Reference i Visual Studio. Framework-dll’en er placeret under f.eks. C:\NUnit\NUnit-2.6.4\NUnit-2.6.4\bin\framework.NUnit_Add_Reference_NUnit

 

3) Tilføj følgende under Using-sektionen i toppen af scriptet:

Using NUnit.Framework;

 

4) Så er vi klar til at skrive testen:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using NUnit.Framework;


namespace Selvbetjening_AutoTest
{
    public class Testcases
    {

        [Test]
        public void Testcase_01()
        {
            ChromeDriver app = new ChromeDriver(@"C:\Selenium\chromedriver");
            app.Navigate().GoToUrl("http:\\www.testingit.dk");

            app.Quit();
        }
    }
}

Selenium WebDriver og Visual Studio

Her er et par tips til, hvordan man kan sætte Visual Studio op til at udvikle og afvikle Selenium testcases via Selenium WebDriver.

 

1) Start med at downloade Selenium Client & WebDriver Language Bindings her og ekstraker zip-filen til f.eks. C:\Selenium\WebDriver.

 

2) Opret et nyt Unittest-projekt i Visual Studio.Selenium_New_UnitTest_Project

 

3) Tilknyt WebDriver-dll’erne via Add reference i Visual Studio. Der skulle gerne være fire *.dll-filer som er placeret under eks. C:\Selenium\WebDriver\selenium-dotnet-2.xx.0\net40. Være opmærksom på, at der er to mapper under selenium-dotnet-2.xx.0: net35 og net40, og alt efter hvilken version af .net, du benytter.Selenium_Add_Reference_WebDriver

 

4) Tilføj følgende under Using-sektionen i toppen af scriptet:

Using OpenQA.Selenium;
Using OpenQA.Selenium.Firefox;
Using OpenQA.Selenium.Support.UI;

 

5) Så er vi klar til at skrive testen:

Simpel test, der blot åbner forsiden på www.testingit.dk

using System;
using Microsoft.VisualStudio.TestTools.Unitesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace TestingIT_Autotest
{
    [TestClass]
    public class UnitTest1
    {

        [TestMethod]
        public void Testcase_01()
        {
            FirefoxDriver firefox = new FirefoxDriver();
            firefox.Navigate().GotoUrl("http:\\www.testingit.dk");
            firefox.Quit();
        }
    }
}

 

Strukturen i CUITs

CodedUI_strukturAlle CUITs (Coded UI Tests) som bliver oprettet via Visual Studios Coded UI Test Builder indeholder som minimum disse 4 filer:

 

CodedUITest1.*

UIMap.uitest

UIMap.Designer.*

UIMap.*

 

CodedUITest1.*

CodedUITest1-filen indeholder selve testcasen [TestMethod]:

[TestMethod]
public void CodedUITestMethod1()
{
    // To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
    this.UIMap.Open_TestingIT();
}

samt initiering- [TestInitialize()], der afvikles inden selve testcase TestMethod og oprydningsmetoderne [TestCleanup()], der afvikles efter testcasen er afsluttet – uanset om testen afvikles succesfuldt eller fejler:

#region Additional test attributes
// You can use the following additional attributes as you write your tests:

////Use TestInitialize to run code before running each test 
[TestInitialize()]
public void MyTestInitialize()
{        
    // Start Browser and go to web page 'http://www.testingit.dk'
    BrowserWindow Browser = BrowserWindow.Launch(new System.Uri(this.StartBrowserParams.Url));
}

////Use TestCleanup to run code after each test has run
//[TestCleanup()]
public void MyTestCleanup()
{        
    #region Variable Declarations
    BrowserWindow uICodedUITestingITInteWindow = this.UICodedUITestingITInteWindow;
    #endregion

    // Perform Close on Browser
    uICodedUITestingITInteWindow.Close();
}

UIMap.uitest

Denne fil indeholder alle de handlinger (UI Actions), der bliver optaget via Coded UI Test Builder’en og bliver automatisk genereret af Coded UI Test Builder’en. UIMap.iutest-filen indeholder også identifikationen til de kontroller, du benytter i applikationen, der testes på: eks. en knap, en tekst eller et link.

Filen er i sin struktur en XML-fil, men når den vises i Visual Studio bliver den vist mere læsbart:

UIMap.uitest : IU Actions:

UIMAP_uitest_UI_Actions

UIMap.uitest : UI Control Map

UIMAP_uitest_UI_Control_Map

 

UIMap.designer.*

UIMap.designer.*-filen bliver dannet automatisk ud fra UIMap.iutest-filen, når du benytter Coded UI Test Builder’en, og repræsenterer kodesiden af testen. UIMap.designer-filen indeholder metoder og egenskaber (alle optaget via Coded UI Test Builder’en), der benyttes i selve testen (CodedUITest1.*).

Nedenstående er et eksempel på en metode fra UIMap.designer.*-filen:

public void Testautomatisering()
{
    #region Variable Declarations
    HtmlHyperlink uICodedUIHyperlink = this.UIJBUnitedSiderForsideWindow.UITestingITfordikvalitDocument.UIMainnavmenuCustom.UICodedUIHyperlink;
    #endregion

    // Click 'Coded UI' link
    Mouse.Click(uICodedUIHyperlink, new Point(54, 17));
}

Følgende er et eksempel på egenskab-sektionen (properties):

public HtmlHyperlink UICodedUIHyperlink
{
    get
    {
        if ((this.mUICodedUIHyperlink == null))
        {
            this.mUICodedUIHyperlink = new HtmlHyperlink(this);
            #region Search Criteria
            this.mUICodedUIHyperlink.SearchProperties[HtmlHyperlink.PropertyNames.Id] = null;
            this.mUICodedUIHyperlink.SearchProperties[HtmlHyperlink.PropertyNames.Name] = null;
            this.mUICodedUIHyperlink.SearchProperties[HtmlHyperlink.PropertyNames.Target] = null;
            this.mUICodedUIHyperlink.SearchProperties[HtmlHyperlink.PropertyNames.InnerText] = "Coded UI";
            this.mUICodedUIHyperlink.FilterProperties[HtmlHyperlink.PropertyNames.AbsolutePath] = "/testautomatisering/coded-ui/";
            this.mUICodedUIHyperlink.FilterProperties[HtmlHyperlink.PropertyNames.Title] = null;
            this.mUICodedUIHyperlink.FilterProperties[HtmlHyperlink.PropertyNames.Href] = "http://www.testingit.dk/testautomatisering/coded-ui/";
            this.mUICodedUIHyperlink.FilterProperties[HtmlHyperlink.PropertyNames.Class] = null;
            this.mUICodedUIHyperlink.FilterProperties[HtmlHyperlink.PropertyNames.ControlDefinition] = "href=\"http://www.testingit.dk/testautoma";
            this.mUICodedUIHyperlink.FilterProperties[HtmlHyperlink.PropertyNames.TagInstance] = "9";
            this.mUICodedUIHyperlink.WindowTitles.Add("Testing IT | – fordi kvalitet tæller……");
            #endregion
        }
        return this.mUICodedUIHyperlink;
    }
}

 

UIMap.*

Som udgangspunkt indeholder UIMap.*-filen ingen ting – hverken metoder eller egenskaber.

Formålet med UIMap.*-filen er, at her kan du selv kode dine egne metoder og egenskaber, som du efterfølgende kan benytte i CodedUITest1.

UIMap.* bliver ikke påvirket af Coded UI Test Builder’en.

Data Driven test – testdata fra fil

Da testdata kan ændre sig over tid, er det en god ide, at skille testdata ud fra selve testscriptet. En af muligheder er at flytte data ud i et datasæt/fil.

 

Nedenstående viser hvilke step du skal igennem:

  1. Tilføj tekst-filen “data.csv” til testen
  2. Under menupunktet File vælg Advanced Save Options og sæt encoding til Unicode (UTF-8 without signature) – Codepage 65001 as the encoding
  3. Ret data.csv property: Copy to Output Directory = Copy if newer
  4. Skift [TestMethod] i testfilen med: [DataSource(“Microsoft.VisualStudio.TestTools.DataSource.CSV”, “|DataDirectory|\\data.csv”, “data#csv”, DataAccessMethod.Sequential), DeploymentItem(“data.csv”), TestMethod]
  5. Ret i testen således at data fra data.csv bliver brugt: this.UIMap….. = TestContext.DataRow[“Felt1”].ToString();

 

Coded UI Tests (CUITs)

Når vi snakker om værktøjer til testautomatisering af brugergrænsefladetest, er det ofte HP Unified Functional Testing eller Selenium, der bliver brugt.

Men Microsoft har også et produkt til at teste brugergrænsefladen: Visual Studio.

De test vi kan lave med Visual Studios testautomatiseringsværk til User Interface-test kaldes for Coded UI Tests (CUITs).

Microsoft_CUITs (Kilde Microsoft – Developer Network)