19

我一直在将我的 Google Fu 推向极限,试图找到最推荐/稳定的设置来为 Windows Phone 应用程序执行 TDD + CI。任何成功地做到这一点的人都可以为我指明正确的方向吗?

这是我想要做的(如果可能的话):

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

由于我想将此问题作为其他人寻找相同事物的资源,因此我希望避免以下问题:

  • 不完整或废弃的项目的开源端口
  • 仅在某人的博客上作为附件提供的项目

我还希望进行完整的 BDD 式验收测试,但这完全是另一个问题

4

6 回答 6

14

我将此答案添加为社区 Wiki,以便其他人可以对其进行修改以使其保持最新。

单元测试

意图:运行隔离(无电话功能),通常从 IDE 和持续集成服务器快速执行测试,而不需要模拟器(例如 TDD 视图模型)

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

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

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

(由于 WP7 使用 SL3,因此需要上述许多解决方法。一旦 Mango 与 SL4 运行时一起发布,它应该是一个更干净的设置)

集成测试

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

更新单元测试 Windows Phone 8 应用程序将在 Visual Studio 2012 Update 2 中得到官方支持,包括 VS 集成和命令行支持。这些测试在模拟器中运行,因此我将其包含在集成测试中。

Silverlight 测试框架的 WP7 端口当前不支持此功能(并且仅作为从博客下载的版本提供)。

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

注意:在 Windows Server 上安装 WP7 SDK需要修改安装程序配置,不支持,但效果很好。

验收/系统测试

意图:在模拟器上运行与手机 UI 交互的端到端自动化测试,无论是按需还是在 CI 服务器上

Expensify 的(对于 SEO 的命名并不好)Windows Phone 测试框架支持使用 SpecFlow 从主机 PC 编写 UI 自动化测试。

于 2011-05-16T10:21:07.517 回答
3

我认为这与你如何编写测试有关。

  • 最终,一些代码将不得不触及一些电话特定的东西。这些应该被隔离为依赖项并伪造出来。我还没有找到让单元测试在手机本身内实际运行的正确方法。不幸的是,这些依赖项对我来说仍然未经测试。
  • 使用 NUnit for Silverlight 可以让您获得断言:http ://code.google.com/p/nunit-silverlight/
  • 我使用 Resharper 运行单元测试没有问题。同样,您可以使用 nunit-console 运行测试并获取 XML 输出。
  • Ayende 的 Silverlight 的 Rhino Mocks 可以很好地模拟/存根依赖项。
  • 持续集成有点棘手。WP7 SDK 在 Server 平台上不可用,所以我在 Windows 7 上为我的 CI 构建了一个新的 SDK。可能有办法绕过这个限制,但我没有打扰。

您需要的另一个工具是MVVMLight。这将允许您使用 EventTrigger 和 ICommand 而不是事件,因为测试事件的工作量要大得多,并且不能通过 DataContext 绑定。

至于我如何设计我的应用程序:

ViewModel 可以接受任意数量的依赖项,这些依赖项可以使用MicroIoC解决。

XAML 背后的实际代码解析了 ViewModel 并将其设置为数据上下文。这很不幸,因为这意味着您不能在 XAML 中设置 DataContext,但这是我愿意接受依赖注入的权衡,如下所示:

public partial class SignUpPage
{
    public SignUpPage()
    {
        InitializeComponent();
        DataContext = IoC.Resolve<SignUpViewModel>();
    }
}

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

现在您可以测试您的 ViewModel,注入所需的依赖项(或伪造它们),只要您不尝试使用特定于 WP7 的东西,它就可以在不进入模拟器的情况下运行良好。

于 2011-05-13T16:23:25.353 回答
2

这是一个成功在手机上自动执行 WP7 测试、自动部署应用程序、运行测试和读取结果的人的链接:http: //justinangel.net/WindowsPhone7EmulatorAutomation

它使用了CoreCon API,在我开始使用它之前,它看起来非常有趣,并发现大多数函数都抛出了未实现的异常——但是那里有足够的运行自动化测试。

于 2011-05-13T18:13:44.613 回答
2

更新:现在正式支持 Windows Phone 8 的单元测试。

http://blogs.msdn.com/b/visualstudioalm/archive/2013/01/31/windows-phone-unit-tests-in-visual-studio-2012-update-2.aspx

于 2013-02-12T07:38:59.527 回答
1

好吧,至少有 3 种不同的方法可以为 Windows Phone 应用程序执行 TDD。

  1. Silverlight 单元测试框架- 由 Jeff Wilcox 编写。在这里您可以找到它的最新更新。它似乎是最流行的方式,有很多关于这种方法的信息:

    另外请检查Visual Studio 测试项目模板 ,这样您就不需要手动创建测试项目。但是,此解决方案需要在手机模拟器上运行测试,这有时会很烦人。

  2. Portable Library Tools - 来自 Microsoft 的新 Visual Studio 插件,它使您能够创建在各种基于 .NET 的平台(包括 Windows Phone)上运行的 C# 和 Visual Basic 库,而无需重新编译。

    查看这篇文章,了解如何使用便携式库工具为 Windows Phone 执行 TDD。在这里您可以找到一个Visual Studio 扩展

    这种方法的缺点是该库对程序集的支持有限,因此您很可能无法使用您曾经做过的所有事情。例如,您不能使用命令(因为 ICommand 位于 PresentationCore.dll 中),也不能使用 MVVMLight 等。另一方面,它为您的测试项目提供了更大的灵活性(您可以使用不同的模拟框架,IoC 容器运行来自 VS 的测试,使用 Resharper 运行测试等等)。

  3. Silverlight NUnit 项目VS 模板。查看此博客文章 以了解如何在您的项目中使用此模板。另请查看此线程中出现的 Toran Billups 截屏视频。请注意,在将 Silverlight NUnit 项目与其他一些框架或程序(如 Moq 或 Resharper)一起使用时,您可能会遇到问题。
于 2012-01-14T21:44:55.000 回答
0

我刚刚就这个话题做了一个 16 分钟的截屏视频。我展示了如何在 WP7 上开始使用 NUnit 和 resharper。我还展示了我遇到的一些问题(顺便说一句,与 CI 无关)

http://toranbillups.com/blog/archive/2011/07/24/Test-Driving-My-Windows-Phone-7-App

于 2011-08-26T23:47:15.653 回答