www.dotnetpro.de 5.2013 Sonderdruck  1Unit-Tests sind zu aufwendig. Für Inte­grationstests fehlt die Zeit. Systemtestskönn...
2 Sonderdruck 5.2013 www.dotnetpro.de[Abb. 1] Ein-binden einesgemeinsamenOrdners inVirtualBox.Zusammenhang zwar nicht für ...
www.dotnetpro.de 5.2013 Sonderdruck3Hello dotnetproEin erster Test ist schnell entwickelt. Nach-dem ein Browser-Treiber in...
www.dotnetpro.de 5.2013 Sonderdruck 4binden; hierzu dient das FindsBy-Attribut.Weiterhin stellt das Page Object nach au-ße...
5 Sonderdruck 5.2013 www.dotnetpro.deUm mit der Beispiellösung arbeiten zukönnen, erstellen Sie zunächst im Webser-ver (II...
www.dotnetpro.de 5.2013 SonderdruckTabelle 3Attribute zur Konfiguration von Page Objects.Attribut Zielelement Eigenschaft ...
Nächste SlideShare
Wird geladen in …5
×

Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro

4.920 Aufrufe

Veröffentlicht am

Nur wenn Softwaretests einfach durchzuführen sind, werden sie im Projekt auch wirklich eingesetzt und verhelfen zu mehr Softwarequalität. Idealerweise geschieht dies automatisiert.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
4.920
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
11
Aktionen
Geteilt
0
Downloads
33
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro

  1. 1. www.dotnetpro.de 5.2013 Sonderdruck 1Unit-Tests sind zu aufwendig. Für Inte­grationstests fehlt die Zeit. Systemtestskönnen auch noch am Projektende ge-macht werden. Und ohnehin, Sie machen dochIhre Arbeit von Anfang an richtig – warum alsoso umfangreich (und wiederholt) testen?Diese – hier überspitzt dargestellte – Ansichtkommt Ihnen vermutlich aus einigen IT-Projek-ten bekannt vor. Als professioneller Entwicklerwissen Sie zwar, dass hochwertige Software nurmithilfe von Qualitätssicherungsmaßnahmenentstehen kann, doch gelegentlich ist etwasÜberzeugungsarbeit nötig, um den Nutzen sol-cher Maßnahmen zu vermitteln.Ein möglicher Ansatz: Führen Sie einen auto­matisierten GUI-Test vor. Ein Formular, das sichwie von selbst mit Daten füllt, automatisch aufrichtiges Verhalten geprüft und schließlich ab-gesendet wird, sagt mehr als tausend Worte;besonders wenn dies mit fünf verschiedenenDatensätzen in jeweils drei unterschiedlichenClients geschieht. Noch besser: Diese Tests kön-nen zusammen mit der entwickelten Softwareausgeliefert und im Rahmen eines Abnahme-tests eingesetzt werden, sodass ein unmittelba-rer Zeitgewinn sichtbar wird. Dies kommt allenBeteiligten zugute – eine höhere Akzeptanz vonregelmäßigen Systemtests und damit oft derQualitätssicherung allgemein ist ein wichtigerBeitrag zum Gelingen des Projekts.Das ToolIm .NET-Umfeld stehen diverse Tools für dieGUI-Automation zur Verfügung, von denen vierTest-Automation mit Selenium WebDriverDer große Formular-CheckWebanwendungen wiederholt von Hand zu testen ist monoton und ineffizient. Nach Erweiterung der Grundfunktio-nen nimmt WebDriver Ihnen lästige Arbeiten wie das Ausfüllen von Formularen ab.Auf einen BlickMartin Gossen ist als IT-Berater bei iks tätig. Er erstelltindividuelle Geschäftsanwendun-gen mit C#, ASP.NET und SQLServer. Besonderen Fokus legt erdabei auf automatisiertes Testenund Usability-Analysen. Sieerreichen ihn unter m.gossen@iks-gmbh.com.Inhalt▸ Selenium-Tools für die GUI-Automatisation.▸ Das Tool Selenium WebDriverim Detail.▸ Beispiel eines automatisiertenTests.dnpCodeA1305Seleniumin [1] vorgestellt wurden. Dabei bietet sich alsTestumgebung für Webanwendungen das weit-verbreitete und frei verfügbare Produkt Selenium[2] an. Genau genommen handelt es sich bei Se-lenium um eine Sammlung mehrerer Tools, diein Tabelle 1 aufgeführt sind.Dieser Artikel befasst sich mit Selenium Web-Driver (Selenium 2), einer Implementierung desWebDriver-APIs, das als Entwurf für eine W3C-Spezifikation vorliegt [3]. Ähnlich SeleniumIDE imitiert Selenium WebDriver das Verhal-ten eines realen Anwenders, indem es mit demWebbrowser beziehungsweise der geladenenWebseite interagiert. Elemente der Webseite(DOM-Elemente) werden dabei über Selekto-ren ausgewählt und anschließend ausgelesenoder manipuliert. Dabei sind alle Aktionen inder gleichen Weise eingeschränkt wie bei einemechten Anwender; zum Beispiel kann ein But-ton, der ausgeblendet oder inaktiv ist, auch vonden beiden Automations-Tools nicht angeklicktwerden.Während Selenium IDE als reines Firefox-Plug-in eher die Funktion eines aufgebohrtenMakro-Recorders erfüllt, lässt sich SeleniumWebDriver für anspruchsvolle Steuerungsauf-gaben auch in anderen Browsern und damit fürprofessionelle Systemtests von Webanwendun-gen einsetzen. Technisch gesehen verfolgt Se-lenium WebDriver auch den solideren Ansatz,denn es nutzt im Gegensatz zu Selenium IDEdie in aktuellen Browsern bereits integriertenFunktionen zur Automation [4].Im Folgenden soll der Begriff „WebDriver“nicht die Schnittstelle, sondern das Selenium-Tool bezeichnen. Eine Dokumentation zumkompletten Selenium-API finden Sie in [5].Installation und EinrichtungAm einfachsten legen Sie mit WebDriver los, in-dem Sie in Visual Studio ein neues Projekt vomTyp Klassenbibliothek erstellen (vorzugsweisenicht auf Laufwerk C:, siehe unten) und überdie Paket-Manager-Konsole die folgenden Nu-Get-Pakete hinzufügen:PM Install-Package Selenium.WebDriverPM Install-Package Selenium.SupportEs ist außerdem sinnvoll, ein Test-Frameworkwie NUnit [6] zu installieren. Es soll in diesemTabelle 1Selenium Tools.Tool BeschreibungSelenium IDE Ein Firefox-Add-on, das als Makro-Recorder fungiert. In die Makros könnenÜberprüfungen mittels Assert und Verify eingebunden werden. Zudem ist dasschrittweise Abspielen von Testfällen und das Setzen von Breakpoints möglich.Selenium Client API Erweitert Selenium IDE um diverse Programmiersprachen (inklusive C#).Selenium RC (Remote Control) Ein Proxy-Server, der von einem Selenium-Client-Treiber ferngesteuert wird.Ermöglicht die Testautomatisierung von GUI-Tests in Kombination mit Conti-nuous Integration. Ist offiziell als deprecated (überholt) gekennzeichnet.SeleniumWebDriver (Selenium 2) Der Nachfolger von Selenium RC mit objektorientiertem API. Spricht denBrowser direkt über dessen Automations-API an.Selenium Grid Eine Erweiterung, die eine parallele Ausführung von Tests auf mehreren Servernermöglicht.Sonderdruck
  2. 2. 2 Sonderdruck 5.2013 www.dotnetpro.de[Abb. 1] Ein-binden einesgemeinsamenOrdners inVirtualBox.Zusammenhang zwar nicht für Unit-Testseingesetzt werden, eignet sich aber gutfür die Konfiguration und Ausführungder Einzeltests. Eine Einführung in NUnitfinden Sie in [7]. Sie können anschließenddie installierte NUnit-Assembly IhremProjekt hinzufügen oder sich wieder beiNuGet bedienen:PM Install-Package NUnitJe nachdem, in welchen Browsern SieIhre Tests ausführen wollen, sind nochexterne Browser-Treiber notwendig. Ein-zelheiten hierzu finden Sie auf der Selenium-Download-Seite; allerdings sind diedortigen Angaben und verknüpften Versi-onen nicht immer aktuell. So soll man derWindows-Umgebungsvariablen %PATH%den Speicherort des Internet-Explorer-Treibers hinzufügen, was aber nicht un-bedingt nötig ist. Hingegen sollte mandarauf achten, dass die Browser-Treibernicht durch eine Firewall behindert wer-den; unter Windows 7 erhalten Sie beimersten Zugriffsversuch eine entsprechen-de Meldung.Den IE-Treiber finden Sie in [8], denChrome-Treiber in [9]. Für Firefox ist keinweiterer Treiber nötig. Beachten Sie, dassneuere Treiber eventuell nicht mit altenVersionen der Browser funktionieren;während die ZIP-Datei des Chrome-Trei-bers die Versionsnummer im Dateinamenträgt, müssen Sie beim Internet Explorerim Zweifelsfall mit älteren Treiberdateienexperimentieren. Legen Sie die Treiberda-teien ins Assembly-Verzeichnis des Visual-Studio-Projekts (zum Beispiel /bin/Debug).Wenn Sie mit genau festgelegten Brow-serversionen testen müssen, können Sieeinen virtuellen Rechner zum Beispiel mitOracles VM VirtualBox [10] aufsetzen undauf diesem die gewünschten Versioneninstallieren (automatische Programm-Updates ausschalten!). Wenn Sie Ihr Vi­sual-Studio-Projekt nun beispielsweiseauf Laufwerk D: angelegt haben, könnenSie dieses in der virtuellen Maschine alsgemeinsamen Ordner einbinden (sieheAbbildung 1).Dies hat den Vorteil, dass Konfigurati-onspfade auf beiden Rechnern gleich sindund die Tests jederzeit aus der virtuellenMaschine wie auch Ihrem Entwicklerrech-ner heraus ausgeführt werden können(sofern beide mit den gleichen Browser-Treibern zurechtkommen).Listing 1Ein einfacher WebDriver-Test.using System;using NUnit.Framework;using OpenQA.Selenium;using OpenQA.Selenium.Firefox;namespace SeleniumDemo.DotNetPro.Test{public class DotNetProTest1{[Test]public void FindSeleniumArticle(){// Instantiate browser driverusing (IWebDriver driver = new FirefoxDriver()){// Set timeoutTimeSpan waitTimespan = TimeSpan.FromSeconds(15);driver.Manage().Timeouts().ImplicitlyWait(waitTimespan);// Navigate to target URLdriver.Url = http://www.dotnetpro.de;// Get page elements for searchingIWebElement searchBox =driver.FindElement(By.Id(TB_SearchTerm));IWebElement searchButton =driver.FindElement(By.Id(BT_Search));// Execute searchsearchBox.Clear();searchBox.SendKeys(Selenium);searchButton.Click();// Get element from result pageIWebElement searchResultsArea =driver.FindElement(By.Id(ctl09_PNL_SearchResult));// Assert correct resultAssert.IsTrue(searchResultsArea.Text.Contains(Fahren Sie schon Automatik?));// Finish uptry{driver.Quit();}catch{// Ignore if browser cant be closed}}}}}
  3. 3. www.dotnetpro.de 5.2013 Sonderdruck3Hello dotnetproEin erster Test ist schnell entwickelt. Nach-dem ein Browser-Treiber instanziert undmit einem Timeout versehen ist, könnenSie schon zur Zielseite navigieren. Nunwählen Sie Seitenelemente (zum BeispielTextfelder eines Formulars) anhand ihrerID aus und führen Aktionen auf Ihnen aus.Anschließend testen Sie, ob die Seite wieerwartet reagiert hat, indem Sie die Werteweiterer Seitenelemente prüfen. Listing 1zeigt dies am Beispiel der Artikelsuche aufder dotnetpro-Startseite. In diesem Fallwird getestet, ob der in [1] genannte Arti-kel gefunden wird, wenn man eine Suchemit dem Stichwort„Selenium“ durchführt.Nachdem Sie das Projekt kompilierthaben, können Sie ein NUnit-Projekt an-legen, die erzeugte Assembly des Visual-Studio-Projekts dem NUnit-Projekt hin-zufügen und den Test ausführen. Wennalles gut geht, können Sie WebDriver nunbei der Arbeit zusehen und am Ende einpositives Testergebnis abnicken (sieheAbbildung 2).Selektoren und AktionenNicht immer besitzen Seitenelemente ei-ne eindeutige ID, anhand derer sie iden-tifiziert werden können; oder aber die­ID ändert sich vom einen zum anderenSeitenaufruf (zum Beispiel bei dynamischerzeugten Controls). Aus diesem Grundbringt WebDriver eine Reihe von Selek­tor-Strategien mit, die in Tabelle 2 aufge-führt sind. So lassen sich Elemente unteran­derem anhand eines Name-­Attributs,ihrer CSS-Klasse oder der Position in derDOM-Hierarchie ermitteln. Mithilfe vonJava­Script ergeben sich weitere Mög-lichkeiten; zum Beispiel lassen sich diejQuery­-Selektoren [11] verwenden. DaSelektoren auch mehrere Elemente zu-rückgeben können, ist eine weitere Fil-terung durch eigenen Code möglich. AusPerformance-Gründen sollten Sie abermöglichst eindeutige ID- und CSS-Selek-toren benutzen. Sofern die zu testendeWebseite unter Ihrer eigenen Kontrolle ist,empfiehlt es sich daher, alle relevantenSeitenelemente mit einer ID zu versehen.Bei CSS- und XPath-Selektoren mussbedacht werden, dass diese von denBrowsern unterschiedlich unterstütztwerden; so wird Groß-/Kleinschreibungteilweise ignoriert, teilweise nicht. Einzel-heiten hierzu finden Sie in [12].Haben Sie das gewünschte Seitenele-ment über die FindElement- beziehungs-weise FindElements-Methode gefunden(siehe Listing 1), steht es Ihnen als Objektvom Typ IWebElement zur Verfügung undSie können über seine Eigenschaften bei-spielsweise ermitteln, ob es momentanangezeigt wird, ob es aktiv ist und wie seinInhaltstext lautet. Über Methoden könnenSie es unter anderem anklicken oder einenText setzen. Wenn Sie wissen, dass es sichum ein Control mit selektierbaren Wertenhandelt (zum Beispiel ein Drop-down-Control), können Sie es in ein Select­Element-Objekt kapseln und auf diesemeine von mehreren SelectBy-Methodenaufrufen, um einen Wert zu setzen.IWebElement dropdown =driver.FindElement(By.Id(ctrl1));SelectElement selectableDropdown =new SelectElement(dropdown);// Possible select by methodsselectableDropdown.SelectByIndex(42);selectableDropdown.SelectByValue(foo);selectableDropdown.SelectByText(bar);Das Entwurfsmuster Page ObjectDen Prinzipien der Clean-Code-Entwick-lung [13] zufolge sollte jede Anwendungdas Single-Responsibility-Prinzip beach-ten. Die Entwickler von WebDriver habensich das zu Herzen genommen und emp-fehlen den Einsatz des Page-Object-Mus-ters [14]. Das Page Object repräsentiertdie zu testende Webseite; dem steht eineseparate Testklasse gegenüber. Innerhalbdes Page Object lassen sich Felder über ei-nen Selektor deklarativ an DOM-ElementeListing 2Die Klasse für das Page Objectder Startseite.public class DefaultPage {const string url =http://www.dotnetpro.de;const string pageTitle =Herzlich willkommen!;// Page Elements[FindsBy(Using = TB_SearchTerm)]IWebElement searchBox;[FindsBy(Using = BT_Search)]IWebElement searchButton;// Propertiespublic string Url {get { return url; }}public string PageTitle {get { return pageTitle; }}// Methodspublic SearchPage Search(string searchText) {// Execute searchsearchBox.Clear();searchBox.SendKeys(searchText);searchButton.Click();return new SearchPage();}}Tabelle 2Selektoren für DOM-Elemente.Selektor BeschreibungClassName Class-Attribut des DOM-Elements.CssSelector CSS-Selektor.Id ID-Attribut des DOM-Elements.LinkText Vollständiger Text eines Hyperlinks.Name Name-Attribut des DOM-Elements.PartialLinkText Partieller Text eines Hyperlinks.TagName Name des DOM-Elements.XPath XPath-Selektor.JavaScript Rückgabewert einer JavaScript-Funktion.[Abb. 2] Ein erfolgreicher NUnit-Test.
  4. 4. www.dotnetpro.de 5.2013 Sonderdruck 4binden; hierzu dient das FindsBy-Attribut.Weiterhin stellt das Page Object nach au-ßen hin Eigenschaften und Methoden be-reit, die für die Testklasse von Nutzen sind.Ein Beispiel: Das Page Object einerLog­in-Seite könnte eine LogOn-Metho-de ­bereitstellen sowie eine EigenschaftIsLogged­On. Diese können von der Test-klasse benutzt werden, um den Anmelde-vorgang eines Anwenders zu automatisie-ren und anschließend auf Erfolg zu prüfen.Das Page Object selbst sollte keinenTestcode enthalten, also kein Assert aus-führen.Hierbei gibt es allerdings eine Aus­nahme: Bei der Instanzierung kann das­Page Object sicherstellen, dass die richti-ge Webseite (und eventuell wichtige Sei-tenelemente) geladen wurde und bereitist, auf Testeingaben zu antworten. Dieswird am einfachsten anhand des Seiten-titels festgestellt; wenn dieser nicht ein-deutig ist, kann auch auf Vorhandenseineines beliebigen DOM-Elements geprüftwerden.Das Zusammenspiel von Page Objectund Testklasse veranschaulichen die­Listings 2, 3 und 4.Screenshots und ProtokollierungBekanntlich können Tests auch fehlschla-gen – ist es doch gerade Sinn eines Tests,Fehler aufzudecken. Um Hinweise aufdie Fehlerursache zu erhalten, könnenSie im entscheidenden Moment einenListing 3Die Klasse für das Page Objectder Suchseite.public class SearchPage{const string pageTitle = Suche;// Propertiespublic string PageTitle {get { return pageTitle; }}// Page Elements[FindsBy(Using =ctl09_PNL_SearchResult)]IWebElement searchResultsArea;// Propertiespublic IWebElement SearchResultsArea{get { return searchResultsArea; }}}Screenshot der Webseite anfertigen las-sen. Hierfür bringt WebDriver eigens eineGetScreenshot-Methode mit.var screenshot =((ITakesScreenshot)driver).GetScreenshot();screenshot.SaveAsFile(path, ImageFormat.Png);Für weitergehende Protokollierung desFehlers oder auch des Erfolgsfalls für dieTestdokumentation müssen Sie auf die.NET-Standardklassen oder auf Logging-Frameworks zurückgreifen.Listing 4Die Testklasse für die Page Objects aus Listing 2 und 3.public class DotNetProTest2{[Test]public void FindSeleniumArticle(){// Instantiate browser driverusing (IWebDriver driver = new FirefoxDriver()){// Set timeoutTimeSpan waitTimespan = TimeSpan.FromSeconds(15);driver.Manage().Timeouts().ImplicitlyWait(waitTimespan);// Create and initialize page objectDefaultPage defaultPage = new DefaultPage();PageFactory.InitElements(driver, defaultPage);// Navigate to target URLdriver.Url = defaultPage.Url;// Make sure correct page was loadedAssert.AreEqual(driver.Title, defaultPage.PageTitle);// Execute searchSearchPage searchPage = defaultPage.Search(Selenium);// Initialize resulting pagePageFactory.InitElements(driver, searchPage);// Make sure correct page was loadedAssert.AreEqual(driver.Title, searchPage.PageTitle);// Assert correct resultAssert.IsTrue(searchPage.SearchResultsArea.Text.Contains(Fahren Sie schon Automatik?));// Finish uptry{driver.Quit();}catch{// Ignore if browser cant be closed}}}}Eine Beispiellösung für Formular-TestsZu diesem Artikel finden Sie auf der Heft-DVD eine VS2012-Solution (.NET 4.5), dieaus den folgenden vier Projekten besteht:◼ DotNetPro.Test (enthält die abgedruck-ten Listings),◼ SeleniumFormExtensions (Formular-Erweiterungen),◼ WebApplication (eine Beispiel-Website),◼ WebApplication.Test (Tests für die Bei-spiel-Website).Sonderdruck
  5. 5. 5 Sonderdruck 5.2013 www.dotnetpro.deUm mit der Beispiellösung arbeiten zukönnen, erstellen Sie zunächst im Webser-ver (IIS) eine neue Site und weisen den Ord-ner WebApplication als Stammverzeichniszu, sodass die Beispiel-Website als local­host erreichbar ist. Der Anwendungspoolmuss .NET 4.0 verwenden. Gegebenen-falls müssen Sie dem Benutzerkonto desWebservers noch Zugriff erteilen, indemSie entsprechende Rechte auf dem Ordnereinrichten. Auf dem Unterordner Uploadwerden zudem Schreibrechte benötigt. ObdieWebsite wie gewünscht funktioniert, se-hen Sie, wenn Sie im Browser zu localhost/Profile.­aspx navigieren und sich dort an derWebsite anmelden (User name: TestUser,Password: TestPw). Nun sollte die ZielseiteProfile.aspx erscheinen (siehe Abbildung 3).Der eigentliche Test besteht darin, dasFormular auszufüllen, abzusenden undauf Korrektheit der übermittelten Wertezu prüfen. Der Test ist dann erfolgreich,wenn alle eingegebenen Werte auf deranschließenden Bestätigungsseite kor-rekt angezeigt werden. Profile.aspx ist ab-sichtlich so konzipiert, dass verschiedeneTypen von Formular-Controls ausgefülltwerden können.Bei dem Projekt SeleniumFormExten­sions handelt es sich um eine wiederver-wendbare Klassenbibliothek, die Ihnendie Arbeit mit Webformularen erleichtert.Sie enthält im Wesentlichen folgendeKlassen: (siehe Abbildung 4):◼ Eine Basisklasse PageObject, die eineFillForm- und einige Hilfsmethodenzur Verfügung stellt, welche das Aus-füllen von Formularen und generell dieInteraktion mit Seitenelementen ver-einfachen (A).◼ Eine Basisklasse für Tests (Selenium­Test), die sich um die Browser-Treiberund die Protokollierung von Fehlernkümmert sowie das Navigieren zu Web-seiten erleichtert (B).◼ Eine Reihe von Konfigurationsklassen,mit denen Sie Eigenschaften von PageObjects und das genaue Verhalten beimAusfüllen der Formularfelder deklarativfestlegen können. Hier wird zudem dasEinlesen von Testdaten aus XML-Datei-en ermöglicht (C).◼ Strategien zum Setzen von Werten(­Val­ue Setters) für verschiedene Con-trol-Typen (D).Hierauf aufbauend können Sie Ihreeigenen Tests erstellen, wie im ProjektWebApplication.Test demonstriert (sieheAbbildung 5):◼ Die Klasse Page dient als Basisklasse fürdie eigentlichen Page-Object-Klassen.Somit repräsentiert die Page-Klasse dieMaster Page der Website und enthältfolgerichtig eine Logout-Methode. Dasentsprechende Seitenelement – derLog-Off-Hyperlink – befindet sich in derMaster Page (A).◼ Die Klasse Test dient als Basisklasse fürdie konkreten Testklassen. In dieserKlasse erfolgt die Vorbereitung (Setup)und das Aufräumen (Teardown), das vorbeziehungsweise nach jedem Test not-wendig ist. Im Beispiel erfolgt hier dieAn- und Abmeldung an der Website (B).◼ Der Ordner Pages enthält die Page-Ob-ject-Klassen, hierarchisch gegliedert wiedie entsprechenden Webseiten. Wie die-se konfiguriert werden können, sehenSie in Tabelle 3. Weitere Erläuterungendazu finden Sie auch im Quellcode (C).◼ Der Ordner Tests beinhaltet die kon-kreten Testklassen. Hier können Sie imTestFixture-Attribut angeben, für welcheBrowser die Tests ausgeführt werdensollen, und im TestCaseSource-Attributbestimmen Sie, woher die Testdatenstammen. Die Testmethoden benutzendie Schablonenmethode Execute ihrerBasisklasse, damit Fehler abgefangenund protokolliert werden können (D).◼ Unter Properties/Settings.settings kon-figurieren Sie das Projekt. Die meistenWerte sind selbsterklärend. TestUser­Name und TestUserPassword sind An-meldedaten, die für jeden Test benötigtwerden; daher sind sie hier zentral ab-gelegt. SourceCulture und TargetCulturewerden zum Umwandeln von Formaten– speziell von eingelesenen Datums-werten – verwendet (E).◼ Configuration/TestData enthält XML-Dateien mit den zu verwendenden Test-daten (F).◼ Configuration/TestFiles enthält Binärda-teien zum Testen der Upload-Funktion(G).[Abb. 3] Die zu testende Seite Profile.aspx.[Abb. 4] Das Projekt SeleniumFormExtensions.[Abb. 5] Das Projekt WebApplication.Test.Sonderdruck
  6. 6. www.dotnetpro.de 5.2013 SonderdruckTabelle 3Attribute zur Konfiguration von Page Objects.Attribut Zielelement Eigenschaft BeschreibungPageIdentifier Page-Object-KlasseTitle Titel der Webseite.Wird benutzt, um festzustellen, ob die korrekteWebseite geladen wurde.ElementId ID eines DOM-Elements der Webseite.Wird benutzt, um festzustellen,ob die korrekte Webseite geladen wurde.PageUrl Page-Object-KlasseUrl URL der repräsentierten Webseite. Zu diesem URL navigiert derBrowser-Treiber.Configuration IWebElement-Feld Delay Zeitverzögerung beim Setzen eines Wertes in Millisekunden. Nütz-lich, wenn das Element Zeit zum Reagieren benötigt.Tab Name eines Formularreiters, der angeklickt wird, bevor ein Wertgesetzt wird.Click Das Element wird vor dem Setzen eines Wertes angeklickt.Leave Das Element verliert nach dem Setzen eines Wertes den Fokus.DataType Datentyp des zu setzenden Wertes.Wird bei der Umwandlung vonWerten in eine andere Culture benutzt.SourceCulture Culture des eingelesenen Wertes.TargetCulture Culture, in die ein Wert umgewandelt wird.Format Format, in das ein Wert umgewandelt wird.ElementType Control-Typ des Elements (zum Beispiel text oder select). Für jeden Typkann eine eigene Strategie zum Setzen von Werten benutzt werden.SetMethod Ansatz, der zum Setzen eines Wertes gewählt wird.SelectMethod Ansatz, der zur Auswahl eines Wertes gewählt wird.◼ Die Klasse Configuration/DataProvi­der besorgt die Testdaten und stellt sieden Testklassen zur Verfügung. Im Bei-spiel liefert die UserProfiles-Eigenschaftsukzessiv die Werte aller XML-Knotennamens Profile der verfügbaren XML-Dateien (H).◼ Der Ordner Log ist der Speicherortfür Fehlerprotokolle und zugehörigeScreenshots (J).Um die Beispiellösung in Aktion zusehen, müssen Sie lediglich ein NUnit-Projekt für die Assembly SeleniumDemo.WebApplication.Test.dll anlegen undausführen. Damit es in allen drei Brow-sern (Firefox, Internet Explorer, Chrome)klappt, müssen diese natürlich installiertsein. Je nach Browser-Version kann esauch nötig sein, die vorhandenen Brow-ser-Treiber (IEDriverServer Win32 2.28.0und chromedriver win 23.0.1240.0) auszu-tauschen.FazitSelenium WebDriver bringt eine Reihesolider Funktionen mit, die das Testenvon Webanwendungen erleichtern. ImZusammenspiel mit NUnit und etwaszusätzlicher Handarbeit lässt sich darausein hoch konfigurierbares System bauen,das Ihnen viel Tipparbeit beim Testenvon Webformularen abnimmt und sichin einen Continuous-Integration-Prozesseinbinden lässt. Nebenbei dient es als an-schauliche Demonstration für wiederver-wendbare Systemtests und kann damit er-heblich zum Projekterfolg beitragen. [bl][1] Hendrik Lösch, Michael Hanslik, Ein Vergleichverbreiteter UI-Testing-Frameworks, FahrenSie schon Automatik?, dotnetpro 11/2012,Seite 102 ff.,www.dotnetpro.de/A1211CodedUI[2] Selenium, http://seleniumhq.org[3] W3C Entwurf WebDriver-API,www.w3.org/TR/webdriver[4] Selenium WebDriver Dokumentation,www.dotnetpro.de/SL1304Selenium1[5] Selenium WebDriver API,www.dotnetpro.de/SL1304Selenium2[6] NUnit, www.nunit.org[7] Tam Hanna, Unit-Tests mit NUnit, Ebenbürti-ger Ersatz, dotnetpro 12/2012, Seite 110 ff.,www.dotnetpro.de/A1212Testen[8] Internet Explorer Driver Server,www.dotnetpro.de/SL1304Selenium3[9] Chrome Driver,www.dotnetpro.de/SL1304Selenium4[10] Oracle VM VirtualBox, www.virtualbox.org[11] jQuery-Selektoren,www.dotnetpro.de/SL1304Selenium5[12] Selenium, Locating UI Elements (WebEle-ments): CSS- und XPath-Eigenheiten,www.dotnetpro.de/SL1304Selenium6[13] Clean Code, www.clean-code-developer.de[14] Selenium-Wiki: Page-Object-Entwurfsmuster,www.dotnetpro.de/SL1304Selenium7iks Gesellschaft fürInformations- undKommunikationssysteme mbHSiemensstraße 2740721 HildenTelefon 0 21 03 - 58 72 -0Telefax 0 21 03 - 58 72 -58info@iks-gmbh.comwww.iks-gmbh.comi skGesellschaft fürInformations- undKommunikationssysteme mbHSoftwareentwicklungIT-BeratungIT-KonzepteBusiness IntelligenceIndividuelle IT-Konzepteund SoftwarelösungenSonderdruck

×