Neue Seleniumversion verfügbar
Seit etwa 2 Wochen steht die neue Selenium C# Assembly (Version 2.33.0) zur Verfügung.
Diese kann wie gewohnt von der Seite seleniumhq geladen werden:
http://docs.seleniumhq.org/download/
Seit etwa 2 Wochen steht die neue Selenium C# Assembly (Version 2.33.0) zur Verfügung.
Diese kann wie gewohnt von der Seite seleniumhq geladen werden:
http://docs.seleniumhq.org/download/
Sollte der Testcontroller über eine, im Verhältnis zu den durchzuführenden Testfällen, zu kleine “C” Partition (ggf. auch andere Partition, auf der sich das Users Verzeichnis befindet) verfügen, kann es während der Durchführung zu “Problemen” führen.
Grund dafür ist ein fehlendes, bzw. fast nicht vorhandenes Aufräumen des Users Verzeichnisses “QTController”.
Dieses Fehlverhalten kann während der Testdurchführung folgende “Symptome” aufweisen:
Das QTController Verzeichnis liegt auf dem Testcontroller unter dem Pfad “C:\Users\{Benutzer}\AppData\Local\VSEQT\QTController”.
Seitens Microsoft gibt es für dieses Problem keine “saubere” Lösung, in MSDN Foren wird empfohlen ein Batch-Datei aufzusetzen, die das Aufräumen in regelmäßigen Abständen übernimmt.
Batch File Inhalt
rmdir /s /q "C:\Users\{user}\AppData\Local\VSEQT\QTController"
Das Batch-File kann dann von der Aufgabenplanung (taskschd.msc) in benötigten Zeitintervallen aufgerufen werden, bei uns hat sich ein Aufruf alle 2 Wochen, als ausreichend erwiesen. Das hängt aber von der Größe der Partition und der Anzahl der Testfälle ab (bzw. Größe der mitgegebenen Assembly- / Testfiles).
Durch Visual Studio 2012 haben sich einige Menüs und Funktionen im Testbereich geändert.
Mehrere Dialoge, wie Test View und Test List Editor, wurden jetzt zu einem Test Explorer zusammengefasst.
Menu “Test”-”Fenster” Visual Studio 2010

Menu “Test”-”Fenster” Visual Studio 2012

Leider hat der neue Testexplorer nicht mehr die Funktionen, die in der Test View möglich waren. Neben der fehlenden Gruppierung der Testfälle nach Klassen oder Projekt, gibt es im Testfall Contextmenü in Visual Studio 2012 keine Möglichkeit mehr, eine Testmethode mit einem Testfall in TFS zu “verknüpfen”.
Kontextmenü Testfall Visual Studio 2010

Kontextmenü Testfall Visual Studio 2012

Um die Testmethoden mit einem Test Case zu verknüpfen sind folgende Schritte in Visual Studio 2012 notwendig:


Bei manchen Testfällen ist es notwendig die aktuelle Hintergrundfarbe eines Oberflächenelements zu ermitteln.
WinForms / VB6 / usw. Oberflächen stellen diesen Wert nicht als Eigenschaft bereit, aus diesem Grund muss dieser Wert über einen anderen Weg abgefragt werden.
Der einfachste Weg ist es, ein Screenshot des Elements zu erzeugen und diesen dann mit der GetPixel Methode abfragen.
Ranorex stellt dazu z.B. die Methode
Report.Screenshot(element);
bereit.
Bei dieser Methode wird allerdings das Bild lokal gespeichert, dieses Vorgehen ist etwas fehleranfällig und vor allem unnötig.
Nach einer längerer Suche, bin ich auf die Methode Imaging.CaptureCompressedImage() gestoßen, diese liefert ein Bitmap Objekt zur Laufzeit zurück, ohne dass Bilder lokal gespeichert werden müssen.
Als Parameter kann ein Element vom Typ Adapter oder Element übergeben werden.
Hier ist eine Beispiels-Methode, mit der vom übergebenen Control die Hintergrundfarben ermittelt werden können.
Natürlich können auch die Pixel verändert bzw. parametrisiert werden.
public static string Color(Adapter ui_control)
{
Bitmap bmp = Imaging.CaptureCompressedImage(ui_control);
Color cElementColor = bmp.GetPixel(2, 2);
return cElementColor.Name;
}
Leider ist die Kultur der Testautomatisierung in Deutschland (noch?) nicht so sehr verbereitet wie in anderen Ländern. So gibt es, neben gut ausgebauten und “lebendigen” Foren, auch Magazine, die sich speziell dem Thema Testautomatisierung widmen.
Unter dem folgenden Link ist ein gutes “Testautomatisierungs – Magazin”, der Webseite automatedtestinginstitute.com, zu finden:
Automated Software Testing Magazige – PDF Datei
Themen u.a. sind:
Manchmal ist es notwendig, dass einzelne Testfälle länger als 30 Minuten laufen. Die Durchführungszeit wird aber, per default, von MTM auf 30 Minuten festgelegt
Default TimeOut der Testdurchführung aus Microsoft Testmanager, wird in den Test Settings festgelegt.
Mit folgenden Schritten, kann die TimeOut Zeit angepasst werden:
Bei der Automatisierung einer Web-Applikation mit Ranorex, bin ich vor kurzem auf folgendes Problem gestoßen:
Die Tabelle besteht aus ca 10 Zeilen und 2 Header Zeilen.
Um einen flexibelen Zugriff zu ermöglichen, setze ich mir den Ranorex Pfad (Ranorex XPath) selbst zusammen.
Der Zugriff sollte in diesem Fall über “Zeilen / Spalten – Nummer” aus Sicht der Tabellenebene stattfinden.
Das Element setzte sich so zusammen:
element = tablepath + "//tr[" + row + "]/td[" + column + "]";
Alles soweit in Ordnung. Variablen row = 1 und column = 3 gesetzt, Ranorex Pfad wird richtig gefüllt und die td Zelle lässt sich, mit dem generierten Pfad, durch Ranorex Spy finden.
Der Versuch dieses Element per Methode TryFindSingle() während der Testdurchführung zu finden, ist aber gescheitert.
Host.Local.TryFindSingle(element, TimeSpan.FromSeconds(time), out tdElement))
Nach einer kurzen Try/Fail-Phase, habe ich versucht die Zelle über den Ranorex Typ “WebElement” zu finden.
Dazu wird einfach das letzte Element (td) durch ein * ersetzt und mit TryFindSingle nach Typ “WebElement” gesucht.
Dadurch kann jedes Element identifiziert werden, das den Suchkriterien entspricht. Als Result kam Tag TH (Head Element) raus.
Also row = 3 (von der Anzahl höher als das letzte TH Element) gesetzt, schon hat der Zugriff über TryFindSingle() funktioniert.
Reicht als Lösung des Problems natürlich nicht aus, die ersten beiden Zeilen sollen schließlich auch angesprochen werden können. Da kommt das Element tbody ins Spiel.
Durch tbody kann hier sichergestellt werden, dass der Zugriff wirklich auf den “Content” der Tabelle stattfindet. Die Identifikation ist so eindeutig.
Also den Ranorex XPath Ausdruck angepasst, schon funktioniert die TryFindSingle() Suche fehlerfrei:
element = tablepath + "//tbody/tr[" + row + "]/td[" + column + "]";
Man könnte annehmen, dass //tr[1]/td[1] Kombination ausreichend wäre, dem war hier leider nicht so.
Warum dieser Pfad in Ranorex Spy richtig erkannt wird und per TryFindSingle() nicht, kann ich leider nicht sagen, aber durch diesen kleinen “Workaround” kann an dieser Stelle weitergearbeitet werden.
Im Ranorex Forum gibt es ein ähnliches Problem: Beitrag im Ranorex Forum
Die dort vorgeschlagenen Lösungen, haben bei diesem Problem aber keine Besserung gebracht.
Um aus Microsoft Test Manager automatisierte Testfälle (Unit Tests, Coded UI Tests, Ranorex, Selenium usw.) ansprechen zu können, müssen diese in Testmethoden “verpackt” werden.
Wie bekannt sind diese Methoden in eine Struktur des UnitTest Frameworks von Microsoft Visual Studio eingepflegt, die auch Initialisierungs- und Abschluss-Methoden bietet:
nehmen wir mal an, wir haben 2 Testklassen mit je 2 Testfällen:
Klasse1: TC1, TC2
Klasse2: TC3, TC4
Wenn wir alle Testfälle markieren und per “Run” ausführen, werden natürlich auch die einzelnen Initialize / Cleanup Methoden ausgeführt.
Wie ist die Aufrufreihenfolge der einzelnen Initialisierungs / Abschlussmethoden?
Eigentlich würde folgende Reihenfolge der Initialisierung / Abschlussmethoden “logisch” erscheinen:
Wenn die Testfälle gestartet werden, kommt aber folgende Ausgabe:
Die Klasse wird wie vermutet mit dem ersten Testfall einer Klasse initialisiert, aber erst aufgeräumt, nachdem alle Testfälle, aller Klassen, abgeschlossen sind.
Das liegt daran, dass bei der normalen Durchführung, eine Aufruf-Reihenfolge der einzelnen Testfälle nicht sichergestellt werden kann.
Muss vor dem Aufruf der zweiten Klasse sichergestellt sein, dass die erste Klasse abgeschlossen ist (z.B. Filezugriff), kann es entweder durch Ordered Tests oder durch Auslagerung der Initialisierung / Abschlusslogik in die TestInitialize / Cleanup Methoden realisiert werden.
Es kann vorkommen, dass mit einigen Werkzeugen das Expandieren des kompletten Tree’s nicht oder nur fehlerhaft funktioniert. Um nicht jedes Element auf “expandierbar” prüfen zu müssen, kann die Taste * vom Numblock auf den Oberknoten angewandt werden.
Also ein beliebiges Treeelement auswählen und * klicken. Probiert es einfach mal im Explorer aus, aber vorsicht, wählt dabei eine nicht zu tief verschachtelte Struktur, da sonst der Explorer sich aufhängen kann.
Es ist von Werkzeug zu Werkzeug unterschiedlich wie dieser Befehl an die Oberfläche übergeben werden kann. In VisualStudio kann der Befehl SendKeys() mit Parameter {MULTIPLY} auf einem Oberknoten verwendet werden.
Um einen Zeichen auf einer bestimmten Position in einem String zu ermitteln, kann die Funktion Mid verwendet werden.
Hier ein kleines Beispiel, wie jedes Zeichen eines Strings nacheinander ausgegeben werden kann:
For i=1 to Len("Tomate")
msgbox Mid("Tomate", i, 1)
Next