分類測試以減少構建時間

在繼續本文的主要內容之前,讓我們先進行一些定義。

單元測試

單元測試是小型的(測試一種用例或單元),在內存中運行(不與數據庫,消息隊列等交互),可重復且快速的測試。 對于我們的對話,讓我們將其限制為開發人員編寫的基于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.pswp.cn/news/372010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372010.shtml
英文地址,請注明出處:http://en.pswp.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…