CodedUI Tests mit Selenium und VNext Build

Schon länger überlegen wir, unsere Webseite auch über Tests prüfen zu lassen. Die API wird durch verschiedene Tests (Unittest, Acceptanztest und Systemtests) bereits geprüft, wieso also nicht auch die UI automatisiert testen.
Natürlich kommen an dieser Stelle die üblich Fragen:
– Wie viel darf es kosten?
– Was wollen wir eigentlich testen?
– Welche Browser / Browserversionen sollen getestet werden?

Wir haben relativ schnell gemerkt, dass CodedUI Tests aufnehmen und abspielen nicht der beste Weg ist, da Wartung und Erweiterung des Tests fast nicht möglich sind.
Die Lösung war, ein  Metadaten Model über unsere Webseite zu legen. So konnten wir lesbaren und erweiterbaren Code schreiben. Nun liefen unsere Tests aber leider nur im IE und auch leider nicht in einem automatischen Build.
Für die Build-Automatisierung haben wir uns für das Tool Selenium entschieden.

Hier die Vorgehensweise:
– Neue Solution aufsetzen
– Selenium Nuget Pakete installieren  (es werden die Driver.exe(n) der Solution hinzugefügt. Diese sollten nicht eingecheckt werden. Wir haben noch eingestellt, dass sie jedesmal ins „Output Dir“ kopiert werden)

selenium installation

 

So könnte der QuellCode eines Tests aussehen:

[TestMethod]
public void DummyTest()
{
    IWebDriverdriver=null;
    try
    {
        driver=GetFireFoxDriver();
        driver.Navigate().GoToUrl("http://myWebsite/ui/dist/index.html");
 
        IWebElementuserInput=driver.FindElement(By.Id("userId"));
        IWebElementpwdInput=driver.FindElement(By.Id("pwdId"));
        IWebElementbutton=driver.FindElement(By.Id("loginBtnId"));
 
        userInput.SendKeys("userlogin");
        pwdInput.Clear();//InputBox löschen um sicherzugehen,dass der Browser sich nichts gemerkt hat.Wichtig bei Edge
        pwdInput.SendKeys("userpassword");
        button.Click();
 
        var waiter=newWebDriverWait(driver,TimeSpan.FromMinutes(5));//warten bis das Controll erscheint.Maximal 5 min
        var logoutButton=waiter.Until(x=gt;x.FindElement(By.Id("logoutButtonId")));
 
        logoutButton.Click();
    }
    finally
    {
        driver?.Close();
    }
}

private IWebDriverGetFireFoxDriver()
{
    var proxy=GetProxy(); 
    var firefoxProfile = newFirefoxProfile(); 
    firefoxProfile.SetProxyPreferences(proxy); 
    firefoxProfile.DeleteAfterUse=true; 

    string serverPath=@"MozillaFirefox\firefox.exe"; 
    if(System.Environment.Is64BitOperatingSystem) 
    { 
        serverPath=Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%"),serverPath); 
    } 
    else 
    {
        serverPath=Path.Combine(Environment.ExpandEnvironmentVariables("%ProgramFiles%"),serverPath); 
    } 

    return newFirefoxDriver(new FirefoxBinary(serverPath),firefoxProfile,TimeSpan.FromMinutes(2)); 
}

private static ProxyGetProxy() 
{ 
    return newProxy
    {
        proxy.NoProxy="*.meinDomain.de,localhost"; 
        proxy.Kind=ProxyKind.Manual; 
        proxy.IsAutoDetect=false; 
        proxy.HttpProxy="proxyserver:1234"
    };
}

Nachdem dies nun geht, wollen wir natürlich auch noch automatisierte Builds, die auf verschiedenen Clients auf den unterschiedlichsten Browser Versionen installiert sind.

Einstellungen im TFS:
Zuerst sollten wir eine Computergruppe einrichten. Dazu den Tab „Test“ anklicken und danach das Menü „Computer“.
Als Name wählen wir z.B. UITests und füllen die weiteren Felder aus. Diese Gruppe wählen wir dann später in unserem Build aus.
Muss in 3 Buildschritten eingetragen werden: Windows Maschine File Copy (Machines), Visual Studio Test Agent Deployment (Test Machine Group) und Run Functional Tests (Test Machine Group)
computergruppe

 

 

 

 

 

 

Danach kopieren wir noch den TestAgent von Microsoft auf den Testclient und lassen ihn installieren, falls der TestAgent noch nicht installiert ist.

Wir legen einen neuen Build an.  Im Buildschritt „Visual Studio Test Agent Deployment“ stellen wir bei Test Machine Group die vorher erstellte Maschine ein (UITests):

agent deployment
Hinweis: Die Installation des TestAgents benötigt ca 2 GB Speicherplatz. 

 

 

 

 

 

 

Um die Tests auf dem TestClient laufen zu lassen, müssen die Dateien dort auch hinkopiert  werden. Hier „c:\ToTest“ (Freigabe auf dem TestClient)
run tests

 

 

 

 

Damit ist die Konfiguration des Builds abgeschlossen.

Auf dem Testclient müssen noch ein paar Einstellungen vorgenommen werden:

Einstellungen Testclient:
1.) Build User in die Gruppe Admin
2.) .Net Framework installieren -> hier 4.6, ob es mit älteren Versionen funktioniert habe ich nicht ausprobiert
3.) Verzeichnis für DropLoaction anlegen und freigeben für den Benutzer, der den Test ausführt.
4.) Remote UAC deaktivieren -> regedit ->  HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy
„Set the value data to 0 to disable remote UAC processing and to 1 to enable it.“
5.) Nun Powershell als Admin starten und folgendes ausführen:
–  Enable-PSRemoting -force
– winrm quickconfig
– Set-Item WSMan:\localhost\Client\TrustedHosts *
6.) WMI Berechtigung anpassen:
WMI öffnen (Computerverwaltung -> Dienste und Anwendungen -> WMI Steuerung -> Eigenschaften)
– Eigenschaften -> Tab wechseln zu ‚Sicherheit‘ -> Button Sicherheit anklicken
– Build User eintragen und alle Rechte zulassen (keine Ahnung was genau gebraucht wird. Da der Rechner nur intern ist sicherheitshalber alles erlauben 🙂 )

Nun ist alles eingerichtet und die CodedUI Tests laufen auf dem TestClient.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.