单元测试和功能测试

单元测试和功能测试区别

  • 很多时候,系统开发好比建筑房屋。尽管这种类比不很恰当,但为了理解单元测试与功能测试的区别,我们可以扩充这种类比。单元测试好比房屋建筑现场的建筑监理员。他关心房屋的各个内部系统,如地基、构架、供电系统和管道设备等。他确保(测试)房屋每一部分的工作都安全、正常,即符合建筑说明。这种情况下,功能测试类似于视察同一建筑现场的房主。他假定内部系统将正常运作,并假定建筑监理员在执行其任务。房主关心的是住在这所房子里将会怎样。他关心房子的外观如何,各个房间的大小是否合适,房子能否满足家庭的需要,以及窗户的位置是否有利于采光。房主对房子执行功能测试。他从用户的角度考虑问题。建筑监理员对房子执行单元测试。他从建筑工人的角度考虑问题。
  • 就像单元测试一样,如果没有测试框架,编写一套可维护的自动化功能测试实际上是不可能的。JUnit 非常适合编写单元测试;但是,当试图编写功能测试时,它就显得力不从心了。就功能测试而言,没有与 JUnit 相当的框架。也有几种用于功能测试的产品,但我从来没见过它们应用于生产环境。如果找不到满足您的需要的框架,您就必须创建一个。

单元测试原则

  • 一般而言,类的每个公共方法都应有一个单元测试。
  • 将单元测试与被测试的相关类放在同一个包内。这种组织方式使每个单元测试都能访问被测试类中带有 package 或 protected 访问修饰符的方法和引用变量。
  • 在单元测试中避免使用域对象。域对象是特定于某个应用程序的对象。

单元测试与功能测试的界限

  • 如果单元测试跨越类边界,则它就可能是功能测试。
  • 如果单元测试很脆弱(也就是说,虽然它是一个有效测试,但它必须不断改变以处理不同的用户组合),则它可能是功能测试。
  • 如果编写单元测试比编写其所测试的代码更难,则它可能是功能测试。

请注意“它可能是功能测试”这一措辞。本文无法提供硬性而快速的规则。单元测试与功能测试中之间有一个界限,但界限的具体位置要由您来确定。您用单元测试用得越熟练,某个特定测试是单元测试还是功能测试的界限就越明显。

小结

单元测试是从开发人员的角度出发编写的,并且关注的是所测试的类的特定方法。

当编写单元测试时,请使用以下这些原则:

  • 首先编写单元测试,然后再编写要测试的类代码
  • 在单元测试中捕获代码注释。
  • 测试所有执行“令人感兴趣的”功能(即,不是 getter 和 setter,除非它们以某种独特的方式执行获取和设置操作)的公共方法。
  • 将每个测试实例与它要测试的类放在同一个包内,以获得对包成员和保护成员的访问权。
  • 避免在单元测试中使用特定于域的对象。

功能测试是从用户的角度出发编写的,并且关注用户感兴趣的系统行为。

找一个优秀的功能测试框架,或者开发一个测试框架,并使用这些功能测试识别用户的真实需求。这样,功能测试人员即可获得一种自动化工具以及使用这一工具的着手点。

References

单元测试与功能测试之间的区别

你可能感兴趣的:(测试,微服务)