我正在使用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属性,但它被标记为私有。
因此,我所走过的每条大道都被堵住了,我觉得我错过了一些明显的东西。
答案 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
属性
有很多关于这种风格的视频和博客文章: