【问题标题】:Silverlight unit testing integration in VS 2010?VS 2010 中的 Silverlight 单元测试集成?
【发布时间】:2011-05-13 22:15:29
【问题描述】:

我目前正在使用 Silverlight 单元测试框架,但我更喜欢直接在 VS2010 中运行测试。我很想知道其他人使用什么方法和工具。

我将 Silverlight 4 与 Prism 和 MVVM 模式一起使用,并且我对 VS 2010 中的集成 Silverlight 单元测试支持特别感兴趣,我可以将其与我的 ViewModel 单元测试一起使用。我正在使用 Unity 的依赖注入,并且我正在使用 Moq for Silverlight 模拟我的 WCF 层中的调用来编写单元测试。目前我什至没有考虑集成测试,但即使在测试单个 ViewModel 命令的简单单元测试中,对我的模拟服务层的服务请求也可能需要大约 50 毫秒。因此,对异步测试的支持对我来说很重要。

我在这里提出的问题与 View 测试无关,我过去曾使用 System.Windows.Automation.Peers 成功地处理过它,并且 - 虽然我还没有使用它 - 现在可能可以处理借助 VS 2010 Feature Pack 2 中的支持更轻松(根据我收集的内容,它似乎针对 UI 测试的自动化/回放)。

我应该提一下,到目前为止,我已经查看和使用过的产品的发现如下:

  • Silverlight 单元测试框架 - 我目前正在使用它,就它而言它很棒,但它的局限性是 (a) 它没有与 Visual Studio 集成; (b) 如果您不想运行所有测试,则只能使用粗略的标签表达式过滤器。
  • StatLight - 非常好。我目前使用它,并且从 v0.9 开始在以前的项目中针对 Silverlight 3 时使用它。作为一个命令行工具,它可以与持续集成服务器集成——它当然可以处理另一个需要的场景。但它在开发过程中直接与 Visual Studio 集成没有任何用处。
  • Silverlight 的单元测试结果查看器(Visual Studio 库上的 Visual Studio 扩展) - 看起来很有希望,但它的局限性是 (a) 目前无法找到位于解决方案文件夹中的项目,而不是位于解决方案根目录下的项目; (b) 在给定的程序集中(通过 StatLight)运行所有测试,但没有明显的能力运行特定测试或选择的测试。
  • Einar Ingebrigtsen 的用于 ReSharper 的 Silverlight 单元测试运行器,后来成为 Odin - 领先于游戏(它首次出现于 2008 年),但限制是该项目似乎不再维护(最近一次更新是 2009 年 4 月)。
  • AgUnit ReSharper 插件 (http://agunit.codeplex.com/) - 最初看起来很棒。在下载了它的源代码并构建了最新的(已修复错误的)版本以适用于 ReSharper 5.1 之后,我深受鼓舞。但不幸的是它不处理异步测试。这是线程的设计限制,因此无论您尝试使用 Silverlight 单元测试框架(Microsoft.Silverliht.Testing.SilverlightTest 基类)中内置的异步支持,还是使用 AutoResetEvent 或还要别的吗。 CodePlex 项目论坛上的协调员已经注意到了这一点。这是一个巨大的限制。
  • TestDriven.NET 3.0 - 乍一看似乎支持 Silverlight 4.0 测试,但限制(我怀疑)是 Silverlight 4“程序集可移植性”(即在 SL4 和 .NET 4 之间可移植的 5 个依赖程序集) .当然,当我尝试将它与简单的 POC 一起使用时,它使我的 VS 2010 实例崩溃。

也许我在这里遗漏了一些东西 - 我想知道社区中是否有人对 Silverlight 单元测试有更好的想法?

【问题讨论】:

    标签: silverlight unit-testing visual-studio-2010 mvvm resharper


    【解决方案1】:

    我将 Silverlight 单元测试框架、AgUnit 和 RX 与模拟 IScheduler 提供程序一起使用,以使我的单元测试成为单线程 :)

    【讨论】:

    • 有趣 - 我什至没有使用 Rx,因为我不能在应用程序本身上使用它(它不在我工作的地方生产环境的批准技术列表中)。但事实证明,我可能仅将 Rx 用于单元测试,因为它们只会在开发盒和我们的构建服务器上执行。您的解决方案确实听起来很优雅。您是否可以为用于使单元测试单线程的模拟 IScheduler 发布任何示例代码?
    • 谢谢。是的,这几乎就是我昨晚看到这个时得出的结论。希望我能在我的下一个项目中商业化使用 Rx,也许我会利用你的想法!尽管 Silverlight 的 PDC 后定位意味着对业务线应用程序的高度关注,但微软似乎还没有为 Silverlight 单元测试提供更好的解决方案,这让我仍然感到有些震惊。最近似乎刚刚在 WP7 上全力以赴。现在 WP7 已经发布,也许微软最终会正确解决这个单元测试问题:)
    • 我也对 silverlight 中的单元测试故事感到非常难过。 Jetbrains 应该介入 :)
    • 很高兴我不是唯一一个 - 很难理解为什么没有更多人对此大喊大叫。我同意 - JetBrains 应该接受这个,因为微软当然还没有表现出任何这样做的迹象!我想 ScottGu 仍有机会在下周 Silverlight Firestarter 活动的主题演讲中宣布这一领域的一些事情 - 让我们拭目以待......
    【解决方案2】:

    更新:

    我已经决定将 StatLight 用于我的持续集成服务器,但我一直在寻找一种解决方案,允许我在开发期间直接在 VS2010 中运行异步 Silverlight 单元测试。

    受到 Rob Fonseca-Ensor 建议使用 Rx 的启发(请参阅他在此页面上的单独回答),我重新审视了这个问题。这让我找到了一个非 Rx 解决方案来解决使用 AgUnit 运行异步 Silverlight 单元测试的问题。

    我认为我会使用的解决方案 - 至少目前是这样 - 是:

    • Silverlight 单元测试框架
    • ReSharper 5.1
    • AgUnit ReSharper 插件
    • [模拟异步模式]

    我的 ViewModel 中注入了定制的服务类,这些服务类提供了我的(自动生成的)WCF 服务引用类的抽象。为了帮助提供对 WCF 服务方法的访问,我的定制服务类还依赖于另一个包含异步模式的通用类。对于我的单元测试,我已经使用 Moq 模拟了我的 WCF 服务引用类和我的定制服务类 - 但我没有考虑模拟我的异步模式包装器类。

    所以我决定也模拟我的异步模式包装类。这样做的吸引力在于,我认为我可能然后能够在我所有的模拟中使用带有模拟 IScheduler 的 Rx(正如 Rob 在他的回答中所建议的那样),同时让我的真实课程没有任何参考到 Rx(这是一个要求,因为对于我工作的地方的这个项目,我需要将 Rx 排除在部署到生产环境的任何代码之外)。然而,一旦我模拟了包装类,我意识到我什至不需要 Rx,而且还有一个更简单的解决方案——我之前应该真正看过。这很简单——我真正需要做的就是模拟包装类并确保它在回调操作上调用 Invoke,而不是调用 BeginInvoke。当单元测试由 VS2010 中的 AgUnit 运行时,这最终可以防止在浏览器会话中的 Silverlight 单元测试框架下运行时正常工作的回调进入黑洞。 (在使用 AgUnit 时允许回调进入黑洞当然会阻止单个测试正确完成,并且可能导致超时或更糟的是测试结果中的误报。)

    在对这个问题的任何后续答案都没有更好的建议的情况下,这似乎是我处理这种情况的最简单方法 - 允许我的异步单元测试在 AgUnit 中运行,而无需在我的生产代码中使用 Rx。

    对于在将使用 Rx(仍然是 DevLabs 项目)的代码部署到生产环境方面没有面临公司强加限制的任何其他人,我认为 Rob 的解决方案绝对值得一看。

    【讨论】:

    • 您是否有任何链接可供参考,以获取为 Silverlight 应用程序实施单元测试的分步指南。谷歌搜索后我找不到任何东西
    【解决方案3】:

    我是 AgUnit 插件的作者。

    AgUnit 阻止异步单元测试以加快测试运行。在幕后,它使用与 Silverlight 单元测试框架测试运行程序相同的代码,但如果您必须处理大量测试,此运行程序会非常慢。对于几千次测试,我已经看到了将近半小时和几分钟之间的差异。

    也就是说,如果您确实需要异步测试,它是 AgUnit 的一个非常孤立的部分来执行此操作。我将尝试创建一个禁用它的构建。将来这将是一个配置选项或一个属性,我还没有决定。

    如有任何问题或要求,请随时与我联系。

    【讨论】:

      【解决方案4】:

      您是否阅读过最近发布的Visual Studio 2010 Feature Pack 2。目前它只对 MSDN 订阅者开放,并且仅适用于 VS2010 的某些版本(Premium、Ultimate 和 Test Pro)。

      这里是一个快速概览:http://blogs.msdn.com/b/amit_chatterjee/archive/2010/11/16/visual-studio-2010-feature-pack-2-released-new-set-of-testing-capabilities.aspx

      【讨论】:

      • 感谢您的指点。碰巧的是,我正在使用 VS2010 Professional,所以我相信这对我来说是不可能的。但是,是的,我读过关于 Feature Pack 2。所有关于它的宣传都倾向于专门指 UI 测试,所以我假设它不会为我提出的问题提供任何东西(正如我在问题中提到的,我只关心这里的 ViewModel 测试,而不是 View 测试)。但我很高兴被证明是错误的。关于 Feature Pack 2 如何帮助我满足我的要求 - 直接在 VS2010 中运行异步 ViewModel 单元测试,您有任何具体的 cmet 吗?
      【解决方案5】:

      我通常在 VS.NET 中创建一个普通的单元测试项目,在引用中添加我的 Silverlight 程序集并编写单元测试类。

      所以一切都是开箱即用的。这个解决方案有什么问题?

      【讨论】:

      • 是的,我也看到其他人也在谈论使用此解决方案。但是,除了您的测试将针对“完整”.NET CLR 而不是 CoreCLR 运行 Silverlight 代码这一纯粹观点之外,此解决方案是否限制了您在 SL 代码中可以拥有的引用?我很高兴被证明是错误的 - 但据我了解,如果您从非 SL 项目中引用 SL 程序集,那么您将受到 SL4 的“程序集可移植性”功能的限制。在我的例子中,我的 ViewModel 引用了 Prism 程序集。我很想知道您正在针对您的 SL 应用程序的哪些部分编写测试。
      • 你可能使用MVVM的方式,所以你在单元测试中测试的是ViewModel,主要是数据访问、业务规则、INotifyPropertyChanged-objects。在这种情况下使用的 CLR 层(特定于 SL 或完整的 .NET)非常薄,并且经过 MS 本身的良好测试。
      • 是的,我确实使用了 MVVM - 我主要对测试 ViewModel 感兴趣(尽管我也测试了其他类,包括针对 View 的健全性测试)。是的,ViewModels 中使用的 CLR 非常薄。但我的观点是,ViewModel 使用的引用不一定总是限于在程序集可移植性下允许的 5 个 CLR 程序集。对 Prism 组件的引用就是一个例子。即使不使用 Prism,您也可能会使用 System.Windows.dll 中的 ICommand。正如我所说,我很想知道你用这种方法成功测试了什么?
      • 5 个 CLR dll + 无限数量的 dll 使用这些罚款(如 Prism 核心 dll)。但我必须说,我们不使用 Prism(我们使用更轻更好的 Caliburn.Micro 版本),所以我可能对这个假设有误
      • 无限数量的 dll 使用这些 - 是的,当然,我很感激。 Prism 组件 参考系统组件超出了组件可移植性允许的 5 个组件。他们必须这样做,尤其是因为 Prism 的 DelegateCommand 实现了 ICommand。 (例如,Microsoft.Practices.Composite.Presentation.dll 引用 System.Windows.dll)。
      猜你喜欢
      • 1970-01-01
      • 2011-03-22
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多