maven junit测试_使用Maven Failsafe和JUnit @Category将集成测试与单元测试分开

maven junit测试

为什么单元测试应与集成测试分开运行

单元测试级别的TDD相当简单,因为单元测试中的类要么没有复杂的依赖关系,要么使用模拟框架(例如Mockito)来模拟依赖关系。 但是,当我们进入集成测试时,TDDSwift变得困难。 集成测试基本上是在测试具有部分或全部依赖关系的组件,而不是全部模拟它们。 示例包括跨多个层的测试,读取或写入数据库或文件系统的测试,需要启动Servlet容器或EJB容器的测试,涉及网络通信,Web服务的测试等。

集成测试往往比较脆弱和/或缓慢 。 例子:

  • 与数据库对话的测试可能不会失败,不是因为代码中的逻辑错误,而是因为数据库已关闭,数据库的URL /用户名/密码已更改,或者数据库中的数据有误。
  • 读取或写入磁盘的测试速度很慢,并且每次运行测试时,都需要使用正确的数据或内容来重置文件或数据库。
  • 打包和部署到容器很慢。
  • 进行网络调用的测试失败可能不是因为代码中的逻辑错误,而是因为网络资源不可用,或者网络本身存在问题。

这些麻烦往往会阻止开发人员频繁运行测试。 当测试运行的次数很少时,开发人员最终会在捕获错误之前编写大量代码。 因此,当不经常运行测试时,生产率下降,因为编写大量代码后更难发现和修复错误,并且存在质量问题的风险增加。 同样,当运行测试很麻烦时,不鼓励开发人员编写足够的测试。

因此,将单元测试与集成测试分开运行是有意义的。 单元测试完全在内存中运行,没有任何外部依赖关系,因此,即使对于大型项目,它们也都应该在短短几秒钟之内运行,并且每次都应稳定运行,因为它们仅取决于被测代码的逻辑。 因此,鼓励开发人员进行每一个小的更改就可以运行所有单元测试。

使用Maven故障保护和JUnit @Category进行集成测试

分离集成测试的方法不止一种。 默认情况下,故障保护会选择后缀为“ IT”或“ ITCase”或以“ IT”为前缀的任何类。 但是,某些测试框架也需要后缀或前缀,这使得使用该方法很麻烦。 另一种方法是将集成测试放在单独的源目录中。 我选择使用JUnit @Category,因为我还使用了Concordion,它的测试类中需要一个后缀。

本文的其余部分仅记录了我如何实施John Doble在2012年发表的名为“使用Maven和JUnit类别进行单元和集成测试”的建议 。 您可以在这里找到我的源代码 。

创建JUnit类别

创建JUnit类别只是简单地创建一个空接口。 真的,就是这样! 见下文:

package com.orangeandbronze.test;public interface IntegrationTest {}

现在,我可以将此“标记接口”作为类别应用于我的集成测试–在下面的示例中,应用于SectionDaoTest。

import org.junit.experimental.categories.Category;
import com.orangeandbronze.test.IntegrationTest;@Category(IntegrationTest.class)
public class SectionDaoTest extends DaoTest {...
}

添加Surefire和故障安全插件

现在添加Surefire和Failsafe插件。 我需要排除Surefire(运行单元测试)中IntegrationTest标记的所有测试,并在Failsafe(运行集成测试)中包括IntegrationTest标记的所有测试。 另外,我必须包含“ ** / *。java”,否则测试将无法运行,我也不知道为什么。

<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.18.1</version><configuration><excludedGroups>com.orangeandbronze.test.IntegrationTest</excludedGroups></configuration>
</plugin>
<plugin><artifactId>maven-failsafe-plugin</artifactId><version>2.18.1</version><configuration><includes><include>**/*.java</include></includes><groups>com.orangeandbronze.test.IntegrationTest</groups></configuration><executions><execution><goals><goal>integration-test</goal><goal>verify</goal></goals></execution></executions> 
</plugin>

运行测试

所以现在,当我运行mvn test时,仅运行单元测试,而当我运行mvn Integration-testmvn verify (我通常运行mvn verify)时,不仅会运行单元测试,还会打包我的项目,然后集成测试运行。

在一个真实的项目中,每个开发人员只需几次更改即可运行所有的单元测试,一天要进行数十次,而他的运行频率则要低一些,但每天至少一次。 CI服务器还将在其构建期间运行单元测试和集成测试。

翻译自: https://www.javacodegeeks.com/2015/01/separating-integration-tests-from-unit-tests-using-maven-failsafe-junit-category.html

maven junit测试

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

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

相关文章

c语言中continue语句的作用是什么

continue 的作用是结束本次循环&#xff0c;即跳过循环体中下面尚未执行的语句&#xff0c;然后进行下一次是否执行循环的判定。注意&#xff1a;continue 语句只结束本次循环&#xff0c;而不是终止整个循环。continue 只能在循环语句中使用&#xff0c;即只能在 for、while 和…

java jar killed_容器中Java 程序OOMKilled原因浅析

背景&#xff1a;业务的容器化刚刚搞完&#xff0c;线上开始告警&#xff0c;容器重启&#xff0c;容器重启。describe pod 查看原因是OOMKilled分析&#xff1a;OOMKilled 是pod 中的进程使用的内存超过了.spec.containers[*].resources.limits.memory中定义的内存限制&#x…

jdk 8 集合对象排序_使用JDK 8流在包装对象的集合和包装对象的集合之间转换

jdk 8 集合对象排序我发现使用基于Java的应用程序时&#xff0c; 装饰器和适配器有时会很有用。 这些“包装器”在各种情况下都能很好地工作&#xff0c;并且相当容易理解和实现&#xff0c;但是当需要包装对象的层次结构而不是单个对象时&#xff0c;事情会变得有些棘手。 在这…

eof在c语言中表示什么

在C语言中&#xff0c;或更精确地说成C标准函数库中表示文件结束符&#xff08;end of file&#xff09;。在while循环中以EOF作为文件结束标志&#xff0c;这种以EOF作为文件结束标志的文件&#xff0c;必须是文本文件。在文本文件中&#xff0c;数据都是以字符的ASCII代码值的…

go odroid_小众奇葩!Odroid Go Super简评

小众奇葩&#xff01;Odroid Go Super简评2021-02-27 17:19:277点赞11收藏18评论小编注&#xff1a;此篇文章来自即可瓜分10万金币&#xff0c;周边好礼达标就有&#xff0c;邀新任务奖励无上限&#xff0c;点击查看活动详情儿时出生于苏北小城消息闭塞 玩具不多1994年 老爸南下…

strcpy函数的作用是什么

strcpy函数的作用是复制字符串。C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大&#xff0c;而源字符串的长度又太长&#xff0c;可能会造成缓冲溢出的情况。声明下面是 strcpy() 函数的声明。c…

fork join框架_Fork / Join框架vs.并行流vs.ExecutorService:最终的Fork / Join基准

fork join框架Fork / Join框架在不同配置下如何工作&#xff1f; 就像即将到来的《星球大战》&#xff08;Star Wars&#xff09;一样&#xff0c;围绕Java 8并行性的批评也充满了兴奋。 并行流的语法糖带来了一些炒作&#xff0c;就像我们在预告片中看到的新型光剑一样。 现在…

scanf在c语言中的作用是什么?

scanf()函数scanf()是C语言中的一个输入函数。与printf函数一样&#xff0c;都被声明在头文件stdio.h里&#xff0c;因此在使用scanf函数时要加上#include 。&#xff08;在有一些实现中&#xff0c;printf函数与scanf函数在使用时可以不使用预编译命令#include 。&#xff09;…

hive kerberos java_Kerberos身份验证错误 - Sqoop通过Hive从SQL导入HDFS

我给出了以下Sqoop命令&#xff1a;sqoop import \--connect "jdbc:sqlserver://ServerName:1433;databaseNameTESTDB;integratedSecuritytrue" \--driver com.microsoft.sqlserver.jdbc.SQLServerDriver \--table dbo.test_table \--username hduser \-P \--hive-im…

amqp rabbitmq_通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

amqp rabbitmqSpring Integration消息通道默认情况下将消息存储在内存中。 这是因为内存速度快&#xff0c;易于实现&#xff0c;并且不会增加网络成本。 但是&#xff0c;在某些情况下&#xff0c;这可能会引起问题&#xff0c;因为如果应用程序崩溃或服务器意外关闭&#xff…

java fx choicebox_JavaFX:具有图像和文本的ChoiceBox

我想用JavaFX ChoiceBox创建一个下拉菜单,其中每个条目都包含一个不同的图标,旁边是一个短文本. (例如,在语言选择器中,左侧有一个小标志,右侧有该语言的名称.)做这个的最好方式是什么&#xff1f;我试图通过CSS做到这一点.以下内容几乎可以使用,但是当然它将为所有条目设置相同…

虚函数和纯虚函数的区别是什么?

虚函数(impure virtual)  C 的虚函数主要作用是“运行时多态”&#xff0c;父类中提供虚函数的实现&#xff0c;为子类提供默认的函数实现。  子类可以重写父类的虚函数实现子类的特殊化。  如下就是一个父类中的虚函数&#xff1a;class A{public: virtual void ss(…

java 动态读取配置文件_java读取配置文件的几种方法

java读取配置文件的几种方法在现实工作中&#xff0c;我们常常需要保存一些系统配置信息&#xff0c;大家一般都会选择配置文件来完成&#xff0c;本文根据笔者工作中用到的读取配置文件的方法小小总结一下&#xff0c;主要叙述的是spring读取配置文件的方法。一.读取xml配置文…

java 编译 器 ide_Java 8发布一年后,IDE和编译器尚未完全就绪

java 编译 器 ide一年前&#xff0c; 2014年3月18日 &#xff0c;发布了Java SE 8&#xff0c;并通过lambda表达式和streams API带来了功能性编程的幸福。 这对于我们所有的Java生态系统都是个好消息&#xff0c;许多人已经升级到Java8。Stack Overflow已经提出了将近2500个有关…

windows.h有哪些函数

C语言windows.h库的常用函数1&#xff1a;FindWindow函数该函数可以通过窗口类名或者窗口标题名来查找特定窗口句柄&#xff0c;返回值是窗口的句柄&#xff08;在Windows中&#xff0c;句柄是一个系统内部数据结构的引用。例如当你操作一个窗口&#xff0c;或说是一个Delphi窗…

yxcms安装环境php,Windows7下PHP开发环境安装配置图文方法

操作系统&#xff1a;Windows 7 UltimateWEB服务器&#xff1a;IIS 6.1(内部版本7600)。数据库&#xff1a;MySql5.0.67PHP版本&#xff1a;5.2.13我还担心Win7下可能会不兼容&#xff0c;结果是一点问题都没有。一、安装MySql数据库客户端工具Navicat(导航猫)在这里下载&#…

apache camel_您的Apache Camel应用程序现在包括现成的文档

apache camel几个月前&#xff0c;我在博客中发布了有关即将发布的2.15版本的功能&#xff0c;该功能包括获取有关在端点上配置的每个属性的详细信息的功能-Apache Camel&#xff0c;请向我解释这些端点选项的含义 。 我们继续沿着这条道路前进&#xff0c;今天我们将其从端点…

C语言的三种基本程序结构是什么

一、顺序结构表达式语句、空语句、函数调用语句、复合语句程序举例&#xff1a;从键盘输入一个大写字母&#xff0c;要求改用小写字母输出。#includeint main(){ char x,y; scanf("%c",&x); if(x > A && x < Z) { …

php gd png透明,调整PNG大小并将其放在PHP / GD中较大的透明背景上?

所以&#xff0c;一切工作正常。我已经调整了源PNG大小并正确定位在创建的背景上&#xff0c;但PNG外部的其他区域变黑。我已经通过使用imagecolortransparent使它变得透明&#xff0c;但是这使png边缘变得光滑。这是我目前正在制作PNG周围的黑色条纹。请记住&#xff0c;我只在…

Hibernate锁定模式– PESSIMISTIC_READ和PESSIMISTIC_WRITE如何工作

介绍 Java Persistence API带有完善的并发控制机制&#xff0c;支持隐式和显式锁定。 隐式锁定机制很简单&#xff0c;它依赖于&#xff1a; 乐观锁定&#xff1a;实体状态更改可以触发版本增加 行级锁定&#xff1a;基于当前运行的事务隔离级别 &#xff0c;INSERT / UPDATE…