Windows Phone单元测试的现状

19

我已经尽全力利用我的Google Fu,试图找到针对Windows Phone应用程序进行TDD + CI的最推荐/稳定的设置。有成功进行此操作的人可以指引我吗?

以下是我希望能够实现的内容(如果可能的话):

  • 编写不需要手机功能的视图模型和应用服务的单元测试
  • 通过Resharper或TD.NET直接在Visual Studio中执行测试
  • 通过XML输出从命令行执行单元测试,而无需启动模拟器
  • 最好对SDK更新具备弹性(就第三方库而言)

由于我希望将这个问题作为其他寻找相同答案的人的资源,请避免回答以下内容:

  • 开源项目的端口,它们要么不完整,要么已被废弃
  • 只在某人博客上作为附件提供的项目

我还希望能够进行完整的BDD风格的验收测试,但那是另一个完全不同的问题

6个回答

14

我将此答案添加为社区Wiki,以便他人可以修改以保持最新状态。

单元测试

目的:在IDE和持续集成服务器上运行隔离(无手机功能),快速执行的测试,而不需要模拟器(例如TDD视图模型)。

我在许多演示文稿中看到的推荐方法涉及在.NET 4项目中引用您的源文件并针对这些文件运行测试(引用程序集的桌面等效项)。 如果您的代码不使用与桌面BCL不同的任何API 并且您可以处理保持参考项目最新(新文件不会自动添加)的问题,那么应该就足够了。

否则,您可以按照以下步骤执行引用桌面CLR中的WP7程序集的代码:

  1. 将测试Silverlight 4类库(而不是Silverlight for Windows Phone 项目)添加到解决方案中
  2. 在类库中,将所有框架引用的Copy Local设置为true,但除了 mscorelib(基本上是System.*和Microsoft.*)
  3. NUnit-Silverlight项目中添加对NUnit.Silverlight.Framework.dllNUnit.Silverlight.Compatibility.dll的引用
  4. 将测试库引用到您的主Windows Phone项目,忽略版本警告。
  5. 使用ReSharper(已测试)或TestDriven.NET从IDE中运行测试
  6. 使用最新的NUnit发布版中的标准.NET 2.0 nunit-console.exe运行来自命令行的测试,传递/framework=v4.0

(需要许多上述解决方法是因为WP7使用SL3。一旦Mango发布了带有SL4运行时,它应该是一个更简洁的设置)

集成测试

目的:在模拟器上运行与代码外部资源(如电话功能和Web服务)交互的长时间运行测试,包括按需和在CI服务器上执行

更新:Visual Studio 2012 Update 2将正式支持Windows Phone 8应用程序单元测试,包括VS集成和命令行支持。这些测试在模拟器上运行,因此我将其归类为集成测试。

当前Silverlight测试框架的WP7版本不支持,而且只能从博客下载。

同时,我创建了一个CodePlex项目,添加了一个MSBuild任务来启动模拟器,并将结果汇总到一个XML文件中。最简单的安装方法是添加wp7-ci NuGet包

注意:在Windows Server上安装WP7 SDK 需要修改安装程序配置,并且不受支持,但可以很好地工作。

验收/系统测试

目的:在模拟器上运行与手机UI交互的端到端自动化测试,包括按需和在CI服务器上执行

Expensify的Windows Phone测试框架(因SEO而命名不佳),支持使用SpecFlow从主机PC编写UI自动化测试。


进行单元测试以获取VS项目配置的最简单方法是安装Silverlight NUnit项目模板http://www.testdriven.net/downloads/SilverlightNUnitProject.zip,并按照http://blog.clauskonrad.net/2011/05/wp7-how-to-unit-test-your-viewmodels.html中描述的方式运行它。 - Safor

