测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)

测试框架 如何测试私有方法

本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。

关于测试框架的想法

我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了语法上的便利性和便利性,但是本质上并不能解决拥有可维护的测试代码的问题。 换句话说,如果没有特定的测试技术就无法维护您的测试套件,那么仅通过引入另一个测试框架就很难改善它。

我声称,具有可读的测试代码的最大影响是通过精心设计测试代码的API和组件以及适当的抽象和委托来引入的。 这不依赖任何技术,而是在纯Java中完成的,在可以由JUnit执行的测试用例中。 为了验证特定步骤, AssertJ已经证明自己很不错。 我们可以定义特定于我们的业务逻辑的自定义断言,这进一步提高了代码的可读性。 如果测试用例需要模拟超出范围的类,则Mockito可以出色地完成这一工作。

我声称这些测试技术已经足够。 尤其是JUnit 5的出现,进一步增强了如何设置动态或参数化测试套件的功能。

尽管如此,仍有一些测试框架值得研究。 我完全不反对引入进一步的测试技术,因为它们无疑可以提高测试期间的可读性和效率。 但是,我声称关注测试代码质量至关重要,其他测试框架是可选的。

Spock是一个带有Groovy API的测试框架,该框架相当知名,并已在项目中使用,目的是提高可读性和可维护性。 但是,我仍然会问这个技术能带来多少好处。 如果开发人员对其语法和方法感到满意,那很好; 但是,如果该项目完全是用Java编写的,那么与其提供的好处相比,可能需要更多的精力来管理和配置其他依赖项。 根据经验,我们花了很多时间在所有开发机器,CI / CD环境上配置Groovy及其版本,以及配置Maven构建。 由于我声称最大的投资回报来自测试代码质量,而与所使用的技术无关,因此在复杂项目中使用Spock这样的框架的实际收益是很小的。

Testcontainers是一项在测试生命周期内设置和管理Docker容器的技术。 它使开发人员能够编排本地测试环境,其中可能包括被测应用程序,外部系统,模拟服务器或数据库。 这个开源项目在后台使用Docker的Java包装器,并将容器生命周期绑定到测试运行时。

尽管这种方法可以非常方便地在我们的测试用例中定义整个环境,并将管理减少到一个入口点,即执行Java测试类,但我通常主张不要将测试方案与测试环境生命周期相结合。 。 在每个测试案例中重新启动和重新部署本地测试环境会花费太多时间,并会减少即时反馈。 为了最大程度地减少整个周转时间,开发人员应该使本地环境长时间运行,并针对该环境运行幂等测试方案。 如果测试用例不影响生命周期,则更容易管理该设置。 将来,Testcontainers可以使声明的容器运行超出测试用例。 但是,在我看来,通过外壳程序脚本,Docker compose或Kubernetes在外部定义生命周期,更清晰,更容易定义,而无需使用其他抽象。 过去,Docker Java包装器存在一些小问题,例如,当config JSON文件的格式更改时。 在我看来,诸如将工具包装到Java API中这样的抽象的优点通常不是很大,但是它们在配置和维护方面需要付出一定的努力,而我们常常最终围绕它们的局限性建立解决方法。

因此,我仍然认为它是使用(bash)脚本或单独执行的类似方法来设置本地测试环境的最简单解决方案。 因此,明确定义了管理环境,设置和拆卸的责任; 测试方案仅使用并验证本地环境,并且可以立即运行。 直接使用shell脚本或技术(例如Docker Compose)可能并不那么花哨,但与您可以花多少时间(基于Java的)抽象相比,与管理依赖项,配置运行时和定义相比,定义起来实际上要快得多。整合生命周期。 理想情况下,我们定义一个动作来在开发过程中设置本地环境。 我们的CI / CD管道可以使用类似的方法,也可以使用更复杂的设置,例如无论如何将应用程序部署到Kubernetes集群。

