在Visual Studio 2017中进行Xamarin(Android)单元测试

5
我正在使用Visual Studio 2017来开发Xamarin Android应用程序。我想添加仅包含逻辑的简单单元测试。为此,我尝试添加“Unit Test App(Android)”或“Class Library(Android)”项目以进行单元测试,但它们都无法正常工作。

Unit Test App (Android)

我在解决方案中添加了一个类型为“Unit Test App(Android)”的新项目。生成的项目包含带有示例测试的TestsSample类,但我不知道如何启动它们。我已安装了ReSharper,但右键单击项目/类时没有运行测试的选项。 当我进入“Test” ->“Run” ->“All tests”时,会构建解决方案,但什么也没有发生。

Class Library (Android) with nUnit

另一种尝试是在解决方案中添加新项目类型为“Class Library(Android)”。然后,我安装了nUnit nuget包(install-package nunit),该包成功地安装到了'MoneyBack.Tests'项目中,针对'MonoAndroid,Version=v6.0'。 我添加了以下类:

using NUnit.Framework;

namespace MoneyBack.Tests
{
    [TestFixture]
    public class Class1
    {
        [Test]
        public void SampleTest()
        {
            Assert.IsTrue(true);
        }
    }
}

现在右键单击测试项目时,我看到 ReSharper 的选项“运行单元测试”,所以我点击了它,并得到了以下异常:TargetInvocationException 我做错了什么吗?或者这是 VS2017 的问题?我不知道是否应该重新安装 VS2015 或是否有一些解决方案。谢谢您的帮助!

3
一款“Unit Test App (Android)”项目需要在设备/模拟器上运行,因为它需要使用Xamarin.Android框架才能运行。此外还需要NUnit 2.6.x - SushiHangover
请复制并粘贴异常信息,而不是发布屏幕截图。 - Code-Apprentice
我无法复制粘贴这个异常,因为它是一个没有文本框的窗口... @SushiHangover 即使需要模拟器,它也应该启动它,而不是抛出异常,对吧?顺便说一下,我只想测试我的平台无关逻辑,我是否总是需要在设备上运行测试?即使是这样,我也做不到。 - Dawid Sibiński
@DawidSibinski 平台无关的逻辑测试应该放在标准/PCL NUnit/XUnit/... 测试项目中。至于你的 Unit Test App (Android) project,请设置一个 Android 设备/模拟器目标并构建/运行应用程序(Resharper 对 Xamarin 特定设备测试一无所知)。 - SushiHangover
@SushiHangover 哦,你看,我添加了“单元测试项目(.NET Framework)”,它可以工作!谢谢!这就是我一直在寻找的。但是,我仍然无法在设备上启动这些测试... - Dawid Sibiński
显示剩余3条评论
3个回答

17

测试有三个基本层次:

.Net/Mono 代码经典单元测试,使用 xUnit|NUnit 进行

  • 这不是什么新东西,与 .Net 程序员一直在做的测试相同,并且与 Xamarin 平台框架无关

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

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

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

注意:这些测试可以包括平台相关功能(网络、蓝牙、GPS、SMS 等),也可以引用基于 PCL 的程序集或特定于平台的库中编写的 Nunit [Test]s。

NUnitLite 的替代品:

UI 测试

使用 Casabash/Appium/... 进行测试,测试应用程序中的 UI 元素以及它们对于输入(触摸)事件的反应。

  • 测试云、Mobile Center 和/或其他本地、公共或私有移动测试云

  • Xamarin Test Cloud


感谢您提供如此全面的答案 :) 因此,对于这三个级别中的每一个,您都要在解决方案中创建一个单独的项目吗?在Android开发中,最佳实践是始终只有纯.NET/Mono单元测试+特定平台测试项目吗?UI测试常见且被认为是最佳实践吗? - Dawid Sibiński
UI测试普遍吗?也被视为最佳实践吗? 绝对是的...由于许多API级别,屏幕分辨率,内存和设备功能数量众多的Android设备制造商/供应商,UI测试成为强烈要求,不应被忽视。 - SushiHangover
我通常创建包含我的测试的“共享项目”(一个用于特定平台,另一个用于纯 .Net Framework 测试),然后可以将这些项目包含到特定平台的测试应用程序中,以便重新测试我的“纯 .Net Framework”代码,因为 Mono 和 .Net 之间存在差异(例如 HttpClient 实现),我还可以在 iOS、Android、Mac、UWP 等测试包装器之间共享这些测试。 - SushiHangover
你测试多少以及什么内容取决于你的项目目标和设计。我倾向于只使用MVVM(或VIPER)作为设计/代码模式,因此在我的回答中,每个测试级别中测试的内容往往非常自然。当使用基于VIPER的设计时,我们可以在UI下方的应用程序的每个部分上进行测试驱动开发(TDD),而无需编写一行GUI代码,因为所有内容都是可模拟的。但同样,真正的情况取决于你(和任何团队)如何设计/编写应用程序,希望测试不会成为一个思考之后才做的事情,否则将导致糟糕的App Store评论和愤怒的客户;-) - SushiHangover
比赛名为DajSiePoznac(英文:GetNoticed)。您可以在我的博客上找到更多细节:http://www.dsibinski.pl/dajsiepoznac-2017/。我的博客是用英语写的,我在其中写了关于项目和比赛的内容(因为写博客是比赛的目标之一),所以我邀请您去看看 :) - Dawid Sibiński
显示剩余2条评论

1

测试是从设备本身运行的,而不是像我们习惯的直接从代码运行。请按照以下步骤操作: 1. 将您的Android项目设置为VS启动项目 2. 选择您要执行单元测试项目的硬件或模拟器 3. 运行它 4. 单元测试项目将被部署并在设备上执行。 5. 点击带有项目名称的行。可用的测试将出现。点击每个测试以进行执行和调试! :)


0
  1. 你需要安装nUnit 2.6.X才能使用xamarin.UItest。
  2. nUnit 3不受支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接