构建忽略测试_分类测试以减少构建时间

构建忽略测试

在继续本文的主要内容之前,让我们先进行一些定义。

单元测试

单元测试是小型的(测试一个用例或一个单元),在内存中运行(不与数据库,消息队列等交互),可重复且快速的测试。 对于我们的对话,让我们将其限制为开发人员编写的基于JUnit的测试用例,以检查其各自的代码段。

整合测试

集成测试更大(测试一个流程或组件集成),不一定只在内存中运行(与数据库,文件系统,消息队列等交互),肯定较慢,并且不一定可重复(因为结果可能会更改)以防万一,例如在数据库中做了一些更改)。

为什么这种差异化很重要?

在敏捷编程中,基本概念之一是每隔一段时间(一天在开发人员盒中多次)运行单元测试,并强制集成测试每天运行一次(在连续集成服务器上而不是在开发人员盒上)。 。 请注意,开发人员应该能够在需要时运行集成测试,这仅仅是因为它与单元测试是分开的,因此,开发人员现在可以选择不在每次运行测试时都运行集成测试。

这种灵活性究竟有何帮助?

  1. 开发人员的构建频率更高。 在敏捷世界中,这意味着开发人员会更频繁地运行单元测试(每天通常运行几次)。
  2. 开发人员可以更快地了解错误,并减少浪费的时间来编码损坏的代码库。 这意味着节省时间和金钱。
  3. 修复错误更容易,更快。 考虑到构建的频率,可以提交较少数量的“违规代码”,因此更容易将bug归零并进行修复。
  4. 最后但并非最不重要的一点是,任何进行过任何专业编码的人都将证明,虽然偶尔可以休息10分钟有助于提高编码效率,但是没有什么比等待一个小时的构建更有效地杀死编码者的创造力了。 对士气的影响是无形的,但却是巨大的。

我到底该如何减少构建时间?

没有一个适合所有人的尺码(从来没有)。 缩短构建和发布时间的确切可执行步骤将是许多变量的因素,其中包括产品的技术堆栈(Java,DotNet,php),构建和发布技术(批处理文件,Ant,Maven)以及许多其他因素。

对于Java,Maven和JUnit组合……

让我们首先使用Maven创建一个简单的Java应用程序来演示这种情况。

\ MavenCommands.bat

ECHO OFF REM =============================
REM Set the env. variables. 
REM =============================
SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.3\bin;
SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0REM =============================
REM Create a simple java application. 
REM =============================
call mvn archetype:create ^-DarchetypeGroupId=org.apache.maven.archetypes ^-DgroupId=org.academy ^-DartifactId=app001
pause

如果运行此批处理文件,则将从为您准备好的标准Java应用程序开始。

默认的Java应用程序不附带最新的JUnit。 您可能想要更改Maven配置以添加最新的JUnit。

\ pom.xml

[...]4.10[...]junitjunit${junit.version}test

现在,继续并添加一个JUnit测试类。

/app001/src/test/java/org/academy/AppTest.java

public class AppTest {private final static Logger logger = LoggerFactory.getLogger(AppTest.class);@Test
public void smallAndFastUnitTest() {logger.debug("Quick unit test. It is not expected to interact with DB etc.");assertTrue(true);
}@Test
@Category(IntegrationTest.class)
public void longAndSlowIntegrationTest() {logger.debug("Time consuming integration test. It is expected to interact with DB etc.");assertTrue(true);
}
}

您可能会注意到有一个IntegrationTest.class标记。 您还必须创建此类。

/app001/src/test/java/org/academy/annotation/type/IntegrationTest.java

public interface IntegrationTest {// Just a marker interface. 
}

创建标记接口并注释您的测试方法(或类,如果您愿意的话)是您在代码中要做的全部工作。

现在,剩下要做的就是告诉Maven仅在集成测试阶段运行“集成测试”。 这意味着开发人员在大多数情况下可以选择仅运行单元测试(与数据库,队列等隔离​​的快速测试)。 持续集成服务器(即Hudson(或类似产品))将运行单元测试和集成测试(由于预期它们将与数据库等交互,因此运行速度较慢),并且可能在一夜之间发生。

因此,这是您的操作方式。

/pom.xml

org.apache.maven.pluginsmaven-surefire-plugin2.12org.apache.maven.surefiresurefire-junit472.12-XX:-UseSplitVerifierorg.academy.annotation.type.IntegrationTest

这意味着开发人员只需使用一根衬管就可以运行所有单元测试。

mvn clean test

这将不会运行任何注释为集成测试的测试。

对于集成测试,请添加以下内容。

/pom.xml

maven-failsafe-plugin2.12org.apache.maven.surefiresurefire-junit472.12org.academy.annotation.type.IntegrationTestintegration-test**/*.class

这意味着哈德森或开发人员(如果他选择的话)可以通过一个命令来运行所有测试,单元和集成。

mvn clean verify

当然,如果您选择全部进行编译,运行单元测试,打包,运行集成测试和部署,那么也可以使用单行命令来完成。

mvn clean deploy

而已。 您已朝着更快的构建和更敏捷的工作方式迈出了一步。 快乐的编码。

进一步阅读

  • 也可以通过Javalobby的此链接获得本文的一个版本-稍作编辑。
  • 这是另一篇文章 ,涉及使用相同技术的类似主题。

参考:对 测试进行分类以减少构建时间。 从我们的JCG合作伙伴 Partho在Tech for Enterprise博客上获得。


翻译自: https://www.javacodegeeks.com/2012/07/categorize-tests-to-reduce-build-time.html

构建忽略测试

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

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

相关文章

[Ctsc2014]企鹅QQ

3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MB[Submit][Status][Discuss]Description PenguinQQ是中国最大、最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志、群、即时通讯…

ajax后台怎么取mapp,后台管理实现

京淘后台管理实现1.1 商品列表展现1.1.1 商品POJO对象1.1.2 表格数据页面结构1.1.3 请求URL地址说明:如果采用UI框架并且添加了分页插件,则会自动的形成如下的URL请求地址1.1.4 编辑ItemController1.1.5 编辑ItemService1.1.6 编辑ItemMapper手动编辑分页…

让工厂美丽

每个名副其实的Java程序员都知道Factory Pattern 。 这是一种便捷,标准化的方法,它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合。 但是,在使用大型系统时,该模式确实会向系统添加大量样板代码。 对于每个实体&#xff…

UVa10779 - Collectors Problem(最大流)

题目链接 简介:交换贴纸 分析: 这也算是一个天坑了 很久之前就看过这道题,但是一直没有填 美妙的建图: 我们用n-1个点表示每个除Bob之外的人 用m个点表示贴纸,从源点向这m个点连边,边的容量是Bob拥有该…

华为免费虚拟服务器,免费试用虚拟服务器

免费试用虚拟服务器 内容精选换一换本节操作介绍切换虚拟私有云的操作步骤。仅支持单网卡切换虚拟私有云。切换虚拟私有云会导致云服务器网络中断。切换虚拟私有云过程中,请勿操作云服务器的弹性公网IP,或对云服务器做其他操作。切换虚拟私有云后&#x…

esb 和mq_使用保险丝结构管理MQ和ESB的大型部署,第一部分

esb 和mqFuseSource最近发布了ActiveMQ和ServiceMix发行版的企业版。 其中的一些主要功能包括增量修补 , 自定义平台安装程序和第三方验证 。 新企业版附带的最酷的功能之一是Fuse Fabric和一些新工具 ,使您可以利用Fabric管理环境。 Fabric允许您通过一…

centOS 阿里云yum地址配置

引用:http://mirrors.aliyun.com/help/centos?spm5176.bbsr150321.0.0.d6ykiD 1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/Cen…

简单的事件驱动设计

总览 开发人员经常询问系统或其代码的性能或效率。 这到底是什么意思? 我的代码是如此高效,只有编码神能理解它的工作原理。 我的代码确实很聪明,但是却难以维护。 下一位开发人员将继续重写它。 我的代码对机器确实很有效,但对…

51Nod 1105 第K大的数 二分答案

很典型的二分答案的题目 码着 #include<iostream> #include<algorithm> #include<string> #include<string.h> typedef long long ll; using namespace std; const int MAX 5e4 5; ll n, k, a[MAX], b[MAX]; bool C(ll mid) {ll j n, cnt 0;for …

带有JWT示例的​​Spring Oauth2

有时以前&#xff0c;我们发表了一篇文章&#xff0c;分享了一种在云环境中实现无状态会话的自定义方法。 今天&#xff0c;让我们探讨为Spring Boot应用程序设置Oauth2身份验证的另一个流行用例。 在此示例中&#xff0c;我们将使用JSON Web令牌&#xff08;JWT&#xff09;作…

Spring源码解析-实例化bean对象

spring加载配置文件&#xff0c;AbstractApplicationContext类中的refresh方法起着重要的作用。 Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.准备刷新…

java docx文档解析_带有docx4j的Java Word(.docx)文档

java docx文档解析几个月前&#xff0c;我需要创建一个包含许多表和段落的动态Word文档。 过去&#xff0c;我曾使用POI来实现此目的&#xff0c;但是我发现它很难使用&#xff0c;并且在创建更复杂的文档时对我来说效果不佳。 因此&#xff0c;对于这个项目&#xff0c;经过一…

Win8.1部署 .NET Framework 3.5 安装方式

Windows 8.1中包含.NET Framework&#xff0c;操作系统安装过程中默认安装 .NET Framework 4.5.1。如果程序需要.NET Framework 3.5支持&#xff0c;将自动启用相关功能。 注意&#xff1a; 1. .NET Framework 3.5同时支持基于 .NET Framework 2.0/3.0/3.5构建应用程序。 2. 在…

@Autowired所有的东西!

最近&#xff0c;我写了Autowired注释 &#xff0c;它使我们可以编写更少的代码&#xff0c;从而使我们的生活更轻松 。 但是&#xff0c;使用它通常会使您的设计更加复杂。 尤其是当我们谈论在类的属性上使用它时。 它更容易违反 单一责任原则 。 这样可以更容易地注意到这一…

Python基础-闭包

闭包&#xff1a;闭包内部函数定义函数时的环境 def outer():x 10def inner(): # 条件一 inner就是内部函数print(x) # 条件二 外部环境的一个变量return inner # 结论 内部函数inner就是一个闭包 outer()() 转载于:https://www.cnblogs.com/fansik/p/7676231.html

jit即时编译_热点中的即时编译器(JIT)

jit即时编译即时编译器&#xff08;JIT&#xff09;的概念以及更广泛的自适应优化是除Java&#xff08;.Net&#xff0c;Lua&#xff0c;JRuby&#xff09;之外的许多语言中众所周知的概念。 为了解释什么是JIT编译器&#xff0c;我想先定义一个编译器概念。 根据维基百科&…

每天十分钟系列:JS数据操作之神奇的map()

Array.prototype.map() map()方法可以创建一个新数组&#xff0c;其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。 demo1 上面的例子&#xff0c;在控制台中打印的结果是&#xff1a; 1 2 3 4 5 demo2 javascript学习交流群&#xff1a;453833554 上面的例子…

JSON格式数据与数据组件

1.将JSON格式数据转化为wex5data数据组件中的数据&#xff0c;且数据列数不必一 一对应&#xff0c;但转化的列数据的列名与数据表字段相同。 Model.prototype.goodsDataCustomRefresh function(event){var url require.toUrl("./json/goodsData.json");$.ajaxSett…

作业十三

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>GZCC</title> </head> <body> <h1>MIS问答平台</h1> <h2 id"2015">2015</h2> <div id&quo…

openshift_通过OpenShift超越云炒作

openshift您是否厌倦了为应用程序请求新的开发机器&#xff1f; 您是否为必须为应用程序设置新的测试环境感到烦恼&#xff1f; 您是否只想专注于和平开发应用程序而不会一直“沉迷于堆栈”&#xff1f; 我们听到你的声音。 我们也去过那里。 不用担心&#xff0c;OpenShift就在…