Xamarin 中的单元测试查询

Posted

技术标签:

【中文标题】Xamarin 中的单元测试查询【英文标题】:Queries on Unit Testing in Xamarin 【发布时间】:2015-12-30 05:37:04 【问题描述】:

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

    存在 Android 测试、Windows Phone 测试、iOS 测试类型的项目。当这些运行时,它们作为设备/模拟器中的应用程序执行。那么,如何测试在同一设备上运行的原始应用? 如果我有两个不同的android项目,如何在上面的测试项目中指定要测试哪一个?

    我还添加了 UITest 项目,它是类库项目。在此我可以使用以下代码提及 apk 文件:

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

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

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

提前致谢

【问题讨论】:

【参考方案1】:

关于第 4 点。

目前,针对 Xamarin.Forms 运行控制台 UnitTests,即在 UI 隔离的情况下测试 ViewModel、命令和导航需要相当多的设置。在完全隔离 Xamarin.Forms 框架的情况下测试 ViewModel 不允许跨多个 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

【讨论】:

【参考方案2】:

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

    UITest 将在设备/模拟器中部署和运行应用,然后针对该应用运行测试。对于正在测试的 iOS 应用程序,它将为您启动模拟器。对于正在测试的 Android 应用程序,您必须自己启动模拟器。如果它们是不同的 Android 应用程序,那么每个 Android 应用程序的 UITests 可能会有所不同,因此将 UITests 保留为单独的项目似乎是合理的,尤其是当您将测试上传到 Xamarin Test Cloud 时。

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

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

    如果您使用的是 Xamarin Studio,则可以直接在 IDE 中运行 UITest,而无需指定 .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 元素。

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

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

    如果原生测试项目不使用 NUnit,那么你不能将它们与 UITest 项目结合起来。

【讨论】:

以上是关于Xamarin 中的单元测试查询的主要内容,如果未能解决你的问题,请参考以下文章

对 Xamarin Forms Android 特定代码项目进行单元测试

如何为 Xamarin 库项目(iOS 和 Android)运行单元测试?

使用 PCL 和 Xamarin 对 Azure 移动服务执行单元测试时程序集版本不匹配

Python 中的 Redshift 连接单元测试

在 monotouch/monodroid 中使用 mocks 进行单元测试

如何在 Gatsby 中对 GraphQL 查询进行单元测试