junit编写测试代码_编写数据访问代码测试-不测试框架

junit编写测试代码

当我们向数据访问代码编写测试时,是否应该测试其公共API的每种方法?

一开始听起来很自然。 毕竟,如果我们不测试所有内容,那么如何知道我们的代码可以按预期工作?

这个问题为我们提供了重要的线索:

我们的代码



我们应该只对自己的代码编写测试。

什么是我们自己的代码?

有时很难确定我们应该测试的代码。 原因是我们的数据访问代码与将信息保存到使用的数据存储中或从中读取信息时所使用的库或框架紧密集成在一起。

例如,如果我们要创建一个向Todo对象提供CRUD操作的Spring Data JPA存储库,则应创建一个扩展CrudRepository接口的接口。 TodoRepository接口的源代码如下所示:

import org.springframework.data.repository.CrudRepository;public TodoRepository extends CrudRepository<Todo, Long> {}

即使我们没有向存储库接口添加任何方法, CrudRepository接口也声明了许多可供使用我们存储库接口的类使用的方法。

这些方法不是我们的代码,因为它们是由Spring Data团队实现和维护的。 我们只使用它们。

另一方面,如果我们向存储库添加自定义查询方法,情况将发生变化。 假设我们必须找到标题等于给定搜索词的所有待办事项。 在将此查询方法添加到我们的存储库接口后,其源代码如下所示:

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;public TodoRepository extends CrudRepository<Todo, Long> {@Query("SELECT t FROM Todo t where t.title=:searchTerm")public List<Todo> search(@Param("searchTerm") String searchTerm)
}

可以很容易地断言该方法是我们自己的代码,这就是为什么我们应该对其进行测试。 但是,事实有点复杂。 即使JPQL查询是由我们编写的,Spring Data JPA仍会提供将查询转发给使用过的JPA提供程序的代码。

而且,我仍然认为该查询方法是我们自己的代码,因为其中最重要的部分是由我们编写的。

如果要标识自己的数据访问代码,则必须找到每种方法的基本部分。 如果这部分是我们编写的,则应将该方法视为自己的代码。

这一切都很明显,更有趣的问题是:

我们应该测试吗?

我们的存储库接口为使用它的类提供了两种方法:

  1. 它提供了由CrudRepository接口声明的方法。
  2. 它提供了我们编写的查询方法。

我们是否应该将集成测试写到TodoRepository接口并测试所有这些方法?

不,我们不应该这样做,因为

  1. CrudRepository接口声明的方法不是我们自己的代码。 这段代码是由Spring Data团队编写和维护的,他们已经确保它可以工作。 如果我们不相信他们的代码有效,那么我们就不应该使用它。
  2. 我们的应用程序可能有许多存储库接口,这些接口扩展了CrudRepository接口。 如果决定对CrudRepository接口声明的方法编写测试,则必须向所有存储库编写这些测试。 如果选择这种方式,我们将花费大量时间对其他人的代码编写测试,坦率地说,这样做是不值得的。
  3. 我们自己的代码可能是如此简单,以至于将测试写入我们的存储库是没有意义的。

换句话说,我们应该集中精力寻找这个问题的答案:

我们应该将集成测试写入我们的存储库方法(由我们编写的方法),还是只编写端到端测试?

这个问题的答案取决于我们存储库方法的复杂性。 我知道复杂性是一个模糊的词,这就是为什么我们需要某种指南来帮助我们找到测试存储库方法的最佳方法的原因。

做出此决定的一种方法是考虑测试每种可能情况所需的工作量。 这是有道理的,因为:

  1. 将集成测试写入单个存储库方法比将相同的测试写入使用存储库方法的功能所需的工作更少。
  2. 无论如何,我们都必须端对端地编写。

这就是为什么尽量减少我们的投资(时间)和最大化我们的利润(测试覆盖率)的原因。 我们可以按照以下规则进行操作:

  • 如果我们只编写几个测试就可以测试所有可能的情况,那么我们就不应该浪费时间将集成测试写入我们的存储库方法。 我们应该编写端到端测试,以确保该功能按预期工作。
  • 如果我们需要编写多个测试,则应该将集成测试编写到我们的存储库方法中,并且仅编写一些端到端测试(烟雾测试)。

