Ich habe gelernt, dass es eine Reihe von Schlüsselfaktoren gibt, um leicht zu wartende, zuverlässige automatisierte Tests zu haben.

Ordnet die Steuerelemente an einer einzigen Stelle zu

Eure Steuerelemente sollten an einer einzigen Stelle abgebildet werden, sodass ihr bei einer Änderung eines Steuerelements dieses nur an einer einzigen Stelle ändern müsst. Wenn sich ein Steuerelement an einer einzigen Stelle befindet, könnt ihr eine einzeilige Codeänderung vornehmen, wenn ein Entwickler die Steuerelemente neu zuordnet. Ich ordne auch den Typ des Steuerelements zu, sodass der Entwickler von einem Link zu einer Schaltfläche wechseln kann und ich nur diese Steuerdatei zu ändern brauche.

Versteckt nebensächliche Details

Versteckt nebensächliche Details. Jedes Detail, das nicht direkt mit dem Zweck eures Tests zusammenhängt, gehört an einen anderen Ort als in euren Test. Versteckt es lieber irgendwo, z. B. in einer Variablen oder in einer Methode, und gebt ihm einen guten Namen.

Eliminiert Duplikate

Eliminiert Duplikate. Jedes Bit an doppelten Daten ist eine Variable, die darauf wartet, geboren zu werden und einen aussagekräftigen Namen zu erhalten. Jede Abfolge von doppelten Testschritten ist eine Methode, die darauf wartet, geboren zu werden und einen aussagekräftigen Namen zu erhalten.

Benennt jede wichtige Idee

Benennt jede wichtige Idee. Warum meldet sich der Testcode als “F.D.Gumby” an und nicht als ein anderer Benutzer? Weil das der Manager ist, der den Mitarbeiter eingestellt hat, den Sie auf die Gehaltsliste setzen? Dann fügen Sie “F.D.Gumby” in eine Variable ein und nennen Sie sie “hiring manager” (oder wie auch immer), um ihre Absicht auszudrücken.

Abstrahiert das Testautomatisierungstool wo immer es möglich ist

Ich habe im Wesentlichen drei Aktionen, die ich 99 % der Zeit ausführe: Invoke, Setvalue und GetValue. Mit Invoke wird ein Link oder eine Schaltfläche angeklickt, ein Kontrollkästchen aktiviert oder deaktiviert usw. SetValue setzt Werte in Steuerelemente, z. B. Text in ein Textfeld. GetValue holt Daten aus den Steuerelementen, die in erster Linie zur Überprüfung verwendet werden.

Jede Automatisierungsaktion, z. B. die Durchführung einer Suche, ruft nur die Methoden invoke, Set und get auf. Dies ermöglicht eine fast vollständige Abstraktion des zugrundeliegenden Automatisierungstools und eine einzige Stelle in Ihrem Code, an der die steuerungsspezifischen Methoden der unteren Ebene aufgerufen werden.

Verwendet reguläre Ausdrücke, um eure Kontrollnamen zuzuordnen

Durch die Verwendung regulärer Ausdrücke können ihr das Steuerelement so definieren, dass der Entwickler es an eine beliebige Stelle auf der Seite verschieben kann und Ihre Tests trotzdem ausgeführt werden.

Erstellt Testdatenobjekte, um eure Testdaten zu speichern

Ich erstelle Testdatenobjekte, die normalerweise ziemlich genau 1:1 mit den Steuerelementen auf einer Seite übereinstimmen. Dann erstelle ich ein erwartetes und ein tatsächliches Objekt und leite diese Objekte an die verschiedenen Ebenen im Stapel weiter. Die Erstellung zusätzlicher Tests kann dann in einigen Fällen so einfach sein wie die Verwendung eines vorhandenen Tests mit anderen Daten.

Trennt den Test von der Implementierung

Die Trennung von Belangen ist ein wichtiges technisches Designprinzip, das ihr bei den Tests anwenden solltet. Die Absicht des Testfalls sollte so weit wie möglich von der physischen Implementierung getrennt werden, die die Interaktion mit der Seite durchführt. Zum Beispiel statt …

 

[Test] 
public void SearchOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("Stack Exchange");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("Stack Exchange - Free, Community-Powered Q&A"));
  }
}

Eure Tests sollten also auf höchster Ebene eine domänenspezifische API haben.

 

[Test] 
public void SearchOnGoogle()
{
    SearchEngine.WebSearch("Stack Exchange");
    SearchEngine.Verifcation.WebSearch("Stack Exchange - Free, Community-Powered Q&A");
  }
}

public void WebSearch(string value)
{
     ControlHandler.SetValue(Controls.txtSearchValue, value);
     ControlHandler.Invoke(Controls.btnSearch);
}

Ausführliche Informationen zu diesem Thema findet ihr in Capture The Essence Of Your Test Cases von Michael Hunter.

Durch die Anwendung dieser Prinzipien lassen sich automatisierte Regressionstests viel leichter korrigieren, wenn sich entweder die Anforderungen oder die Implementierung ändern. Weitere Einzelheiten und Beispiele finden Sie in meinem Artikel “Writing Maintainable Automated Acceptance Tests” (PDF). Siehe auch Bob Martins ausgezeichnetes Video zu denselben Ideen.