如何在.Net中设置单元测试项目?

uri*_*rig 8 .net unit-testing projects-and-solutions

您能否分享在.net解决方案中设置单元测试项目的方式?

我可以想象几种可能的方法.例如:

  1. 为单元测试提供单独的解决方案,完美地镜像正在测试的原始代码解决方案的结构.

  2. 在原始代码解决方案中,有一个解决方案文件夹,您可以在其中完美地镜像...

  3. 为每个代码项目提供一个单元测试项目,并与解决方案的树结构一起驻留在其中.

  4. 有一个单元测试项目,涵盖在树形结构中与它们并存的几个代码项目.

很想知道你在解决方案中是如何实际做到的.

Jon*_*eet 10

绝对是单一的解决方案,但是单独的项目:

  • 您不希望您的测试成为生产装配的一部分(为什么要添加膨胀?)
  • 您不希望必须在不同的解决方案之间切换,以便在测试代码和生产代码之间切换; 这可以严重打破我的经验节奏.(我曾经被迫进入这种模式,这很糟糕.)它也会破坏重构 - 如果你在生产代码中更改了一个方法,你希望测试自动使用新的方法名称.(不可否认,某些测试的名称可能需要手动更改.)

每个生产项目的一个测试项目对我来说很有效.我倾向于使命名空间对于测试和生产代码都相同,这意味着您通常不需要使用尽可能多的using指令.


Mar*_*son 10

IMO,如果您想让测试易于运行,测试项目绝对必须与生产代码在同一解决方案中.如果所有开发人员都非常勤奋,那么将测试放在另一个解决方案中可能会有效,但它会在更改生产代码和运行测试之间增加额外的障碍.我倾向于选择尽可能多的障碍.

有几种不同的方法可以做到这一点.

  • 每个解决方案的单个测试项目(Product.UnitTests.csproj)
  • 每个系统一个测试项目(Product.SystemName.UnitTests.csproj)
  • 生产项目和测试项目的一对一映射(Product.ProjectName.csproj和Product.ProjectName.Tests.csproj)

每个人都有自己的权衡,你必须权衡.

每个解决方案的单个测试项目

如果整个解决方案包含有凝聚力的项目,则有意义.如果您总是要使用相同的解决方案进行开发,那么拥有一个集中的测试项目会很不错.

这意味着构建过程的开销会减少(当您拥有大量项目的解决方案时,减少组装计数也会缩短构建时间)并且没有维护.nunit文件等的开销.

此外,每个人都知道测试的去向.缺点是您必须使用命名空间来划分不同的生产项目,现在一个项目的测试与其他项目相关联.也就是说,这是最容易获得支持的人,因为跟踪的次数较少,开发人员可以轻松地进行测试.缺点是在某些情况下,这不适合你正在开发的东西.

每个系统单个测试项目

基本上和上面一样,除了它的粒度更细.您将相关项目分组到区域/系统中,并为每个项目使用单个测试程序集.这稍微增加了复杂性,但也意味着系统在其他解决方案中更容易提取/可重复使用.

生产项目和测试项目的一对一映射

在创建新程序集方面开销最大,在项目负载时会略微增加构建时间,并且通常会使解决方案文件更大.需要尽职尽责地保持.nunit项目文件是最新的,并且在IDE单元测试中不能很好地发挥作用.

最重要的是,为每个生产项目维护一个测试项目意味着测试只依赖于他们正在测试的功能(因此更容易重用项目),并且您可以通过运行一个项目来更轻松地检查代码覆盖率一次(如果您运行所有测试,由于不相关的测试有时会触及他们不感兴趣的代码,您将获得更高的覆盖率).此外,这是一个简单的模式,因此人们将了解测试的目的在哪里没有问题.

总结:我认为上述任何一种都可以很好地运行,具体取决于你正在开发什么,但如果你想要一个"正常工作"的解决方案,那么我倾向于选择一对一的映射.