使用普通技术运行测试的另一个好处是通常可以轻松地将测试方案重新用于其他测试范围。 例如,当我们使用JAX-RS客户端而不是Restassured在测试场景中连接到我们的应用程序时,我们可以轻松地提取这些场景并重用代码来驱动性能或压力测试。 当我们通过简单地交换一些较低级别的组件来定义对多个测试范围有效的测试方案时,情况也是如此。 测试框架修改和影响测试生命周期的次数越多,重用就变得越困难。 通常,我提倡将测试生命周期,方案以及方案中各个步骤的实现的关注点分开。

Cucumber是一项可以轻松在多个范围内重用测试方案的技术。 我喜欢以一种非常抽象的方式定义方案并分别实现执行的方法。 最好用人类语言的Gherkin定义测试用例,最好是从纯粹的业务角度出发,而不会出现技术漏洞; 测试用例的实现可以互换。 这有点迫使在这些层之间切割。 在某些项目中,事实证明,在Cucumber测试中使用Gherkin格式可以与缺乏编程经验或没有编程经验的业务领域专家或人们进行交流。 相反,我还看到领域专家和QA工程师,如果测试场景方法简短且在测试内容中表现力十足,则他们非常擅长阅读Java代码。 我们对方法和内部API的命名越清楚,其他人就越能像prose一样阅读代码。 这项经验证实了这样一种想法,即在精心制作的Java代码之上不一定需要其他技术。

通常,项目越复杂,测试技术对生产率,可读性和可维护性的影响就越小,并且它越重要,我们就要关心测试代码的质量,精心设计的抽象层以及关注点的分离。 如果开发人员希望在此基础上使用其他技术,那很好,但是我们需要权衡利弊,例如,配置替代的JVM语言需要花费多少时间,它的依赖项和版本以及附加的权重。与在某些层上使用语法糖相比,我们的堆栈具有另一种技术。 可读性和可维护性来自精心设计适当的抽象层,分离关注点和命名。 清楚地说明断言失败时出错的原因主要来自断言技术,例如AssertJ,它在提供开发者断言由于什么原因而失败方面做得很好,因为开发人员首先做了断言。

如果您观看有关测试的演示中的教程或演示,这是我经常看不到的。 如果我们看简单的,类似于Hello World的示例,那么适当的测试代码质量和结构的重要性可能不会马上就变得不言而喻,而在小情况下,所添加的语法功能看起来似乎是巨大的收获。

本系列的下一部分和最后一部分将简要介绍其他端到端测试。

翻译自: https://www.javacodegeeks.com/2019/10/efficient-enterprise-testing-test-frameworks.html

测试框架 如何测试私有方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(二)之链表反转

一、链表反转 1、反转非递归算法 2、反转递归算法 链表结点&#xff1a; package cn.edu.scau.mk;/**** author MK* param <T>*/ public class Node<T> {private T data;private Node<T> next null;public Node(T data) {this.data data;}public T getD…

web安全测试视频课程专题_有关有效企业测试的视频课程

web安全测试视频课程专题我已经制作了一些有关有效企业测试的视频。 在实际项目中&#xff0c;我仍然认为该主题非常重要。 这是我在测试Enterprise Java项目中的经验以及一些示例。 1.介绍和有效的Maven使用 在此视频中&#xff0c;我将介绍测试过程&#xff0c;并演示如何使…

网络——获取Web数

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 “网络——获取Web数” 的基础知识&#xff1b; 0.2&#xff09; for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chap…

数据结构(三)之单链表反向查找

一、反向查找单链表 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到倒数第k个元素的下标为n-k&#xff0c;然后查找下标为n-k的元素。 2、优化查找 先找到下标为k的元素为记录点p1&#xff0c;然后设置新的记录点p2的下标从0开始&#xff0c;同时遍历两个…

java使用:: 表达式_Java 13:切换表达式的增强功能

java使用:: 表达式您可能还记得我以前的文章&#xff0c;在Java 12中&#xff0c;传统的switch语句得到了增强&#xff0c;因此可以用作表达式。 在Java 13中&#xff0c;对该功能进行了进一步的更改 。 break语句不能再返回值。 相反&#xff0c;您必须使用新的yield语句&…

网络——Base64Encode(转:自定义Base64编码器——Base64Encode)

【0】README 0.1&#xff09; 本文source code 转自 core java volume 2 &#xff0c; 旨在了解 如何定义一个 编码器&#xff0c; 如Base64Encode &#xff1b; 0.2&#xff09;注意&#xff1a; 区别自定义的 Base64Encode 和 java.util.Base64 编码器 0.3&#xff09;fo…

数据结构(四)之单链表查找中间结点

一、查找单链表中间结点 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到中间结点为n/2&#xff0c;然后查找下标为n/2的元素。 2、优化查找 先设置记录点fast、slow&#xff0c;下标均从0开始&#xff0c;fast走两步&#xff0c;slow走一步&#xff0c;同…

java面试常见面试问题_Java面试准备:15个Java面试问题

java面试常见面试问题并非所有的访谈都将重点放在算法和数据结构上—通常&#xff0c;访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中&#xff0c;通常没有任何“陷阱”问题&#xff0c;而是它们要求您利用内存和使用该语言的经验–换句话说&#xff0c;它们测试您对…

网络——提交表单数据(post方式)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——提交表单数据 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/cha…

html5实现最智能大气的公司年会抽奖(源码)

文章目录 1.设计来源1.1 主界面1.3 数据配置1.4 抽奖效果1.5 中奖效果 2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码2.6 项目结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

Linux入门(一)之权限指令系统管理

一、权限指令 普通用户需要使用sudo或者root超级管理员可以执行权限指令。 二、linux系统init程序 &#xff08;1&#xff09;运行init程序&#xff08;引用runoob.com&#xff09; init 进程是系统所有进程的起点&#xff0c;你可以把它比拟成系统所有进程的老祖宗&#xf…

java jsf_使用Java和JSF构建一个简单的CRUD应用

java jsf使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 JavaServer Faces&#xff08;JSF&#xff09;是用于构建Web应用程序的Java框架&#xff0c;其中心是作为用户…

网络——发送email(一个简单荔枝)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——发送email 的基础知识 &#xff1b; 2&#xff09; for souce code , please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapte…

算法七之希尔排序

一、希尔排序 &#xff08;1&#xff09;简介 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL&#xff0e;Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量…

cuba 平台_CUBA平台:TypeScript SDK和REST API

cuba 平台在本文中&#xff0c;我们将讨论已存在很长时间但尚未广为人知的CUBA平台的功能- 前端SDK生成器 &#xff0c;并了解它如何与CUBA的REST API插件一起使用 。 Java JavaScript –网络婚姻 仅八年前&#xff0c;我们Java开发人员在我们的Web应用程序中使用JavaScript作…

算法八之归并排序

一、归并排序原理 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序…

数据库编程——intro to JDBC

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 的基础知识 &#xff1b; 2&#xff09;JDBC起源&#xff1a; 96年&#xff0c; Sun公司发布了 第一版的java 数据库连接&#xff08;JDBC&#xff09;API&#…

java \t怎么从头开始_通过这些简单的步骤从头开始学习Java

java \t怎么从头开始Java是用于软件开发的最受欢迎的编程语言之一。 无论您的最终目标或技能水平如何&#xff0c;学习和掌握Java都将为您作为开发人员打开大门。 今天&#xff0c;我们将讨论一些原因&#xff0c;我们认为您应该开始学习Java&#xff0c;然后提供有关入门的深入…

HDFS 的dao

一、HDFS dao接口package cn.mk.dao;import java.io.FileNotFoundException; import java.io.IOException;import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus;public interface HDFSDao {public boolean mkDirs(String path) throws IOExcep…

数据库编程——JDBC 配置

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 配置 的基础知识 &#xff1b; 2&#xff09; update timestamp: 1602022101&#xff1b; 更新内容有&#xff1a; 上传了一些图片&#xff0c; 而且举证说明了 为…