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

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

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

优秀单元测试的定义

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

编写可靠的测试
  所谓可靠性是指单元测试本身是正确的,即该失败的时候失败,该成功的时候成功。只有保证单元测试的可靠性,才能让开发人员信任该单元测试,不会为了以防万一进行调试等其他工作。
  在”单元测试的艺术”中,作者给出了一些简单的原则和技术帮助编写可靠的测试。
  ●依据实际情况合理地删除或修改单元测试
  如果确定是测试缺陷,而不是产品缺陷(被测试代码缺陷)时,需要立刻修改相关单元测试代码;如果被测试的产品代码的语义或者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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简述51单片机的内部结构_51单片机的硬件结构及其作用

    简述51单片机的内部结构_51单片机的硬件结构及其作用【1.基本组成】单片机是在一块芯片中集成了CPU、RAM、ROM、定时/计数器和多功能I/O等计算机所需要的基本功能部件的大规模集成电路,又称MCU。51单片机内包含下列几个部件:一个8位CPU一个片内震荡器及时钟电路一个片内4KBROM程序存储器128字节RAM数据存储器可寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路32条可编程的I/O线(4个8位并行I/O端口)两个16位的定时/计数器一个可编程全双工串行口5个中断源、两个优先级嵌套中断结构

    2022年10月4日
    0
  • JAVA获取服务器上文件路径,java 获取远程服务器目录的路径

    JAVA获取服务器上文件路径,java 获取远程服务器目录的路径java获取远程服务器目录的路径内容精选换一换已将所需升级的鲲鹏性能分析工具的软件包下载到本地。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。升级前请确认鲲鹏性能分析工具可以正常使用。升级前请确认安装空间至少保留原工具安装目录的大小加上新版本安装空间(1GB)为加强对系…

    2022年7月11日
    58
  • 学习笔记3–车载传感器之毫米波雷达和超声波雷达

    学习笔记3–车载传感器之毫米波雷达和超声波雷达毫米波雷达和超声波雷达。

    2022年9月11日
    0
  • MATLAB绘制三维图形z=5_plot3用法

    MATLAB绘制三维图形z=5_plot3用法matlab绘制三维图形(mesh,surf,contour,fimplicit3)

    2022年8月31日
    5
  • Apache Struts2再爆高危漏洞

    Apache Struts2再爆高危漏洞60网站安全检测最新struts2命令执行漏洞分析时间:2013-07-1809:46 在struts2中,DefaultActionMapper类支持以”action:”、”redirect:”、”redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,

    2022年7月13日
    10
  • 关于各种型号单片机delay函数不起作用问题的解决方法

    关于各种型号单片机delay函数不起作用问题的解决方法这里以单片机HT45F75为例://定义一个延时xms毫秒的延时函数voiddelay(unsignedintxms) //xms代表需要延时的毫秒数{   unsignedintx,y;   for(x=xms;x>0;x–)           for(y=960/4;y>0;y–)           {                     …

    2022年6月1日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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