2016-04-12 6 views
1

Um mehr Details zu geben, haben wir eine Reihe von Tests, die wir in drei Frameworks duplizieren wollen (mit Selen für die UI-Stimulation): IE, Mozilla und Chrome. Die erste Lösung bestand darin, die Tests in separaten Testklassen zu duplizieren, d. H. Jede Testklasse hatte die gleichen 20 Testfälle mit einem anderen Framework im Konstruktor. Die zweite Lösung wurde zu parametrisierten Eingänge (oder eine XUnit Theorie) zu verwenden, um mit jedem Rahmentyp als Eingang:Wie kann ich automatisierte Integrationstests über mehrere Frameworks (Internet-Browser) hinweg verwenden, ohne dass der Aufwand verdoppelt wird?

/// <summary> 
    /// The non-default constructor that initializes 
    /// necessary instances of objects that are being used 
    /// </summary> 
    public VerifyViewUsingChrome() { 
     _testBases = new Dictionary<FunctionalTestBase.DriverType, TestBase>(); 
     _testBases.Add(FunctionalTestBase.DriverType.Chrome, new TestBase(FunctionalTestBase.DriverType.Chrome)); 
     _testBases.Add(FunctionalTestBase.DriverType.IE, new TestBase(FunctionalTestBase.DriverType.IE)); 
     _testBases.Add(FunctionalTestBase.DriverType.FireFox, new TestBase(FunctionalTestBase.DriverType.FireFox)); 
    } 


    /// <summary> 
    /// Our simple country display test. 
    /// </summary> 
    [InlineData(FunctionalTestBase.DriverType.Chrome)] 
    [InlineData(FunctionalTestBase.DriverType.FireFox)] 
    [InlineData(FunctionalTestBase.DriverType.IE)] 
    [Theory] 
    public void TestADisplayedForACountry(FunctionalTestBase.DriverType testBase) { 
     _testBases[testBase].TestADisplayedForACountry(); 
    } 

Das Problem bei dieser Implementierung ist, dass alle 3 Implementierungen für jeden Test ausgeführt werden müssen, die einige erfordert Overhead. Im Idealfall würden wir alle IE-Tests durchführen, dann das Firefox-Framework erstellen und diese Tests durchführen, bevor wir mit Chrome fortfahren.

Es kann nicht möglich sein, ein Testframework zu verwenden, aber wir haben praktische Verbindungen mit unserem Buildserver, so dass das Testformat ideal wäre.

+1

Verwenden Sie Selen? – trailmax

+0

Ja. So stimulieren wir die Benutzeroberfläche. –

+1

Vielleicht hätte das in der Frage oder den Tags erwähnt werden sollen. Aber jetzt ist es kein Problem - Sie haben die Lösung gefunden, die zu Ihnen passt. – trailmax

Antwort

1

Ich habe gerade festgestellt, dass die Lösung einfacher war, als ich dachte. Der Konstruktor wird vor jedem Test aufgerufen, so dass der Start und Abbruch des Frameworks unabhängig davon erfolgt, wie die Tests ausgeführt werden (was sinnvoll ist, da Sie keine Durchblutung von vorherigen Tests wünschen). Hier

ist, was wir tun entscheiden: genau

/// <summary> 
    /// The non-default constructor that initializes 
    /// necessary instances of objects that are being used 
    /// </summary> 
    public VerifyViewUsing() { } 


    /// <summary> 
    /// Our simple country display test. 
    /// </summary> 
    [InlineData(FunctionalTestBase.DriverType.Chrome)] 
    [InlineData(FunctionalTestBase.DriverType.FireFox)] 
    [InlineData(FunctionalTestBase.DriverType.IE)] 
    [Theory] 
    public void TestADisplayedForACountry(FunctionalTestBase.DriverType testBaseType) { 
     TestBase testBase = new TestBase(testBaseType); 
     testBase.TestADisplayedForACountry(); 
    } 

Dies funktioniert so ziemlich, wie wir wollten es. Jeder Test ist unabhängig, wird über Frameworks dupliziert und mit den Ergebnissen ausgeführt, die mit dem verwendeten Framework verknüpft sind.

Edit: Eine tatsächliche bessere Methode wäre dies:

public static IEnumerable<object[]> DriverTypes { 
     get { 
      // Or this could read from a file. :) 
      return new[] 
      { 
       new object[] { FunctionalTestBase.DriverType.Chrome }, 
       new object[] { FunctionalTestBase.DriverType.IE}, 
       new object[] { FunctionalTestBase.DriverType.FireFox} 
      }; 
     } 
    } 
    /// <summary> 
    /// Verifies that Brucellosis is displayed in the Disease List for 
    /// Zimbabwe 
    /// </summary> 
    [Theory, MemberData("DriverTypes")] 
    public void TestClickingADiseaseLinkDisplaysACreatePage(FunctionalTestBase.DriverType testBaseType) { 
     TestBase testBase = new TestBase(testBaseType); 
     testBase.TestClickingADiseaseLinkDisplaysACreatePage(); 
    } 

Auf diese Weise können Sie Ihre Frameworks eine Zeit definieren, und sie über das Projekt.