Unit testing 单元测试指南

Unit testing 单元测试指南,unit-testing,tdd,Unit Testing,Tdd,有人知道在哪里可以找到单元测试指南和建议吗?我想要一些能解决以下类型主题的东西(例如): 测试应该和应用程序逻辑在同一个项目中吗 我应该有测试类来镜像我的逻辑类,还是应该只有我认为需要的那么多测试类 我应该如何命名我的测试类、方法和项目(如果它们在不同的项目中) 应该测试私有、受保护和内部方法,还是只测试那些可公开访问的方法 单元测试和集成测试应该分开吗 是否有理由不进行100%的测试覆盖率 我不是在问我应该成为什么样的人吗 在线资源是最好的。我坚决推荐你们阅读,而且对于单个主题来说,问题太

有人知道在哪里可以找到单元测试指南和建议吗?我想要一些能解决以下类型主题的东西(例如):

  • 测试应该和应用程序逻辑在同一个项目中吗
  • 我应该有测试类来镜像我的逻辑类,还是应该只有我认为需要的那么多测试类
  • 我应该如何命名我的测试类、方法和项目(如果它们在不同的项目中)
  • 应该测试私有、受保护和内部方法,还是只测试那些可公开访问的方法
  • 单元测试和集成测试应该分开吗
  • 是否有理由不进行100%的测试覆盖率
我不是在问我应该成为什么样的人吗


在线资源是最好的。

我坚决推荐你们阅读,而且对于单个主题来说,问题太多了。

我推荐一本关于TDD的书

此外,您还需要访问该站点。他也有很多关于测试的好信息

我们非常重视TDD,所以我将从这个角度回答问题

测试应该和应用程序逻辑在同一个项目中吗

通常,我们将测试保持在同一个解决方案中,但我们将测试分解为单独的DLL/项目,这些DLL/项目反映了它们正在测试的DLL/项目,但维护名称空间,测试位于子名称空间中。示例:Common/Common.Tests

我应该有测试类来镜像我的逻辑类,还是应该只有我认为需要的那么多测试类

是的,您的测试应该在创建任何类之前创建,根据定义,您应该只单独测试单个单元。因此,解决方案中的每个类都应该有一个测试类

我应该如何命名我的测试类、方法和项目(如果它们在不同的项目中)

我想强调的是,行为是被测试的,所以我通常以SUT命名测试类。例如,如果我有一个用户类,我会这样命名测试类:

public class UserBehavior
应该命名方法来描述您期望的行为

public void ShouldBeAbleToSetUserFirstName()
项目可以按照您想要的方式命名,但通常您希望它非常明显地显示它正在测试哪个项目。请参阅前面关于项目组织的回答

应该测试私有、受保护和内部方法,还是只测试那些可公开访问的方法

同样,您希望测试能够断言预期的行为,就像您是被测试对象的第三方消费者一样。如果您测试内部实现细节,那么您的测试将是脆弱的。您希望您的测试能够给您重构的自由,而不必担心破坏现有功能。如果您的测试知道实现细节,那么如果这些细节发生更改,您将不得不更改测试

单元测试和集成测试应该分开吗

是的,单元测试需要与验收和集成测试隔离。关注点分离也适用于测试

是否有充分的理由不进行100%的测试覆盖率

我不会挂断100%代码覆盖率的事情。100%的代码覆盖率往往意味着测试中的某种质量水平,但这是一个神话。你可以进行糟糕的测试,但仍然可以获得100%的覆盖率。相反,我会依靠一种良好的考试第一心态。如果您总是在编写一行代码之前编写测试,那么您将确保100%的覆盖率,因此它将成为一个没有实际意义的点


一般来说,如果你专注于描述类的全部行为范围,那么你就没有什么可担心的了。如果您将代码覆盖率作为一个指标,那么懒惰的程序员只需做足够的工作就可以达到这个指标,而且您仍然会有糟糕的测试。相反,在测试也被审查的情况下,严重依赖同行审查。

这是一个好问题。我们自己有机地种植,我想最好的方法就是这样。里面有点“视情况而定…”

我们在同一个项目中,在名为“Unites”的子命名空间中进行测试

我们的测试类反映了逻辑类,以简化跟踪测试位置与测试内容的关系

类的命名与它们所测试的逻辑类相似,方法的命名与它们所测试的场景相似

我们只为公共和内部方法编写测试(测试在同一个项目中),目标是95%的类覆盖率

我不想区分“单位”和“整合”。要花很多时间去弄清楚哪个是哪个…把那个包起来!考试就是考试

100%太难了,不可能一直做到。我们的目标是95%。在获得最终5%所需的时间和实际捕获量方面,回报也在减少

这就是我们,也正是我们适应了环境和节奏。你的年龄可能不同。想想你所处的环境和所涉及的个性

我期待着看到其他人对此有什么看法

按顺序:

  • 不,通常最好将它们包含在单独的项目中;除非您希望能够在运行时运行诊断
  • 理想的情况是100%的代码覆盖率,这意味着每个类中每个例程中的每一行代码
  • 我选择ClassnameTest,ClassnameTest.MethodNameTestnumber
  • 一切
  • 我会说是的,因为如果单元测试失败,则不需要运行集成测试
  • 只设置并获取字段的简单属性不需要测试

根据我的经验,关于你的最后一个问题,不坚持100%测试覆盖率的“好”理由是,要获得最后几个百分点需要付出不成比例的努力,特别是在较大的代码库中。因此,一旦你达到收益递减的点,就要决定是否值得你花时间。Josh的答案是正确的,只是需要澄清一点: