2012-04-13 8 views
1

Ich bin ein Tester mit Automatisierung arbeiten und vor kurzem in Webdriver und ich habe die Idee mit pageObjects und wie man Tests mit Nunit zum Beispiel. Mein Problem ist, dass ich Tests in einer vordefinierten Reihenfolge nicht ausführen möchte. Die GUI-Automatisierungslösung, die wir derzeit verwenden, verwendet das ModelBasedTesting-Tool GraphWalker, um die Testsequenz bei der Ausführung zu generieren, und ich möchte mit diesem Ansatz fortfahren.Dynamisch auswählen Tests mit Webtreiber

Es funktioniert so kurz: Ein Graph enthält action- und Verificationsteps und einige Logik, um zu bestimmen, wie man "den Graphen" geht. Jeder Schritt stellt eine Methode dar, die im Webdriver ausgeführt werden soll.

Ich könnte natürlich eine Menge Methoden machen und sie einzeln aufrufen, aber dann hätte ich nicht die nette Unterstützung eines Test-Frameworks wie Nunit oder der Struktur von PageObjects.

Was ich (glaube) ich möchte ist:

[TestFixture] 
public abstract class LoginTest : TestFixtureBase 
{ 
    [Test] 
    public void e_test1() 
    { 
     loginPage = PageBase.GetInstance<Login>(driver, "Title");     
     accountHome = loginPage.MainLogin(username, password); 
     Assert.IsTrue(accountHome.UserLoggedIn(),"fail"); 
    } 
    [Test] 
    public void v_test1() 
    { 
     loginPage = accountHome.LogOut(); 
     Assert.IsTrue(loginPage.UserLoggedOut(), "Fail"); 
    } 
    . 
    . 
    . 
    [Test] 
    public void e_testN() 
    { 
     //Do something 
    } 

Und dann, wenn ich die Grafik laufen es gibt mir „e_test2“ als ersten Schritt und dem magischen Code läuft e_test2(). Der nächste Schritt ist "v_test1", so dass der Test ausgeführt wird. Wer weiß, wie man das macht?

Update: Ich habe versucht, das TestCaseSource-Attribut und funktionierte es, aber nur, wenn es das Diagramm vor dem Test ausführt und die vollständige Sequenz zurückgibt. Ich bin auf der Suche nach einer Möglichkeit, einen Schritt zur Zeit "online" auszuführen. Dies funktioniert:

[Test, TestCaseSource("RunModel")] 
    public void LoginAndOut(string method) 
    { 
     object obj = this.GetType().InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, this, null); 
    } 

    public string[] RunModel() 
    { 
     List<string> methods = new List<string>(); 
     while (Model.graphWalker.HasNextStep()) 
     { 
      methods.Add(Model.graphWalker.GetNextStep().ToString()); 
     } 
     return methods.ToArray(); 
    } 

aber ich möchte etwas erreichen möchte:

while (Model.graphWalker.HasNextStep()) 
     { //Get next method from GraphWalker Soap-service. 
      nextMethodToRun = Model.graphWalker.GetNextStep().ToString()); 
      //handle Method result, if ok continue. 
     } 

Antwort

1

NUnit gefunden und die Lösung mit Gallio/MbUtnit und DynamicTestFactory gefunden. funktioniert genauso wie beabsichtigt.

[DynamicTestFactory] 
    public IEnumerable<Test> LoginAndOut() 
    { 
     string method; 
     while (Model.graphWalker.HasNextStep()) 
     { 
      method=Model.graphWalker.GetNextStep().ToString(); 
      if (method == string.Empty) 
       break; 
      yield return new TestCase(method,() => 
       { 
        object obj = this.GetType().InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, this, null); 
       }); 
     } 
    } 
0

Sie würden benötigen einen Adapter zwischen GraphWalker und Ihren Code erstellen - analysieren den Pfad durch GraphWalker und starten Sie die erstellt benötigte Testmethoden entsprechend, dh erstellen Sie eine Instanz Ihrer Testklasse (sie könnte dann nicht abstrakt sein) und rufen Sie die erforderlichen Methoden auf.

+0

Ich möchte immer noch für NUnit die Tests ausführen, um die Testergebnisdaten "kostenlos" zu erhalten. Wenn ich meine Konsole-App die Tests (über GraphWalker) ausführen lassen würde, müsste ich mein eigenes Berichterstellungstool erstellen und die anderen netten Funktionen von NUnit nicht verwenden. – Johan

Verwandte Themen