测试案例6种编写方法_一种编写测试的好方法

测试案例6种编写方法

测试。 我最近一直在考虑测试。 作为我对各种项目所做的代码审查的一部分,我已经看到了数千行未经测试的代码。 这不仅是测试覆盖率统计数据指出这一点的情况,更是该项目中根本没有任何测试的情况 。 我一直听到这种悲惨状况的两个原因是什么? “我们没有时间”,紧随其后的是“完成代码后就去做”。

我在这里介绍的不是万能药。 它涵盖了单元测试,尤其是接口的单元测试。 接口是好东西。 接口定义合同。 接口,无论接口有多少种实现,都可以轻松,轻松地进行测试。 让我们看看如何使用此类结构作为示例。

fd98ced9 CustomerService是我们的界面。 为了使示例保持简单,它有两种方法,下面将进行介绍。 请注意javadoc-这是描述合同的地方。

public interface CustomerService
{/*** Retrieve the customer from somewhere.* @param userName the userName of the customer* @return a non-null Customer instance compliant with the userName* @throws CustomerNotFoundException if a customer with the given user name can not be found*/Customer get(String userName) throws CustomerNotFoundException;/*** Persist the customer.* @param customer the customer to persist* @return the customer as it now exists in its persisted form* @throws DuplicateCustomerException if a customer with the user name already exists*/Customer create(Customer customer) throws DuplicateCustomerException;
}

从图中可以看到,我们有两个此类的实现,RemoteCustomerService和CachingCustomerService。 这些的实现未显示,因为它们无关紧要。 我怎么说呢 很简单–我们正在测试合同。 我们为接口中的每个方法以及合约的每个排列编写测试。 例如,对于get(),我们需要测试存在具有给定用户名的客户时发生的情况,以及不存在时发生的情况。

public abstract class CustomerServiceTest
{@Testpublic void testCreate(){CustomerService customerService = getCustomerService();Customer customer = customerService.create(new Customer("userNameA"));Assert.assertNotNull(customer);Assert.assertEquals("userNameA",customer.getUserName());}@Test(expected = DuplicateCustomerException.class)public void testCreate_duplicate(){CustomerService customerService = getCustomerService();Customer customer = new Customer("userNameA");customerService.create(customer);customerService.create(customer);}@Testpublic void testGet(){CustomerService customerService = getCustomerService();customerService.create(new Customer("userNameA"));Customer customer = customerService.get("userNameA");Assert.assertNotNull(customer);Assert.assertEquals("userNameA",result.getUserName());}@Test(expected = CustomerNotFoundException.class)public void testGet_noUser(){CustomerService customerService = getCustomerService();customerService.get("userNameA");}public abstract CustomerService getCustomerService();
}

现在,我们对合同进行了测试,并且我们从未提及任何实现。 这意味着两件事:

  • 我们不需要为每个实现重复测试。 这是一件非常好的事情。
  • 没有一个实现正在测试中。 我们可以通过为每个实现添加一个测试类来纠正此问题。 由于每个测试类几乎都是相同的,因此我将仅演示RemoteCustomerService的测试。
public class RemoteCustomerServiceTest extends CustomerServiceTest
{public CustomerService getCustomerService(){return new RemoteCustomerService();}
}

就是这样! 现在,我们有了一种非常简单的方法来测试任何接口的多个实现,方法是预先进行艰苦的工作,并将测试新实现的工作减少到一个简单的方法中。

参考: Objective博客上的JCG合作伙伴 Steve Chaloner 编写测试的一种好方法 。

翻译自: https://www.javacodegeeks.com/2013/06/a-good-lazy-way-to-write-tests.html

测试案例6种编写方法

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

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

相关文章

python字符串查找匹配_说说在 Python 中,如何找出所有字符串匹配

Regex 对象有一个 findall() 方法,它会返回包含所查找字符串的所有匹配。这与 search() 方法明显不同,search() 将返回一个 Match 对象,其中包含被查找字符串中的 “ 第一次 ” 匹配文本。请看以下示例,注意区分:phone…

使用Spring MVC应用程序配置嵌入式H2控制台

在上一篇文章中,我们使用嵌入式H2数据库将Spring MVC应用程序部署到Tomcat。 在嵌入式数据库中浏览数据非常困难,因为我们无法连接外部客户端来查看数据。 H2提供了一个Web控制台,我们可以启用它并使用它来浏览数据,如下所示&…

Hashcat从入门到入土(二)

使用hashcat破解word密码 昨天的文章里给自己挖了一个坑,使用公司电脑显卡还是GT705古董级别的,显卡驱动也没设置好,导致使用hashcat的时候出现了exhausted的问题,导致密码没有算出来,今天我用自己电脑算一下&#xf…

将SQL server2019数据库部署在虚拟机上

下载Windows.iso 前段时间由于数据库文件丢失,导致项目再转入新的环境以后需要重新安装SQL server,但是由于win11对SQL server2019支持非常差,申请的SQL server2022的试用资格又迟迟没有批准导致我的数据库始终连不上,于是只能打…

sqoop mysql 安装_Sqoop安装及验证_MySQL

Sqoop安装及验证环境:系统Red Hatlinux 6.4Hadoop版本1.2.1Sqoop版本1.4.4Mysql数据库版本5.6.15通过Sqoop实现Mysql /Oracle与HDFS / Hbase互导数据http://www.linuxidc.com/Linux/2013-06/85817.htm[Hadoop] Sqoop安装过程详解http://www.linuxidc.com/Linux/2013…

restful web_泽西岛的RESTful Web服务

