Visual Studio 2017 中的 Xamarin (Android) 单元测试

Posted

技术标签:

【中文标题】Visual Studio 2017 中的 Xamarin (Android) 单元测试【英文标题】:Xamarin (Android) Unit Tests in Visual Studio 2017 【发布时间】:2017-08-13 18:54:48 【问题描述】:

我正在使用 Visual Studio 2017 开发 Xamarin android 应用程序。我只想添加简单的逻辑单元测试。为此,我尝试添加带有单元测试的“单元测试应用程序 (Android)”或“类库 (Android)”项目,但它们都不起作用。

单元测试应用 (Android)

我将新项目添加到“单元测试应用程序 (Android)”类型的解决方案中。生成的项目包含带有示例测试的TestsSample 类,但我不知道如何启动它们。我安装了 ReSharper,但是当右键单击项目/类时,我没有运行测试的选项。 当我转到“测试”->“运行”->“所有测试”时,解决方案已构建,但没有任何反应。

带有 nUnit 的类库 (Android)

另一个试验是向解决方案添加“类库 (Android)”类型的新项目。之后,我安装了 nUnit nuget 包(install-package nunit 安装了包 'nunit.3.6.1' 相对于项目 'MoneyBack.Tests',针对 'MonoAndroid,Version=v6.0'),安装成功。

我添加了以下类:

using NUnit.Framework;

namespace MoneyBack.Tests

    [TestFixture]
    public class Class1
    
        [Test]
        public void SampleTest()
        
            Assert.IsTrue(true);
        
    

现在右键单击测试项目时,我看到 ReSharper 的选项“运行单元测试”,所以我单击它并得到以下异常:

我做错了吗?还是 VS2017 的问题?我不知道我是否应该重新安装 VS2015 或者有一些解决方案。感谢您的帮助!

【问题讨论】:

Unit Test App (Android) 项目需要在设备/模拟器上运行,因为它需要运行 Xamarin.Android 框架。 NUnit 2.6.x 也是必需的。 请在此处复制并粘贴异常,而不是发布屏幕截图。 我无法复制粘贴此异常,这是一个没有文本框的窗口... @SushiHangover 即使它需要模拟器,它也应该启动它,而不是抛出异常,对吗?顺便说一句,我只想测试我的平台无关逻辑,我是否总是需要在设备上运行测试?即使是,我也做不到.. @DawidSibinski Platform-独立逻辑测试应该在标准/PCL NUnit/XUnit/...测试项目中进行。至于您的Unit Test App (Android) project,设置 Android 设备/模拟器目标并构建/运行应用程序(Resharper 对 Xamarin 特定设备测试一无所知)。 @SushiHangover 啊,你看,我添加了“单元测试项目(.NET Framework)”,它可以工作了!谢谢!这就是我一直在寻找的。但是,我仍然无法在设备上启动这些测试... 【参考方案1】:

测试分为三个基本级别:

通过 xUnit|NUnit 对纯 .Net/Mono 代码进行经典单元测试

这里没有什么新鲜事,这是 .Net 程序员一直在做的相同测试,与 Xamarin 平台框架无关

注意:这些测试完全独立于Xamarin.Android|ios|Mac

平台测试(包括平台功能)

注意:有多个用于 NUnit、XUnit 等的设备测试包装器... Xamarin 包括一个在 AndroidiOS 上运行的 NUnitLite 版本,并提供了一个特定于设备的 UI 来运行这些测试。 Xamarin 具有为 Android 或 iOS 创建 Unit Test App 项目的模板。

注意:这些测试可以包括与平台相关的功能(网络、蓝牙、GPS、SMS 等...但没有与 GUI 相关的测试),还可以引用 Nunit [Test]s 以基于 PCL 的程序集或特定于平台的方式编写图书馆。

Xamarin.iOS Unit Testing Xamarin.Mac Unit Testing via GUIUnit Xamarin.Android Setup and Automating NUnitLite 的替代品: xUnit.net Runners for Devices NUnit test runners for Xamarin and mobile devices

界面测试

Casbash/Appium/... 对应用程序中的 UI 元素及其对输入(触摸)事件的反应进行驱动测试。

测试云/移动中心和/或其他本地、公共或私有移动测试云

Xamarin Test Cloud

【讨论】:

感谢您提供如此全面的回答 :) 那么对于这三个级别中的每一个级别,您都需要在解决方案中创建一个单独的项目吗? Android 中的最佳实践是什么 - 始终只有纯 .NET/Mono + 平台特定测试项目的单元测试? UI 测试是否常见并被视为最佳实践? Are UI tests common and considered as best practice also? 绝对是的.... 有这么多的 API 级别、屏幕分辨率、内存和设备功能,大量的 Android 设备制造商/供应商,UI 测试成为一个强烈的要求,不应该被忽视。 我通常会创建包含我的测试的Shared Projects(一个用于特定于平台的测试,一个用于纯 .Net 框架测试),然后我可以将这些项目包含到特定于平台的测试应用程序中,以便重新测试我的“纯 .Net 框架”代码,因为 Mono 和 .Net 之间存在差异(例如 HttpClientimplementations),我还可以在 iOS、Android、Mac、UWP 等之间共享这些测试......测试包装器。 .. 测试的数量和内容取决于您的项目目标和设计。我倾向于只使用 MVVM(或 VIPER)作为设计/代码模式,因此在我的答案中,在这三个级别的测试中测试的内容往往是相当自然的。当使用基于 VIPER 的设计时,我们可以在 UI 下方的应用程序的每个部分进行测试驱动开发 (TDD),而无需编写一行 GUI 代码,因为 一切 都是可模拟的。但同样,这真的取决于你(和团队,如果有的话)如何设计/编码应用程序,希望测试不会是事后的想法,因为这会让糟糕的 App Store 评论和疯狂的客户;-) 当然,感谢您的见解。我正在为编程竞赛开发一个开源 Xamarin.Android 应用程序,代码已发布在 GitHub 上,所以我希望它按应有的方式完成 :)【参考方案2】:

测试是从设备本身运行的,而不是像我们习惯的那样直接从代码运行。做这个: 1.将你的android项目设置为VS启动项目 2.选择你要执行单元测试项目的硬件或模拟器 3.运行它 4. 单元测试项目将在设备中部署并执行。 5. 点击项目名称所在的行。将出现可用的测试。点击每一个执行和调试! :)

【讨论】:

【参考方案3】:
    您需要安装 nUnit 2.6.X 才能使用 xamarin.UItest。 n不支持单元 3。

【讨论】:

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

Visual Studio 2017 中的远程调试

Visual Studio 2015/2017 中的 TSLint?

Visual studio 2017怎么注册激活

Visual Studio 2017 中的 Nuget CLI - 如何运行?

visual studio 2017没法安装,总在visual studio installer界面闪推

用Xamarin和Visual Studio编写iOS App