摘要

这篇博客文章教会了我们两件事:

  • 我们不应该浪费时间将测试编写到其他人编写的数据访问框架(或库)中。 如果我们不信任该框架(或库),则不应使用它。
  • 有时我们也不应该对数据访问代码编写集成测试。 如果经过测试的代码足够简单(我们可以通过编写一些测试来涵盖所有情况),则应该通过编写端到端测试来对其进行测试。

翻译自: https://www.javacodegeeks.com/2014/07/writing-tests-for-data-access-code-dont-test-the-framework.html

junit编写测试代码

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

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

相关文章

mysql直接执行文件格式_Windows 环境下执行 .sql 格式文件方式

windows 命令行中有2种执行 .sql 文件的方式&#xff1a;直接行文件 和 先进入mysql命令行然后执行文件。具体操作如下:1. 直接在windows命令行执行。打开windows命令行(winR打开运行窗口然后输入cmd&#xff0c;回车)&#xff0c;进入mysql的本机地址&#xff0c;如果配置了环…

python输入多个坐标点_判断多个坐标是否在同一条直线上|Python练习系列[13]

练习内容:判断多个坐标是否在同一条直线上完整代码和注释如下print(请输入几个点的横纵坐标,程序将会返回这几个点是否在同一条直线上)def coor_nums():#获得每个值的横纵坐标int_list[]#初始化坐标列表wrong_list[]#初始化错误列表judgement#判断是否需要修正坐标值while True…

Java大数据处理的流行框架

大数据挑战 在公司需要处理不断增长的数据量的各个领域中&#xff0c;对大数据的概念有不同的理解。 在大多数这些情况下&#xff0c;需要以某种方式设计所考虑的系统&#xff0c;以便能够处理该数据&#xff0c;而不会随着数据大小的增加而牺牲吞吐量。 从本质上讲&#xff0c…

工信部python证书多少钱_python requests SSL证书问题

错误信息如下&#xff1a;requests.exceptions.SSLError: ("bad handshake: Error([(SSL routines, tls_process_server_certificate, certificate verify failed)],)",)python做爬虫&#xff0c;对于有的网站&#xff0c;需要验证证书&#xff0c;比如&#xff1a;1…

mysql binlog线程恢复_使用MySQL SQL线程回放Binlog实现恢复

[toc]1. 需求部分1.1 基于MySQL复制同步特性&#xff0c;尝试使用Replication的SQL线程来回放binlog&#xff0c;可基于以下逻辑模拟场景做全量xtrabackup备份模拟日常备份执行sysbench压测4张表&#xff0c;20个线程&#xff0c;压测10分钟&#xff0c;模拟大量binlog删除实例…

带有Prometheus的Spring Boot和测微表第6部分:保护指标

以前&#xff0c;我们使用Prometheus成功启动了Spring Boot应用程序。 Spring应用程序中的一个端点正在公开我们的指标数据&#xff0c;以便Prometheus能够检索它们。 想到的主要问题是如何保护此信息。 Spring已经为我们提供了强大的安全框架 因此&#xff0c;将其轻松用于…

列举python中常用的数据类型_列举Python常用数据类型并尽量多的写出其中的方法...

#1 把字符串的第一个字符大写string.capitalize()#2 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串string.center(width)#3 返回 str 在 string 里面出现的次数&#xff0c;如果 beg 或者 end 指定则返回指定范围内 str 出现的次数string.count(str, beg0, endl…

mysql 二元分词_MySQL 中文分词原理

一&#xff0c;首先我们来了解一下其他几个知识点&#xff1a;1. Mysql的索引意义&#xff1f;索引是加快访问表内容的基本手段&#xff0c;尤其是在涉及多个表的关联查询里。当然&#xff0c;索引可以加快检索速度&#xff0c;但是它也同时降低了索引列的插入&#xff0c;删除…

python 元类 type_Python 使用元类type创建类对象常见应用详解

本文实例讲述了Python 使用元类type创建类对象。分享给大家供大家参考&#xff0c;具体如下&#xff1a;type("123") 可以查看变量的类型;同时 type("类名",(父类),{类属性:值,类属性2:值}) 可以创建一个类。在Python中不建议一个函数具有不同的功能(重载)…

