如何编写优秀的单元测试用例「建议收藏」

如何编写优秀的单元测试用例「建议收藏」优秀单元测试的定义​单元测试:一段自动化的代码,这段代码调用被测试的工作单元,之后对这个工作单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架进行编写。单元测试容易编写,快速运行,可自动化,可靠,可读,可维护,结果稳定。  集成测试:对一个工作单元进行的测试,这个测试对被测试的工作单元没有完全的控制,并使用该单元的一个或多个真实依赖物,例如数据库、系统时间、系统文件等  工作单元:从调用系统一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为。一个

大家好,又见面了,我是你们的朋友全栈君。

优秀单元测试的定义

单元测试:一段 自动化 的代码 ,这段代码调用被测试的 工作单元 ,之后对这个工作单元的 单个最终结果 的某些假设进行检验。单元测试几乎都是用 单元测试框架进行编写。单元测试容易编写,快速运行,可自动化,可靠,可读,可维护,结果稳定。
  集成测试:对一个工作单元进行的测试,这个测试对被测试的工作单元没有完全的控制,并使用该单元的一个或多个真实依赖物,例如数据库、系统时间、系统文件等
  工作单元:从调用系统一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为。一个工作单元既可以是小到只包含一个方法,也可以大到包含实现某功能的多个类或方法。
  最终结果:是指被调用的公共方法返回一个值;或者在方法调用前后,系统的状态或行为有可见的变化,这种变化不需要查询私有状态即可判断;又或者是 调用了一个不受测试控制的第三方系统 ,这个第三方系统不返回任何值,或者返回值已被忽略。

编写可靠的测试
  所谓可靠性是指单元测试本身是正确的,即该失败的时候失败,该成功的时候成功。只有保证单元测试的可靠性,才能让开发人员信任该单元测试,不会为了以防万一进行调试等其他工作。
  在”单元测试的艺术”中,作者给出了一些简单的原则和技术帮助编写可靠的测试。
  ●依据实际情况合理地删除或修改单元测试
  如果确定是测试缺陷,而不是产品缺陷(被测试代码缺陷)时,需要立刻修改相关单元测试代码;如果被测试的产品代码的语义或者API变更导致测试失败,这时是需要修改测试,使用新的语义;如果看到测试名含义不清或者单元测试的可维护性差就应该在保证单元测试基本功能前提下修改测试名称或者重构测试;如果同一个功能多个单元测试,请删除重复测试。
  ●避免在单元测试代码中包含逻辑
  包含逻辑的测试是指测试代码中包含switch、if/else、for/while等控制流语句。这样的测试可读性差,代码脆弱,测试代码的复杂度高,容易包含缺陷,测试结果不容易重现。
  ●每个单元测试只测试一个关注点
  所谓的一个关注点就是指一个工作单元的一个最终结果:一个返回值、系统状态的一个改变、对第三方对象的一个调用。测试多个关注点一方面不利于测试命名,另一方面很多单元测试框架中,一个失败断言就会抛出一个特殊类型的异常,后面代码不会继续执行,这样不利于收集测试失败原因。
  ●区分单元测试和集成测试
  ●用代码审查确保代码覆盖率

  如果你做了代码审查、测试审查、确保测试优秀而且覆盖了所有代码,那么就可以避免犯简单愚蠢的错误,同时也可以从持续的学习中获益。

编写可读的测试
  单元测试可以看做是一个婉婉道来的故事,这个故事是讲给下一代开发者听,故事的内容就是这个应用程序的组成及其流程。既然是故事,就一定要形象生动,易于理解。那么可读性就是指如何确保其他开发者能够理解他们要做的工作,以便维护产品代码和测试。
  单元测试的可读性其实和代码可读性在很多方面类似,下面就逐一讨论这些方面。
  ●单元测试的命名标准
  合理地命名测试,主要目的是为了使后来的开发者从为了理解测试而阅读代码的负担中解脱出来。测试名应该包含三部分:被测试方法名、测试场景(即测试使用的条件)、预期行为(即被测试方法的最终结果)。
  ●单元测试中的变量命名规范
  单元测试除了主要的测试功能之外,它还为API提供某种形式的文档。通过合理命名变量,帮助阅读测试的人可以尽快理解你要验证什么(从而更加理解产品代码中想要实现什么功能)。
  ●断言和操作分离
  ●避免滥用setup和teardown

  比如在setup中准备stub和mock对象,这种情况就会导致阅读测试的人意识不到测试中使用了模拟对象,也不知道这些模拟对象预期是什么。

