将单元测试编写到一个程序集中还是单独编写一个程序集?

20

在编写单元测试时,您是将测试放置在要测试的程序集内还是单独的测试程序集中?我通常会将测试写在一个单独的程序集里,方便部署,因为我可以直接排除这个程序集。是否有人将测试写在要测试的程序集中?如果是,那么为什么?


以下是关于此主题的更多有用信息:https://dev59.com/H3RC5IYBdhLWcg3wS_AF - Mats
5个回答

11

我有一个单一的解决方案,其中包括一个接口项目,一个测试项目,一个领域项目和一个数据项目。当我发布时,我只发布接口,因为它不引用测试,所以它不会被编译进去。

编辑:底线真正的问题是你不希望它成为最终发布的一部分。你可以在VS中使用单独的项目/程序集自动实现此目标。但是,如果您正在使用nant或msbuild,则可以将其放在同一个程序集中,但是不要编译该代码。这样可能会有点混乱,保持整洁,使用单独的程序集 :)


11

这个问题在网络上广受争议。

我们使用单独的程序集和InternalsVisibleTo属性来帮助测试程序集查看被测试程序集的所有内部内容。我们倾向于为每个被测试的程序集制作一个测试程序集。


2
+1 是为 InternalsVisibleToAttribute 的引用计数。你应该添加链接:http://msdn.microsoft.com/zh-cn/library/0tke9fxk.aspx - Cristian Diaconescu
更新到 .NET 6 的链接:https://learn.microsoft.com/zh-cn/dotnet/api/system.runtime.compilerservices.internalsvisibletoattribute?view=net-6.0 - cwap

10
我认为唯一需要在最终部署中加入任何测试代码的情况是,当测试代码用于监视和控制应用程序时。

在部署中留下测试代码:

  • 使代码臃肿并没有实质优势-所有这些额外的代码都不会在现场使用。
  • 影响发布-如果您改进的只是测试代码(例如,测试套件因错误修复而扩展),则是否发布完整应用程序的新版本。
  • 无法轻松地在另一个项目上重用测试框架-如果您总是发布带有测试代码的应用程序,任何后续项目都必须重用相同的测试代码。否则,您就会面临这样的情况:应用程序A正在使用测试平台v1.2,涵盖您所有应用程序的公共方面(例如演示层或业务逻辑框架等)。而应用程序B正在使用测试框架v1.1,应用程序C正在使用v1.2.1等。

另一方面,解耦允许您:

  • 根据需要轻松升级和扩展测试套件。
  • 跨多个项目轻松重用测试套件。
  • 在多个项目中使用常见的测试框架。

希望对您有所帮助

谢谢,

罗布


关于“影响发布”和“测试重用”(两者都与版本控制相关)的观点很好。 - Fil

5
在另一个程序集中。否则,您的程序集将引用测试框架(例如Nunit.Framework.dll),并且您需要在客户机器上安装它。
即使您要发布的是库,并且希望客户端看到单元测试作为使用您提供的对象的示例或规范,包含在生产程序集中也几乎没有什么优势。

0

你可以将它们保留在解决方案中的单独程序集中,然后在调试时将它们合并,但在发布时不要将它们合并。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接