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 包括一个在 Android
和 iOS
上运行的 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 之间存在差异(例如 HttpClient
implementations),我还可以在 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 2015/2017 中的 TSLint?
Visual Studio 2017 中的 Nuget CLI - 如何运行?