【问题标题】:.NET Conditional Compiler Symbols and Unit Test Libraries.NET 条件编译器符号和单元测试库
【发布时间】:2010-12-08 05:23:31
【问题描述】:

我的团队有一组针对我们的应用程序代码运行的单元测试库 - 不幸的是,它们会抛出(意外)异常。这样做的原因是我们的日志记录代码被调用并且对象没有被设置。日志代码通过我们使用 PostSharp 设置的方法属性执行(在方法主体执行之前和之后调用)。不应调用该属性。

这里是 PostSharp 帮助我们的地方:它寻找一个条件编译器指令 (SKIPPOSTSHARP),告诉它不要执行。换句话说,如果我们在执行单元测试时定义指令,那么我们就能够独立于日志记录方面来测试所需的代码——成功地避免了不必要的依赖和复杂的模拟代码。

这太棒了!除了一个问题......为我们的测试项目定义的条件编译器指令不会为正在测试的项目定义 - 这意味着我们的测试代码仍然使用该属性并且我们的测试都失败了。

是否可以仅在运行单元测试时在整个解决方案中定义编译器指令?即使我们没有将其应用于整个解决方案,是否只能在运行单元测试时将指令应用于特定项目(这也同样适用)?

我也有兴趣了解有关这种方法的意见(我们正在尝试通过 AOP 代码实现分离和可扩展性,但随着我们的进展,似乎确实有一些额外的障碍供我们跳过)。

注意:这里我不是在谈论集成测试,只是单元测试。我们只想测试特定的单元,而不关心日志记录代码是否工作 - 由其他单元测试进行测试(工作正常)。

【问题讨论】:

  • 你的单元测试是如何运行的?是否可以使用 msbuild 触发目标来运行这些单元测试?
  • 我们的测试在两种情况下运行。 A)通过本地开发测试运行程序(即 ReSharper 的单元测试运行程序)或 B)通过 CI 工厂通过 Nant 在我们的构建服务器上运行 Gallio。您的方法听起来很有趣(尽管我对 MSBuild 的了解还不够,无法得出结论)。另一个考虑是在自动化的 Nant 脚本中获得等效的工作,但我想如果 MSBuild 可以做某事,那么 Nant 将没有问题。

标签: .net unit-testing aop postsharp conditional-compilation


【解决方案1】:

我建议为测试创建一个特殊的构建配置。可能有一些方法可以检测项目是否因为正在执行单元测试而被构建(可能是一些 MSBuild 属性),但在增量构建场景中它是不可靠的。

【讨论】:

  • 感谢 Gael 的回复(我猜您正在观看 PostSharp 关键字 - 总是很高兴听到产品创建者的消息!)。我对 MSBuild 没有非常深入的了解,所以我需要对此进行调查,看看它有什么能力。您知道哪些资源可以为我指明正确的方向?
  • 诀窍是在 Visual Studio 构建选项中启用诊断详细程度,然后查看是否在感兴趣的条件中设置了一些有趣的属性。例如,Visual Studio 执行 MSBuild 项目,即使它没有构建项目;在这种情况下,属性 BuildingProject 设置为 false。您不会在文档中找到它。使用相同的方法,您会发现一些有趣的东西。但我不希望它强大。我真的会创建一个新的项目配置。因为你有“调试”和“发布”,你将有“测试”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2015-01-12
相关资源
最近更新 更多