编写可维护的测试
  可维护性是大多数单元测试面临的最大挑战。随着时间累计,单元测试似乎越来越难维护和理解,被测代码一个微小的改动,似乎都会使某个测试失败。那么怎么能够尽量降低可维护性的成本呢?
  ●只测试公共契约,避免测试私有或者受保护的方法
  私有方法可以看做是系统内部契约,这个内部契约是动态,在系统重构时可能会被随时修改,因此针对这些内部契约的单元测试也很可能会失败。而内部契约最终都会被一个公共契约(公共方法、整体功能)所调用,也就是说任何私有方法通常都是一个更大的工作单元的一部分。
  ●去除重复代码
  可以使用辅助方法或者setup来去除重复代码的问题
  ●实施测试隔离
  测试隔离是指每个测试都只生活在自己的小世界中,它与其他测试之间没有任何依赖关系,甚至不知道其他测试存在。
  下面列举几种常见的测试隔离的反模式。
  1、测试结果依赖测试执行的顺序
  2、测试调用其他测试方法
  3、测试中使用的共享资源(内存或外部资源)没有得到清理或回滚
  ●避免对不同关注点多次断言,尽量使用参数化测试或者对每个关注点设计单独的测试用例
  ●避免过度指定
  常见的过度指定的例子。
  1.对系统内部契约进行断言
  2.使用过多的模拟对象
  3.精确匹配

转载:http://www.51testing.com/html/72/n-3721672.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148360.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • web前端发展历程[通俗易懂]

    web前端发展历程[通俗易懂]前言目前在IT公司中前端的岗位越来越成为不可或缺的,前端的地位也愈见明显,很多学校已经体系的传授前端课程,众多培训机构也将前端知识作为了主流课程,也有越来越多的同学加入到前端学习的行列中,作为前端工程师或者前端的学习者我们有必要去了解前端的发展史。…

  • 电容的分类与区别[通俗易懂]

    版权声明:本版面文章皆为原创、或参考其他技术网站、博客后自己动手做实验所得,转载请注明出处——028后勤仓库管理员。作为电子硬件工程师,熟悉各类电容的区别和使用方法是很有必要的。下面来简单介绍下几种常用电容的区别。一、电容的分类与作用       电容是由两个金属极,中间夹有绝缘材料(介质)构成的。由于绝缘材料的不同,所构成的电容器的种类也有所不同

  • 网上很多laravel中cookie的使用方法。

    网上很多laravel中cookie的使用方法。

    2021年10月26日
  • 点对点通信

    点对点通信点对点通信client/server

  • 分布式CAP原理:一致性、可用性、分区容错

    分布式CAP原理:一致性、可用性、分区容错CAP概念单机系统由于所有的处理都在单机完成的,所以不存在数据一致性问题,但是如果系统崩溃了,就导致服务不可用。分布式系统可以实现服务的高可用,现有的大型网站几乎都是分布式的,特别是微服务的出现,使得分布式系统正变得越来越重要。分布式系统最大的难点,就是各个节点的状态如何同步。CAP原理给分布式系统的实现带来了指导思路,它也是理解分布式系统的重要理论。CAP由以下三个指标组成:C(Consistency):一致性A(Availability):可用性P(P…

  • 常见字符集&乱码问题

    常见字符集&乱码问题字符集常用字符集分类ASCII及其扩展字符集作用:表语英语及西欧语言。位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。范围:ASCII从00到7F,扩展从00到FF。ISO-8859-1字符集作用:扩展ASCII,表示西欧、希腊语等。位数:8位,范围:从00到FF,兼容ASCII字符集。GB2312字符集作用:国家简体中文字符集,兼容ASCII。位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号