【问题标题】:State of unit testing for Windows PhoneWindows Phone 的单元测试状态
【发布时间】:2011-08-25 01:53:55
【问题描述】:

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

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

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

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

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

我还希望进行完整的 BDD 式验收测试,但 that's another issue entirely。

【问题讨论】:

    标签: windows-phone-7 tdd continuous-integration windows-phone


    【解决方案1】:

    我将此答案添加为社区 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.Framework.dll 和来自NUnit-Silverlight project 的NUnit.Silverlight.Compatibility.dll
    4. 将测试库中的引用添加到您的主 Windows Phone 项目,忽略版本警告。
    5. 使用 ReSharper(已测试)或 TestDriven.NET 在 IDE 中运行测试
    6. 使用来自latest NUnit release 的标准.NET 2.0 nunit-console.exe 从命令行运行测试,传入/framework=v4.0。

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

    集成测试

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

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

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

    与此同时,我创建了一个codeplex project,它添加了一个启动模拟器并将结果整理到一个 XML 文件中的 MSBuild 任务。最简单的安装方法是添加wp7-ciNuGet package。

    注意:在 Windows Server requires modifying the installer configuration 上安装 WP7 SDK 不受支持,但效果很好。

    验收/系统测试

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

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

    【讨论】:

    【解决方案2】:

    【讨论】:

    • 不幸的是,WP7 仍然不支持 :(
    • 我一直在做的是创建一个 WP8 项目,其中包含链接到我的 WP7 项目中的文件的文件。它并不完美,但实际上效果很好,我可以从命令行为我的 CI 服务器执行它。
    【解决方案3】:

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

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

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

    2. 便携式库工具 - 来自 Microsoft 的新 Visual Studio 插件,可让您创建在各种基于 .NET 的平台(包括 Windows Phone)上运行的 C# 和 Visual Basic 库.

      Check this post 了解如何使用便携式库工具为 Windows Phone 执行 TDD。在这里您可以找到 Visual Studio extension。

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

    3. Silverlight NUnit 项目 VS 模板。检查 this blog post 以了解如何在您的项目中使用此模板。另请查看此线程中出现的 Toran Billups 截屏视频。请注意,将 Silverlight NUnit 项目与其他一些框架或程序(如 Moq 或 Resharper)一起使用时,您可能会遇到问题。

    【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 感谢 Damian 的链接,但 Justin 的博客文章仅涉及应用程序安装的自动化。我也尽量避免在手机上运行代码。
      【解决方案6】:

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

      • 最终,一些代码将不得不触及一些电话特定的东西。这些应该被隔离为依赖项并伪造出来。我还没有找到让单元测试在手机本身内实际运行的正确方法。不幸的是,这些依赖项对我来说仍然未经测试。
      • 为 Silverlight 使用 NUnit 可以让您获得断言: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 的东西,它就可以在不进入模拟器的情况下正常运行。

      【讨论】:

      • 您使用的是哪个版本的 nunit-console?另外,您的单元测试项目是什么项目类型?我尝试使用 nunit-console 导致程序集加载错误。
      • 仅供参考,我已经在使用 ViewModels/IoC(虽然我正在使用 Funq)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多