对Xamarin中单元测试的疑问

时间:2015-12-30 05:37:05

标签: xamarin cross-platform ui-testing

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

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

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

    1. 如何组合UITest项目和本机测试项目?就像普通的可移植库一样,由本机项目引用。
    2. 提前致谢

2 个答案:

答案 0 :(得分:1)

关于第4点。

目前,针对Xamarin.Forms运行控制台UnitTests,即在独立于UI的情况下测试ViewModel,命令和导航需要相当多的设置。在完全隔离Xamarin.Forms框架的情况下测试ViewModes不允许跨多个ViewModel进行测试。

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

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

    不起作用,因为它需要在viewmodel导航上有一个钩子,因此测试可以在Login ViewModel上进行身份验证,然后导航并初始化Authenticated ViewModel。

所以我推出了一个nuget库,它允许简单地实现这一点,并且还使用specflow提供Bdd。测试在vs测试shell或任何nunit控制台运行程序(例如Team City等构建服务器)中作为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

答案 1 :(得分:0)

  1. 我不确定我是否理解这个问题。

    UITest将在设备/模拟器中部署并运行应用程序,然后针对该应用程序运行测试。对于正在测试的iOS应用程序,它将为您启动模拟器。对于正在测试的Android应用,您必须自己启动模拟器。如果它们是不同的Android应用程序,则可能每个Android应用程序的UITests都不同,因此将UITests保持为单独的项目似乎是合理的,特别是如果您将测试上载到Xamarin Test Cloud。

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

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

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

    您需要做的是让UITest项目引用Android项目。但是它需要一种特殊类型的引用,因此您需要使用Xamarin Studio来执行此操作。您可以从Unit Tests窗口添加此特殊类型的引用,方法是找到Test Apps项,选择Add App Project,然后选择Android和/或iOS项目。

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

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

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

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

    如果原生测试项目不使用NUnit,则无法将它们与UITest项目结合使用。