2017-02-27 4 views
1

Ich verwende Specflow mit dem NUnit Test Runner. Wenn ich meine Funktion Datei schreiben und fragen specflow die Schritte zu erzeugen, gibt es den folgenden Code:Wie bekomme ich einen Verweis auf die zu testende Anwendung?

using System; 
using TechTalk.SpecFlow; 
using Xamarin.UITest.Android; 

namespace UITest1 
{ 
    [Binding] 
    public class CategoryPagerSteps 
    { 
     [Given(@"The (.*)st category is selected")] 
     public void GivenTheStCategoryIsSelected(int p0) 
     { 
      ScenarioContext.Current.Pending(); 
     } 

     [When(@"I swipe left")] 
     public void WhenISwipeLeft() 
     { 
      ScenarioContext.Current.Pending(); 
     } 

     [Then(@"The (.*)nd category is selected")] 
     public void ThenTheNdCategoryIsSelected(int p0) 
     { 
      ScenarioContext.Current.Pending(); 
     } 
    } 
} 

Das ist in Ordnung, und ich verstehe, dass diese „Schritte“ sind, die, wenn meine Gurke Datei mit Szenarien aufgerufen wird geschrieben in Gurkin ruft nach ihnen.

Da dies jedoch ein vollständig integrierter UI-Test ist, muss ich Xamarin.UITest.Android verwenden können, um auf Ansichten und dergleichen klicken.

Also muss ich irgendwie das Objekt greifen, das die Anwendung darstellt, die getestet wird, damit ich UI-Operationen darauf ausführen kann.

Jetzt kann ich sehen, dass dieses Objekt in einer anderen automatisch generierten Testvorrichtung Datei mit dem Namen wird initialisiert „Tests.cs“:

using NUnit.Framework; 
using Xamarin.UITest; 
using Xamarin.UITest.Android; 

namespace UITest1 
{ 
    [TestFixture] 
    public class Tests 
    { 
     AndroidApp app; 

     [SetUp] 
     public void BeforeEachTest() 
     { 
      // TODO: If the Android app being tested is included in the solution then open 
      // the Unit Tests window, right click Test Apps, select Add App Project 
      // and select the app projects that should be tested. 
      app = ConfigureApp 
       .Android 
       // TODO: Update this path to point to your Android app and uncomment the 
       // code if the app is not included in the solution. 
       //.ApkFile ("../../../Android/bin/Debug/UITestsAndroid.apk") 
       .StartApp(); 
     } 

     [Test] 
     public void AppLaunches() 
     { 
      app.Screenshot("First screen."); 
     } 
    } 
} 

Ich kann sehen, dass die Eigenschaft AndroidApp app ist das Objekt, das ich brauche, Zugriff auf, aber wie greife ich auf diese Eigenschaft aus dem Code CategoryPagerSteps oben? Tests ist nicht statisch und keine der Methoden oder Eigenschaften. Ich bin nervös, es einfach selbst zu instantiieren, weil das wahrscheinlich vom Testläufer erledigt werden sollte, oder? Eine der anderen automatisch generierten Dateien enthält eine testRunner-Eigenschaft, die jedoch als privat gekennzeichnet ist.

Also jede Straße, die ich hinunter gegangen bin, scheint blockiert und ich fühle, dass ich etwas offensichtlich vermisse.

+1

Schauen Sie sich auf: http://arteksoftware.com/bdd-tests-with-xamarin-uitest-and-specflow/ dieser Artikel in der Tiefe beschreibt, wie mit SpecFlow + Xamarin.UITest loszulegen – Cheesebaron

Antwort

0

Hier ist, wie ich es gelöst, falls jemand anders finden könnte es nützlich:

auf den link von @CheeseBaron von arteksoftware vorgesehen Anknüpfend, der Trick SpecFlow zu gebrauchen ist FeatureContext.Current den Wert zu halten. Dies ist einer der vorgesehenen Verwendungszwecke von FeatureContext.

Die von arteksoftware Referenz verwendet, um dieses Verfahren, wie in diesem Code gezeigt:

[SetUp] 
public void BeforeEachTest() 
{ 
    app = AppInitializer.StartApp (platform, iOSSimulator); 
    FeatureContext.Current.Add ("App", app); 

    //This next line is not relevant to this post. 
    AppInitializer.InitializeScreens (platform); 
} 

Es ist jedoch für mich nicht sofort funktionieren, weil die [Setup] wäre nicht verbindlich genannt werden, als Teil eines specflow Tests. Ändern der Bindung an die SpecFlow [BeforeFeature] Bindung und machen die Methode statisch das Problem gelöst.

[BeforeFeature] 
public static void Before() 
{ 
    AndroidApp app; 

    Console.WriteLine("** [BeforeFeature]"); 
    app = ConfigureApp 
     .Android 
     // TODO: Update this path to point to your Android app and uncomment the 
     // code if the app is not included in the solution. 
     .ApkFile(<Path to APK>) 
     .StartApp(); 
    FeatureContext.Current.Add("App", app); 
} 

Dann wird in der Feature-Code selbst, könnte die App aus dem FeatureContext Wörterbuch wie so extrahiert werden:

[Binding] 
public class FeatureSteps 
{ 
    AndroidApp app; 

    public FeatureSteps() 
    { 
     app = FeatureContext.Current.Get<AndroidApp>("App"); 
    } 

    //Code for the rest of your feature steps. 
} 

Ich stelle mir vor, dass die Auswahl der eigenen Testläufer zu den Bindungen relevant ist, die verwendet, also hier ist meine "App.config". Ich benutze NUnit mit einem SpecFlow-Plugin. Ich habe es nicht mit anderen Test-Runner-Konfigurationen versucht.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" /> 
    </configSections> 
    <specFlow> 
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config --> 
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config --> 
    <!-- use unit test provider SpecRun+NUnit or SpecRun+MsTest for being able to execute the tests with SpecRun and another provider --> 
    <unitTestProvider name="NUnit" /> 
    <plugins> 
     <add name="SpecRun" /> 
    </plugins> 
    </specFlow> 
</configuration> 
Verwandte Themen