3
我认为这个问题与你如何编写测试有关。
最终,一些代码必须涉及一些特定于手机的内容。这些应该作为依赖项隔离并伪造出来。我还没有找到一个合适的方法来让单元测试实际在手机本身上运行。不幸的是,这些依赖项对我来说仍然没有经过测试。
使用NUnit for Silverlight可以让你获得断言: http://code.google.com/p/nunit-silverlight/ 我已经用Resharper运行了单元测试,没有问题。同样,您可以使用nunit-console来运行测试并获得XML输出。
Ayende的Rhino Mocks for Silverlight对于模拟/存根依赖项效果很好。
持续集成有点棘手。WP7 SDK不适用于服务器平台,因此我在Windows 7上构建了一个新的CI。可能有办法解决这个限制,但我没有费心去做。
您需要的另一个工具是MVVMLight。这将允许您使用EventTrigger和ICommand而不是事件,因为测试事件需要更多的工作,并且无法通过DataContext进行绑定。
至于我如何设计我的应用程序:
ViewModel可以接收任意数量的依赖项,这些依赖项使用MicroIoC进行解析。
XAML的实际代码会解析ViewModel并将其设置为数据上下文。这很不幸,因为这意味着您无法在XAML中设置DataContext,但这是我愿意接受依赖注入的权衡:
public partial class SignUpPage
{
    public SignUpPage()
    {
        InitializeComponent();
        DataContext = IoC.Resolve<SignUpViewModel>();
    }
}

幸运的是,这是我XAML代码背后唯一出现的C#代码。从那里开始,它就是相当常规的MVVM,使用绑定和DataContext。

现在,您可以测试ViewModel,注入所需的依赖项(或伪造它们),并且它将在不在仿真器中的情况下正常运行,只要您不尝试使用某些WP7特定的东西。


你使用的是哪个版本的nunit-console?另外,你的单元测试项目是什么类型的?我的尝试使用nunit-console导致了程序集加载错误。 - Richard Szalay
我已经在使用ViewModels/IoC(尽管我在使用Funq)。 - Richard Szalay

2
这里有一个链接,指向一个人成功自动化了WP7手机上的测试,自动部署应用程序、运行测试并读取结果: http://justinangel.net/WindowsPhone7EmulatorAutomation 它使用了CoreCon API,看起来非常有趣,但当我开始尝试时,发现大多数功能都会抛出未实现的异常 - 但是还有足够的功能可以运行自动化测试。

谢谢你提供的链接,但是Justin的博客文章仅涵盖了应用程序安装的自动化。此外,我正在尝试完全避免在手机上运行代码。 - Richard Szalay

2
更新:现在正式支持Windows Phone 8的单元测试。
请参考这篇文章了解更多关于在Visual Studio 2012 Update 2中进行Windows Phone单元测试的信息。

不幸的是,它仍然不支持WP7 :( - Richard Szalay
我一直在做的是创建一个WP8项目,并将其链接到我的WP7项目中的文件。虽然不完美,但实际上它运行得非常好,我可以从命令行为我的CI服务器执行它。 - Gary Johnson

1

嗯,至少有三种不同的方法可以为Windows Phone应用程序进行TDD。

  1. Silverlight 单元测试框架 - 由 Jeff Wilcox 编写。您可以在此处查找最新更新。它似乎是最受欢迎的方法,有很多关于这种方法的信息:

    此外,请检查 Visual Studio test project template,以便您无需手动创建测试项目。但是,此解决方案需要在手机模拟器上运行测试,有时可能非常令人烦恼。

  2. 可移植库工具 - 这是微软的一个新的 Visual Studio 插件,使您能够创建在各种基于.NET平台的平台上运行的 C# 和 Visual Basic 库,而无需重新编译,包括 Windows Phone。

    查看此文章,了解如何使用可移植库工具进行 Windows Phone TDD。在此处您还可以找到一个Visual Studio 扩展程序

    这种方法的缺点是,此库有限制的程序集支持,因此您很可能无法使用您一直使用的所有东西。例如,您不能使用命令(因为 ICommand 存在于 PresentationCore.dll 中),也不能使用 MVVMLight 等等。另一方面,它在测试项目中给您更多的灵活性(您可以使用不同的模拟框架、IoC 容器从 VS 运行测试、使用 Resharper 运行测试等)。

  3. Silverlight NUnit 项目 VS 模板。请查看 此博客文章 了解如何在您的项目中使用此模板。同时请注意,您可能会在使用 Silverlight NUnit 项目与其他框架或像 Moq 或 Resharper 的程序时遇到问题。

现在有第四种方法适用于VS2012,请参见我的回答:https://dev59.com/sGnWa4cB1Zd3GeqP4Myy#13035195 - Claus Jørgensen

0

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