使用AWS Elastic Beanstalk轻松进行Spring Boot部署

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认谁在发出请求&…

mysql报错乱码_连接mysql服务器报错时,出现乱码

页头用了header(content-type:text/html;charsetutf-8);try{$this->dbonew PDO($dsn,$dbuser,$dbpassword);}catch(Exception $e){echo $e->getMessage();}连接失败时会报错&#xff0c;但是乱码&#xff0c;IE下编码查看是UTF-8&#xff0c;但是是乱码&#xff0c;如果选…

自学python条件_自学Python2.8-条件(if、if...else)

自学Python2.8-条件(if、if...else)1.if 判断语句if语句是用来进行判断的&#xff0c;其使用格式如下&#xff1a;if 要判断的条件:条件成立时&#xff0c;要做的事情当“判断条件”成立(True)时&#xff0c;才执行语句&#xff1b;反之&#xff0c;则不执行。执行语句可以为多…

mac lion 安装 mysql_mac osx下安装mysql

操作系统版本&#xff1a;mac osx 10.11mysql版本&#xff1a;官网下载dmg v5.6.33 https://www.mysql.com/安装步骤1.双击dmg安装2.开启mysql服务系统偏好设置-底部-mysql-打开服务这个时候还不能使用mysql命令&#xff0c;需要配置mysql命令的路径。3.配置环境变量mysql的路…

python爬虫实训日志_Python学习学习日志——爬虫《第一篇》(BeautifulSoup)

爬虫简介(学习日志第一篇)一、爬虫介绍爬虫&#xff1a;一段自动抓取互联网信息的程序&#xff0c;从互联网上抓取对于我们有价值的信息。二、Pyyhon爬虫架构Python 爬虫架构主要由五个部分组成&#xff0c;分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有…

zookeeper 负载_ZooKeeper,策展人以及微服务负载平衡的工作方式

zookeeper 负载Zookeeper如何确保每个工人都能从工作委托经理那里愉快地完成工作。 Apache ZooKeeper是注册&#xff0c;管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时&#xff0c;它是技术堆栈中必不可少的成员&#xff0c;这些节点…

mysql error handler_MySql错误处理(二) - Condition Handle

20.2.10.2. DECLARE处理程序DECLARE handler_type HANDLER FOR condition_value[,...] sp_statementhandler_type:CONTINUE| EXIT| UNDOcondition_value:SQLSTATE [VALUE] sqlstate_value| condition_name| SQLWARNING| NOT FOUND| SQLEXCEPTION| mysql_error_code这个语句指定…

方程组的直接解法和迭代法 python_数据与算法总结——基本数值算法2(线性方程组)...

4 基本数值算法4.2 线性方程组4.2.1 线性方程组的特性解的存在性和唯一性满足下面条件之一&#xff0c;A非奇异&#xff0c;可逆&#xff1a;如果b属于A的列向量张成的空间&#xff0c;则称方程组是相容的。范数需要满足次可加性&#xff08;三角不等式&#xff09;。对于n维矢…

高效的企业测试-集成测试(3/6)

本系列的这一部分将展示如何通过代码级以及系统级集成测试来验证我们的应用程序。 &#xff08;代码级&#xff09;集成测试 集成测试一词有时在不同的上下文中使用不同。 根据Wikipedia的定义&#xff0c;我指的是在代码级别上验证多个组件之间相互作用的测试。 通常&#x…

mysql level用法_MYSQL使用方法

1.查询一张表&#xff1a; select * from 表名&#xff1b;2.查询指定字段&#xff1a;select 字段1&#xff0c;字段2&#xff0c;字段3….from 表名&#xff1b;3.where条件查询&#xff1a;select 字段1&#xff0c;字段2&#xff0c;字段3 frome 表名 where 条件表达式…

python程序设计之文件_Python程序设计之文件操作(2)

print(sub_path)if os.path.isdir(sub_path):visitdir(sub_path)path1C:UsersQinHsiuPythonProjectsStringoovisitdir(path1)方法二&#xff1a;使用walk()函数来实现#方法二,通过walk()方法指定遍历目录def visidir2(path):if not os.path.isdir(path):print(error!,endn)retu…