在哪里写单元测试代码?

时间:2009-09-23 08:59:27

标签: c# .net unit-testing

我认为这将是一个常见的问题所以我搜索了一段时间却找不到它。

我即将开始一个新项目(C#,。net 3.5),我在想我应该在哪里编写单元测试代码。我可以创建一个单元测试项目并在那里编写所有代码,或者我可以用“被测试类”本身编写单元测试代码。

你有什么建议?为什么?在选择方法之前需要考虑的事项(警告?)?

编辑:关于用“被测代码”编写单元测试代码:我猜测从生产组件中删除测试代码并不困难。这是条件编译的用途。正确?

只是抛出这一点,因为答案是拒绝第二种选择,因为生产装配会很胖。

4 个答案:

答案 0 :(得分:19)

单独的项目,相同的解决方案。如果要从测试代码访问内部,请使用InternalsVisibleTo

将测试与生产代码分开:

  • 让事情变得更加明显
  • 表示您不需要依赖生产项目中的测试框架
  • 让您部署的代码更精简
  • 避免在部署程序集中包含测试数据文件

将代码保存在同一解决方案中:

  • 保持测试周期快速
  • 可以轻松地在生产和测试代码之间跳转

答案 1 :(得分:3)

我总是在我编写TestFixtures的地方创建一个单独的项目。 我不想在测试类中乱丢我的域模型(或其他) 我不想将我的测试分发给我的应用程序的客户或用户,因此我将它们放在一个单独的项目中(这也导致了一个单独的程序集)。

如果您想要测试内部方法的罕见情况,可以使用InternalsVisibleTo。 如果您想要测试私有方法,则可以使用this技术,如Davy Brion所述。

答案 2 :(得分:2)

我更喜欢第一种方法 - 将单元测试分离到自己的项目中。 将单元测试置于测试对象内会使其变脏。此外,您不一定希望使用单元测试来分发您的项目,这会使您的dll更大,并且可能会暴露您不希望向最终用户公开的内容。

我看到的大多数开源项目都有不同的单元测试项目。

答案 3 :(得分:2)

你应该将单元测试放在一个单独的项目中。

您还应该以某种方式编写它们,以便不会修改SUT(被测系统)以使单元测试成为可能。我的意思是你应该在你的主项目中没有帮助类,只有“仅”支持你的测试。

混合测试和生产代码总是一个糟糕的计划,因为您不希望将所有额外的代码交付给您的客户。保持另一个项目提供的清晰分离。

我不认为“保持快速测试”的论点是非常强大的。做一个明确的...测试代码不属于生产环境恕我直言......

编辑:

评论上面的编辑:

编辑:关于用“被测代码”编写单元测试代码:我猜测从生产组件中删除测试代码并不困难。这是条件编译的用途。正确?

是的,使用条件编译标志删除代码是“很容易”,但是您没有测试过您创建的最终程序集,只测试了使用其中的代码创建的程序集,然后重新编译,创建一个新的,未经测试的装配和运送那一个。您确定所有条件标志都设置为100%正确吗?我猜不是,因为你无法进行测试;)