restful web我已经讨论了有关体系结构考虑事项<< link >>的早期文章&#xff0c;以成为可在我的系统/机器上使用的分布式环境上的RESTful系统。 本文我们将讨论如何基于REST体系结构考虑来构建Web服务。 本教程说明了如何使用Tomcat 6&#xff0c;Eclipse和Jersey …

常见操作系统调度算法研究(1)

FIFO FIFO全称是first in first out&#xff0c;是操作系统里面常见的一种算法&#xff0c;他就好比是一堆人在排一个队伍&#xff0c;按照先进先出的规则&#xff0c;谁首先排队谁就可以第一个出去。 它的缺点显而易见&#xff0c;如果第一个进去的家伙任务量过大&#xff0c…

常见操作系统调度算法研究(2)

轮转策略 轮转策略&#xff08;Round-Robin&#xff09;简称为RR&#xff0c;在RR里面&#xff0c;每个准备就绪的任务只能在有限的时间内运行&#xff0c;也就是说不管这个任务完成与否&#xff0c;都会切换任务到下一个。 由于它要频繁的切换队列&#xff0c;我们可以把准备…

使用Apache Ignite优化Spark作业性能(第1部分)

快来看看他们是如何工作的&#xff01; 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣&#xff0c;请查看本书的其余部分&#xff0c;以获取更多有用的信息。 Apache Ignite提供了几种提高Spark作业性能的方法&#xff1a;Ignite RD…

mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度

相信很多SQL Server DBA或开发人员在重建或重组大表索引时&#xff0c;都会相当郁闷&#xff0c;不知道索引重建的进度&#xff0c;这个对于DBA完全是一个黑盒子&#xff0c;对于系统负载非常大的系统或维护窗口较短的系统&#xff0c;你会遇到一些挑战。例如&#xff0c;你创建…

使用Eclipse Deeplearning4j构建简单的神经网络

神经网络导论 深度学习既包含深度神经网络又包含深度强化学习&#xff0c;这是机器学习的子集&#xff0c;而机器学习本身就是人工智能的子集。 广义上讲&#xff0c;深度神经网络执行机器感知&#xff0c;该机器感知从原始数据中提取重要特征&#xff0c;并对每个观察结果做出…

mysql 注入 绕过防火墙_绕过阿里云防火墙继续扫描探测和SQL注入

前言如今的互联网&#xff0c;WAF泛滥的年代&#xff0c;实在让我等脚本小子苦恼ing&#xff0c;尤其是阿里云服务器的自带防护&#xff0c;那不是一般的叫人牙疼&#xff0c;十个站8个站都是阿里云....最近遇到几个站都是阿里云的服务器&#xff0c;比如&#xff1a;泛微e-col…

java创建类的三个步骤_3个简单步骤即可测试Java 8

java创建类的三个步骤即将发布的Java 8版本为Java开发人员带来了许多新功能&#xff0c;但是升级时始终存在代码破裂的风险。 我们都记得Java 7出厂时有一系列非常严重的错误 。 当然&#xff0c;我们所有人都可以帮助避免在Java 8中出现相同的问题。我今天要介绍的方法是使用…

mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...

1、为什么说 Mybatis 是半自动 ORM 映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;Hibernate 属于全自动 ORM 映射工具&#xff0c;使用 Hibernate 查询关联对象或者关联集合对象时&#xff0c;可以根据对象关系模型直接获取&#xff0c;所以它是全自动的。而 Mybati…

使用Pargon-neo进行5G sync相关的测试

前言 Paragon-neo是Calnex旗下的一款测试仪器&#xff0c;主要用于5G的高精度场景下的PTP与SyncE的测试&#xff0c;它可以提供高达100GbE的测试速度&#xff0c;可以用在ITU-T G.8273.2 C/D类边界时钟测试&#xff0c;符合O-RAN的O-DU和O-RU设备&#xff0c;以及设计和部署5G…

常用的光电模块SFP、QSFP等解析

前言 学习记录 BNC 是用来接同轴电缆的接口&#xff0c;好处是降低了信号之间的相互干扰&#xff1b;主要市场是安防行业以及一些使用同轴电缆作为传输介质的令牌以太网。举个例子就是小时候的电视机后面经常能够看见这种线&#xff0c;BNC接头中间有一个凸起来的针&#xff…

零分钟即可在容器开发套件(CDK)上实现云运营

尽管这很有趣&#xff0c;但实际上并不可行&#xff0c;很快就遇到了使用限制。前一段时间&#xff0c; 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中&#xff0c;并将其放在基于开放技术的Cloud解决…

NTPv4协议解析

前言 本文的撰写基于RFC5905.NTP 是时间网络控制协议&#xff0c;V4版本相交V3版本&#xff0c;修复了V3存在的一些问题。尤其是NTPV4的拓展时间戳鼓励使用浮动双数据类型&#xff0c;这样使得NTP能够更好的支持1ns的场景&#xff0c;轮询间隔也从上一代的最多1024s拓展到了36…

看完这篇还不会化简卡诺图?你来打我

最通俗易懂的的卡诺图化简教程 首先我们来介绍一下什么是卡诺图&#xff1a; 卡诺图是逻辑函数的一种图形表示。一个逻辑函数的卡诺图就是将此函数的最小项表达式中的各最小项相应地填入一个方格图内&#xff0c;此方格图称为卡诺图。 卡诺图的构造特点使卡诺图具有一个重要性…

几种常见的集成触发器(D、T、JK)

同步RS触发器存在“空翻”现象&#xff0c;即触发器存在多次翻转的现象&#xff0c;空翻破坏了“时序电路按时钟节拍工作&#xff0c;每个时钟脉冲作用下电路的状态只发生一次转换”的基本原则 解决方法&#xff1a;将电平触发改为边沿触发&#xff0c;使得触发器旨在时钟脉冲…