为数据访问代码编写测试–不测试框架

当我们向数据访问代码编写测试时,是否应该测试其公共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

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

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

相关文章

visual studio 应用场景

转载于:https://www.cnblogs.com/zhangbing12304/p/10894347.html

elementUI-添加自定义图标

elementui的小图标有限&#xff0c;跟UI给的不一样&#xff0c;这个时候咋办呢&#xff1f;百度走起。。。。参考了两篇博主分享的 自定义elementui中的图标 和 建立图标库&#xff0c;这里主要用到第一种 实际中&#xff1a; elementUI导航栏 具体代码&#xff1a; //自定…

富文本wangEditor的批量激活

最近项目中使用了wangEditor这个轻量级的富文本框&#xff0c;由于需求是一个页面中会有多个富文本框同时激活&#xff0c;所以写了个批量激活的jquery方法&#xff0c;分享一下 1 // 激活富文本框2 var wangEditorActive function(){3 var wBoxs $(".editorbox&quo…

Flex调用WebService后的数据处理

如果WebService返回的数据为DataTable或List<>类型&#xff0c;可以在每次读取数据的时候加入断点&#xff0c;然后观察最终生成数据的结构&#xff0c;断点最好加在ResultEvent事件内&#xff0c;因为这个时候才能确保从WebService获取到了数据 下面的例子分别接收从Web…

echarts(一)下载引入,调色盘,[标题、图例组件、坐标轴]

一个简单的例子 1. 下载并引入 &#xff08;1&#xff09;npm install echarts --save &#xff08;2&#xff09;import echarts from echarts //main.js引入echarts 或者在组件中按需引入&#xff0c;查看按需引入的详细模块 <script>// 引入 ECharts 主模块var echa…

P3740 [HAOI2014]贴海报 离散化+线段树

题目描述 Bytetown城市要进行市长竞选&#xff0c;所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理&#xff0c;城市委员会为选民准备了一个张贴海报的electoral墙。 张贴规则如下&#xff1a; electoral墙是一个长度为N个单位的长方形&#xff0c;每个单位…

分组,采样和批处理– Java 8中的自定义收集器

在第一篇文章的后续部分&#xff0c;这次我们将编写一些更有用的自定义收集器&#xff1a;用于按给定的标准进行分组&#xff0c;采样输入&#xff0c;批处理和在固定大小的窗口上滑动。 分组&#xff08;计数事件&#xff0c;直方图&#xff09; 假设您有一些项目的集合&…

将G1内的SIM卡联系人导入到GMAIL的联系人中

将G1内的SIM卡联系人导入到GMAIL的联系人中 具体方法是&#xff1a;进入联系人——按下“MENU"键——导入联系人——按下“MENU"键——“全部导入”——“Contact type”下选择“Google"。这样你的SIM联系人就可以导入到你的设备中了&#xff08;联系人后会有“…

Dreamweaver Flash Photoshop网页设计综合应用 (智云科技) [iso] 1.86G​

全书共15章&#xff0c;主要包括网页制作基础、Dreamweaver CC网页制作、Photoshop CC网页图像设计、Flash CC网页动画设计以及综合案例实战5个部分。通过本书的学习&#xff0c;不仅能让读者学会三大软件的基本操作&#xff0c;而且本书中列举的实战案例&#xff0c;还可以让读…

element解决表格错位问题

https://www.jianshu.com/p/de922caf337c https://blog.csdn.net/qq_15385627/article/details/81700731 保留默认参数&#xff1a; https://segmentfault.com/q/1010000017831798/a-1020000017841050 解决element表格错位 /*解决表格错位&#xff0c;必须加在index.html或APP…

margin和text-align实现水平居中的区别

1.首先text-align只应用于内联块和内联元素 text-align影响的是元素中的文本内容的对其方式&#xff08;默认是left&#xff0c;设置为center时水平居中&#xff09; 所以&#xff0c;将text-align设置为center时&#xff0c;只有当应用于块级元素并且元素内容为文本时&#xf…

如何使用示例从Java中的类路径加载资源

Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文件夹中有一个属性文件 …

Ext 3.0 +ASP.NET2.0 可视化开发介绍

Ext Designer 总算出来了&#xff01;&#xff01;&#xff01;基于Web的应用开发终于可以可视化开发了&#xff0c;而且可以几乎不敲1行代码。 准备工具&#xff1a; &#xff08;1&#xff09;Ext Designer 1.0.2 &#xff08;2&#xff09;Visual Studio 2005 第一步&#x…

收集五款常用的HTML编辑软件

HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标记语言或超文本链接标示语言&#xff0c;是目前网络上应用最为广泛的语言&#xff0c;也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本&#xff0c;HTML命令可以说明文字、图形、动画、声…

创建vue项目(一)搭建vue-cli、项目文件介绍、简单配置

记录一下 拉取项目时 npm run dev 报错 输入&#xff1a;npm rebuild node-sass 再重新 npm run dev 如果不能解决&#xff0c;请看这里 一、搭建vue-cli vue create 项目名称? Please pick a preset: > default (babel, eslint) //默认 > Manually select features …

JPA / Hibernate实体状态转换的初学者指南

介绍 Hibernate将开发人员的思维方式从SQL语句转移到实体状态转换。 一旦实体由Hibernate主动管理&#xff0c;所有更改将自动传播到数据库。 操作域模型实体&#xff08;及其关联&#xff09;比编写和维护SQL语句容易得多。 如果没有ORM工具&#xff0c;则添加新列需要修改所…

C# 接收邮件

C#没有内置收邮件的类&#xff0c;参考网络上的代码&#xff0c;针对POP3协议服务器使用 Jmail组件来收邮件&#xff0c;针对IMAP协议服务器使用LumiSoft.Net 。 另外&#xff0c;一般免费邮箱需要在邮箱设置中开启 POP3&#xff08;或IMAP&#xff09;、 SMTP服务才可以使用非…

js来监控复制粘贴

平时我们在复制网页上面代码到控制台调试时&#xff0c;有时会出现复制过来的代码后面加上了一下描述信息&#xff08;作者、版权等信息&#xff09;&#xff0c;每次需要删除才能运行&#xff0c;所以今天看看怎么能保证我们粘贴的代码不携带这些信息呢&#xff1f; (function…

创建vue项目(二)引入elementUi、axios、准备静态资源、封装组件(.vue,js代码等)

下载安装node -> vue-cli -> 配置路由 -> 引入elementUi -> 公共组件 一、引入elementUi 顺便一提axios使用说明 和axios在vue中使用 二、准备静态资源 三、封装.vue公共组件 四、封装.js公共组件 五、封装公共的js代码 六、封装全局的filter、directive等 一、引入…

Spring DI的配置使用

1、 依赖和依赖注入 传统应用程序设计中所说的依赖一般指“类之间的关系”&#xff0c;那先让我们复习一下类之间的关系&#xff1a; 泛化&#xff1a;表示类与类之间的继承关系、接口与接口之间的继承关系&#xff1b; 实现&#xff1a;表示类对接口的实现&#xff1b; 依赖&a…