Xamarin 单元测试查询

Queries on Unit Testing in Xamarin

我正在为 Xamarin 上的 Android、Windows Desktop 8.1、WinPhone 8.1、iOS 开发跨平台应用程序,现在添加了测试项目。我浏览了 UITests 的多种资源,但有以下疑问。如果有人能纠正我,这可能会有所帮助。

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

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

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

  1. 如何合并 UITest 项目和原生测试项目?像普通的可移植库被原生项目引用。

提前致谢

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

    UI测试将在 device/emulator 中部署和 运行 应用程序,然后 运行 针对该应用程序进行测试。对于正在测试的 iOS 个应用程序,它将为您启动模拟器。对于正在测试的 Android 个应用程序,您必须自己启动模拟器。如果它们是不同的 Android 应用程序,那么每个 Android 应用程序的 UI 测试可能会有所不同,因此将 UI 测试保留为单独的项目似乎是合理的,特别是如果您正在上传对 Xamarin 测试云的测试。

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

  2. 对于两个不同的 Android 项目,您可以为每个 Android 项目创建一个 UITest 项目,或者您需要指定 .测试中的 apk 文件,使用 ConfigureApp.Android.ApkFile (),就像您在代码示例中所做的那样。

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

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

    有关 Xamarin 开发人员指南的 Adding UITest to a solution 中提供了更多信息。

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

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

    如果本机测试项目本质上是 NUnit 项目,则可以将它们结合起来。 UI测试项目基本上是一个 NUnit 项目。它引用了 NUnit,是一个 class 库。如果您的本机测试可以 运行 来自 NUnit 项目,那么您可以将它们组合起来。但是,您将无法 运行 Xamarin 测试云中的本机测试。

    如果本机测试项目不使用 NUnit,则不能将它们与 UI测试项目组合。

关于第 4 点

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

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

  • 用户输入username/password

  • 点击登录按钮

  • 重定向到已填充数据的已验证屏幕

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

所以我推出了一个 nuget 库,可以简单地实现这一点,还可以使用 specflow 提供 Bdd。测试 运行 作为 nunit 测试 vs 测试 shell,或任何 nunit 控制台 运行ners(例如在 Team City 等构建服务器中)。

示例:

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