2015-12-30 48 views
1

我正在为Xamarin上的Android,Windows Desktop 8.1,WinPhone 8.1,iOS开发跨平台的应用程序,现在添加了测试项目。我经历了多个UITests资源,但有以下查询。如果有人能纠正我,这可能会有所帮助。Xamarin中的单元测试查询

  1. 类型Android测试项目,Windows Phone测试,iOS测试存在。当这些运行时,这些作为设备/仿真器中的应用程序执行。那么,这些测试原始应用程序将如何在同一设备上运行?
  2. 如果我有两个不同的android项目,我如何在上面的测试项目中指定要测试哪一个?
  3. 我还添加了UITest项目,它是类库项目。在此,我可以使用下面的代码提apk文件:

    [SetUp] public void BeforeEachTest() { app = ConfigureApp.Android.ApkFile(@"Path\to\apk\com.namespace.apk") .DeviceSerial("emulator-1234") .StartApp(); }

如何引用一个项目来测试而不是.apk文件,所以我每次运行测试时间修改项目?

  1. 如何将UITest项目和本机测试项目结合使用?像常见的便携式库一样,被本地项目引用。

在此先感谢

回答

0
  1. 不知道我理解这个问题。

    UITest将在设备/模拟器中部署并运行应用程序,然后将针对该应用程序运行测试。对于正在测试的iOS应用程序,它将为您启动模拟器。对于正在测试的Android应用程序,您必须自己启动模拟器。如果他们是不同的Android应用程序,那么大概每个Android应用程序的UITests都会有所不同,所以将UITests保存为单独的项目似乎是合理的,特别是如果您要将测试上传到Xamarin测试云。

    另请注意,UITest目前不支持Windows Phone项目,因此它只能用于测试您的Android和iOS项目。

  2. 有了两个不同的Android项目,您可以为每个Android项目创建一个UITest项目,或者您需要使用ConfigureApp.Android.ApkFile()来指定测试中.apk文件的路径在代码示例中完成。

  3. 如果您使用Xamarin Studio,则可以直接在IDE中运行UITest,而无需指定.apk文件或iOS .app的完整路径。

    你需要做的是让UITest项目引用Android项目。但是它需要一种特殊类型的参考,因此您需要使用Xamarin Studio来执行此操作。您可以从单元测试窗口中添加这种特殊类型的参考,方法是找到测试应用项目,选择添加应用项目,然后选择Android和/或iOS项目。

    有关Xamarin开发人员指南的更多信息,请参阅Adding UITest to a solution

    请注意,您可以让一个UITest项目测试iOS和Android应用程序。假设它们都是同一个应用程序。但是,您可能需要创建Android和iOS特定的UI测试查询以在屏幕上查找UI元素。

  4. 首先,您应该问问自己,您是否确实需要将UITest与本地测试项目结合使用。例如UITest可能需要很长时间才能运行,所以如果你有一些快速的单元测试,你可能不希望将它们一起运行。

    如果本地测试项目本质上是NUnit项目,则可以将它们结合使用。 UITest项目基本上是一个NUnit项目。它有一个对NUnit的引用,并且是一个类库。如果您的本机测试可以从NUnit项目运行,那么您可以将它们组合起来。但是,您将无法在Xamarin的测试云中运行本机测试。

    如果本机测试项目不使用NUnit,那么您不能将它们与UITest项目组合。

1

关于点4

目前,运行针对Xamarin.Forms控制台单元测试,即在UI的隔离测试视图模型,命令和导航需要建立公平一点。在完全隔离Xamarin.Forms框架的情况下测试ViewModels将不允许跨多个ViewModel进行测试。

例如,测试在完全隔离的登录视图模型,其中:

  • 用户输入用户名/密码,
  • 点击登录按钮
  • 重定向到他们的数据验证屏幕填充

    将不起作用,因为这需要视图模型导航上的钩子,因此测试可以在Login ViewModel上进行身份验证,然后导航并初始化Authenticated ViewModel。

所以我把出的NuGet库,允许简单地实现这一点,并且还使用specflow提供BDD。测试在vs测试shell或任何nunit控制台运行程序(例如在Team City等Build Server中)上作为nunit测试运行。

实施例:

public class GeneralSteps : TestStepBase 
{ 
    public GeneralSteps(ScenarioContext scenarioContext) 
     : base(scenarioContext) 
    { 
     // you need to instantiate your steps by passing the scenarioContext to the base 
    } 

    [Given(@"I am on the main view")] 
    public void GivenIAmOnTheMainView() 
    { 
     Resolver.Instance.Resolve<INavigationService>().PushAsync<MainViewMode>();   
     Resolver.Instance.Resolve<INavigationService>().CurrentViewModelType.ShouldEqualType<MainViewModel>(); 
    } 

    [When(@"I click on the button")] 
    public void WhenIClickOnTheButton() 
    { 
     GetCurrentViewModel<MainViewModel>().GetTextCommand.Execute(null); 
    } 

    [Then(@"I can see a Label with text ""(.*)""")] 
    public void ThenICanSeeALabelWithText(string text) 
    {   
     GetCurrentViewModel<MainViewModel>().Text.ShouldEqual(text); 
    } 
} 

步说明here NuGet包here