【发布时间】: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