如何获得受测试应用程序的引用?

时间:2017-02-27 03:50:32

标签: c# xamarin specflow ui-testing

我正在使用specflow与NUnit测试运行器。当我编写我的要素文件并要求specflow生成步骤时,它会输出以下代码:

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();
        }
    }
}

这很好,我知道这些是"步骤"当我的黄瓜文件用Gherkin编写的场景调用它们时,将调用它。

然而,由于这是一个完全集成的UI测试,我需要能够使用Xamarin.UITest.Android来点击视图等。

因此,我需要以某种方式获取代表正在测试的应用程序的对象,以便我可以对其执行UI操作。

现在,我可以看到这个对象正在另一个自动生成的测试夹具文件中初始化,该文件名为" 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.");
        }
    }
}

我可以看到属性AndroidApp app是我需要访问的对象,但是如何从上面的CategoryPagerSteps代码访问该属性? Tests不是静态的,也不是任何方法或属性。我自己简单地实例化它是紧张的,因为这应该由测试运行员完成,对吧?其中一个自动生成的文件包含testRunner属性,但它被标记为私有。

因此,我所走过的每条大道都被堵住了,我觉得我错过了一些明显的东西。

2 个答案:

答案 0 :(得分:0)

以下是我解决它的方法,以防其他人发现它有用:

跟踪来自arteksoftware的@CheeseBaron提供的link,诀窍是使用SpecFlow的FeatureContext.Current来保存该值。这是FeatureContext

的预期用途之一

arteksoftware的引用使用了这种方法,如下面的代码所示:

[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);
}

但是,它对我来说不起作用,因为[Setup]绑定不会作为specflow测试的一部分调用。更改绑定到SpecFlow [BeforeFeature]绑定并使方法静态解决了问题。

[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);
}

然后,在功能代码本身中,可以从FeatureContext字典中提取应用程序,如下所示:

[Binding]
public class FeatureSteps
{
    AndroidApp app;

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

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

我认为选择一个测试运行器与使用的绑定有关,所以这是我的“App.config”。我正在使用NUnit和SpecFlow插件。我没有尝试其他测试运行器配置。

<?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>

答案 1 :(得分:0)

上述https://github.com/RobGibbens/BddWithXamarinUITest的回购协议最近一次更新是在2015年,我建议使用POP架构。

在这里看看-具有SpecFlow https://github.com/xamarin-automation-service/uitest-specflow-example的POP体系结构

您会看到有一个名为AppManager的静态类,它具有App属性

有很多关于这种风格的视频和博客文章: