分类测试以减少构建时间

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

单元测试

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

整合测试

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

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

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

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

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

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

没有一个适合所有人的尺码(从来没有)。 缩短构建和发布时间的确切可执行步骤将是许多变量的因素,其中包括产品的技术堆栈(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

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

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/372010.shtml

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

相关文章

android横向展示状态,【报Bug】Android横屏状态下启动App,即使在App.vue中锁定竖屏,但是首页nvue中的rpx单位是按照启动的横竖屏状态显示的!...

详细问题描述(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)[内容]重现步骤[步骤][结果][期望]nvue首页rpx单位能够根据App.vue锁定的屏幕方向…

property修饰关键字

修饰符按作用区分:线程安全相关,内存相关,读写权限相关,set和get,是否可为空, class 一.默认值 property NSArray *dataArray; 默认的是:atomic,strong(有的文章写的居然是assign,我认为还是str…

高精度相关模板.

1 2 /*3 高精度加法.4 */5 #include<cstring>6 #include<cstdio>7 #include<iostream>8 #define MAXN 100019 using namespace std;10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;11 char m[MAXN],n[MAXN];12 void slove()13 {14 l3max(l1,l2);15 for(in…

5分钟内Google App Engine上的Vaadin App

在本教程中&#xff0c;您将学习如何创建第一个Vaadin Web应用程序&#xff0c;如何在本地AppEngine开发服务器上运行它以及如何将其部署到Google App Engine基础结构。 所有这些大约需要5到10分钟。 是的&#xff0c;如果您安装了必要的先决条件&#xff0c;则可以立即开始运行…

linux系统调用的封装格式,ARM Linux系统调用的原理

ARM Linux系统调用的原理ARM Linux系统调用的原理操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口。在应用程序和硬件之间设置一个额外层具有很多优点。首先&#xff0c;这使得编程更加容易&#xff0c;把用户从学习硬件设备的低级编程特性中解放出来。其次&…

(延迟两秒,跳转相应页面)(返回到上一个页面并刷新)

1.setTimeout("window.location.href /moment/reason",2000);2.返回到上一个页面并刷新 self.location document.referrer;2.1常见的几种刷新方式 a.history.go(-1) 返回上一页 b.location.reload() 刷新当前页面 c.history.back() 返回上一页2.2当…

检索字符创 php

strstr()可以返回匹配的值 echo strstr("localhost", "os");返回ost echo substr_count("gggggs", "g"); 返回检索匹配字符创次数 substr_replace 字串替换函数转载于:https://www.cnblogs.com/lidepeng/p/6078064.html

android8强制将app移到sd卡,小内存手机 APP强制转移至SD卡教程

虽然近两年手机的机身内存越做越大&#xff0c;但是身边总还是有些朋友在使用几年前的手机。而面对如今海量的丰富应用&#xff0c;早年的手机中内置的存储空间已经开始捉襟见肘。虽说对于这类机型系统通常都提供了将APP转移至外置内存卡的功能&#xff0c;可是依然有一些顽固的…

在没有XML的情况下测试Spring和Hibernate

我非常热衷于Spring 3中的改进&#xff0c;这些改进最终使您能够在IDE和编译器的适当支持下从XML迁移到纯Java配置。 它并没有改变Spring是一个庞大的套件这一事实&#xff0c;并且有时发现您需要的东西可能需要一段时间。 围绕Hibernate的无XML单元测试就是这样一回事。 我知道…

Observer观察者设计模式

Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer,它观察着Subject,当Subject中的某件事发生后,会告知Observer,Obersver会采取相应的行动。上面例子中显示器和…

最小生成树 prime zoj1586

题意&#xff1a;在n个星球&#xff0c;每2个星球之间的联通需要依靠一个网络适配器&#xff0c;每个星球喜欢的网络适配器的价钱不同&#xff0c;先给你一个n&#xff0c;然后n个数&#xff0c;代表第i个星球喜爱的网络适配器的价钱&#xff0c;然后给出一个矩阵M[i][j]代表第…

android 书架菜单,Android入门3--做一个书架

修改名称创建项目的时候&#xff0c;APP的名字取为英文或者拼音&#xff0c;是为了简便&#xff0c;但是显示在界面上&#xff0c;我们当然希望它是中文的。taoguanstring>我们要做的很简单&#xff0c;就是在string.xml中&#xff0c;将app_name的内容修改为我们希望的名字…

第一节:整体介绍

Python版本3.5.2&#xff0c;Django版本1.10 创建一个Django工程&#xff0c;并且生成一个名字为mainsite的app django-admin.py startproject myblog python3 manage.py startapp mainsite 文件结构如下&#xff1a; x-powerxpower-CW65S:~/chen/myblog$ tree ./ ./ ├── ma…

Spring @Configuration和FactoryBean

考虑使用FactoryBean通过Spring配置文件定义缓存&#xff1a; <cache:annotation-driven /><context:component-scan base-packageorg.bk.samples.cachexml></context:component-scan><bean idcacheManager classorg.springframework.cache.support.Simpl…

cookie解决 未登录加入购物车 第一次访问弹出新手引导页面

浏览器携带cookie到服务器, 点击加入购物车-->后台检查-->是否登录(有没有sessionid) 没有登录--->secookie()返回给浏览器,把传递过来的商品id, 属性(多个属性逗号拼接),数量存起来,(序列号成字符串_不同属性用下划线拼接) 转载于:https://www.cnblogs.com/bj-tony/p…

REST + Spring Security会话问题

REST &#xff0c; 会话 ..等待。 REST应用程序中没有会话&#xff0c;对吗&#xff1f; 好吧&#xff0c;那是真的。 如果我们可以避免会议&#xff0c;我们应该这样做。 REST是无状态的 。 有关无状态性的主要问题是身份验证。 在通常的Web应用程序中&#xff0c;我们习惯于在…

程序猿果真有前端后端client吗

前端 后端 client DBA OP 程序猿有分这么细的吗?入行时候有区别. 殊途同归 吾道一以贯之, 假设作为程序猿不能领悟一贯, 则永远不清楚.转载于:https://www.cnblogs.com/blfbuaa/p/6970139.html

HarmonyOS硬件创新合作伙伴,【HarmonyOS】HarmonyOS智能硬件开发学习指南 - HDC2020

2020年9月10日&#xff0c;华为HarmonyOS 2.0版本正式官宣&#xff01;这一次&#xff0c;借助 HarmonyOS 全场景分布式系统和设备生态&#xff0c;将定义全新的硬件、交互和服务体验&#xff0c;打开焕然一新的全场景世界&#xff0c;不愧是HarmonyOS&#xff01; 那HarmonyOS…

处于RUNNABLE状态的Java线程未真正运行

最近&#xff0c;我在Java应用程序服务器安装上进行了分析/调整&#xff0c;以识别瓶颈并修复它们。 在此过程中&#xff08;调整&#xff09;&#xff0c;最常见的操作是在系统加载时检索许多线程转储。 请记住&#xff0c;重载&#xff08;在某些情况下&#xff09;可能会产生…

2.3 关系完整性

关系模型的完整性规则是对关系的某种约束条件。 也就是说关系的值随着时间变化时应该满足一些约束条件。 &#xff08;这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束&#xff09; 关系模型中有三类完整性约束&#xff1a; 实体完整性 &#xff…