五分鐘教程:如何在Docker當中運行平行測試
如果想在Docker中運行平行測試,你可能會引起容器名衝突的錯誤,下面我們來談談如何避免這種錯誤。當你在CI環境下運行測試時,有時候要運行平行測試。這種平行程序需要使用編譯工具,如詹金斯、Gradle或者Maven插件。
如果你在使用Docker作為應用程序的外部測試工具(例如資料庫、郵件伺服器、FTP伺服器),你會發現一個大問題,就是在運行平行測試時,在Docker主機里,所有文件會新建一個相同命名的容器,以至於在你開始第二個平行測試時,你會得到一個關於衝突的容器名失敗,因為Docker主機試圖啟動兩個相同命名的容器,或者這兩個容器具有相同的綁定埠。
針對這個問題,你可以這樣解決:
你可以用一個Docker主機分別給每個文件做平行測試。
你可以重複使用相同的Docker主機並且使用Arquillian Cube Star運算器。
Arquillian Cube是Arquillian的一個擴展,可以用來在你的測試中管理Docker容器。使用Arquillian Cube,你需要在計算機上運行一個Docker保護(可以是本地的或者不是),但大多數是本地的。
Arquillian Cube提供了三種不同的方法來定義容器:
定義一個容器組成文件
定義一個容器對象
使用容器對象DSL
在下面的事例中,我將向您展示如何使用Docker組成和容器對象DSL。Star運算器可以讓你指示Arquillian Cube隨機命名Cube,並且可以調整鏈接。這樣一來,在執行平行測試時,就不會因為名稱或者綁定埠發生衝突了。
我們來看一個例子:
plugins {
id"io.spring.dependency-management"version"1.0.2.RELEASE"
}
apply plugin: java
repositories {
mavenCentral()
jcenter()
}
dependencyManagement {
imports {
mavenBom org.jboss.arquillian:arquillian-bom:1.1.13.Final
}
}
dependencies {
testCompile junit:junit:4.12
testCompile org.jboss.arquillian.junit:arquillian-junit-standalone
testCompile org.arquillian.cube:arquillian-cube-docker:1.3.2
}
test {
maxParallelForks = 2
testLogging.showStandardStreams =true
}
#src/test/docker/docker-compose.yml
redis*:
image: redis:3.0.7
ports:
- "6379"
你可以看到Docker-組成yml文件從一個典型的Docker-組成文件發生的重要轉變,它的名字是以星號(*)或者redis*結束的,這個名字應該是動態生成的。這裡有三個測試,我們給大家演示第一個,其他兩個也大同小異。
基本上,列印控制台綁定埠連接到伺服器。最終建立一個gradle文件,執行兩個平行試驗,所以如果你在gradle運行測試,你會發現兩個測試是同時執行的,當一個完成的時候,另一個也執行完畢了。然後,當你檢查輸出時,你會看到下一個輸出。
org.superbiz.parallel.runner.TestOne STANDARD_OUT
CubeDockerConfiguration:
serverUri = tcp://192.168.99.100:2376
machineName = dev
certPath = /Users/alex/.docker/machine/machines/dev
tlsVerify =true
dockerServerIp = 192.168.99.100
definitionFormat = COMPOSE
clean =false
removeVolumes =true
dockerContainers = containers:
redis_9efae4a8-fcb5-4f9e-9b1d-ab591a5c4d5a:
alwaysPull:false
image: redis:3.0.7
killContainer:false
manual:false
portBindings: !!set
readonlyRootfs:false
removeVolumes:true
networks: {}
org.superbiz.parallel.runner.TestThree STANDARD_OUT
CubeDockerConfiguration:
serverUri = tcp://192.168.99.100:2376
machineName = dev
certPath = /Users/alex/.docker/machine/machines/dev
tlsVerify =true
dockerServerIp = 192.168.99.100
definitionFormat = COMPOSE
clean =false
removeVolumes =true
dockerContainers = containers:
redis_88ff4b81-80cc-43b3-8bbe-8638dd731d8e:
alwaysPull:false
image: redis:3.0.7
killContainer:false
manual:false
portBindings: !!set
readonlyRootfs:false
removeVolumes:true
networks: {}
//......
org.superbiz.parallel.runner.TestThree > should_print_port_binding STANDARD_OUT
org.superbiz.parallel.runner.TestOne - 56261
org.superbiz.parallel.runner.TestOne > should_print_port_binding STANDARD_OUT
org.superbiz.parallel.runner.TestOne - 56697
org.superbiz.parallel.runner.TestTwo > should_print_port_binding STANDARD_OUT
org.superbiz.parallel.runner.TestOne - 56697
正如你在日誌中看到的,容器的名字不是Redis或redis*,但是redis後面跟一個UUID。此外你還可以看到,當輸出列印時,綁定埠在每個情況下都是不同的。
如果你不想用docker組成的方式,你也可以用DSL容器對象的方法以編程方式定義容器,也可以支持Star運算器。我們來看看這種情況下的事例:
@ClassRule
public static ContainerDslRuleredisStar=
newContainerDslRule("redis:3.2.6", "redis*")
.withPortBinding(6379);
這個使用容器對象的方法是相同的,你需要Arquillian Cube1.4.0來運行它以及容器對象。基於這一特點,你可以運行任何程度的平行測試,因為Arquillian Cube可以照顧到命名和埠綁定問題。請注意,在容器之間鏈接的情況下,你依然需要運行Star運算器,它將在運行時解決某些問題。了解更多Star運算器請點擊這裡。
原文作者:Alex Soto
原文標題:Running Parallel Tests in Docker


※你相信嗎?這些互聯網大佬們以前都是程序員
※態牛-Tech Neo 5月刊:深度學習
TAG:51CTO |
※有潛在數據泄露行為 Facebook暫停CubeYou答題測試行為
※Facebook 測試Downvote負評功能,將進行小範圍內測
※HomePods正在運行iOS的「測試版」版本
※Facebook承認在內容評論中測試「踩」按鈕
※如何用 Python 測試 Android 應用
※從論文到測試:Facebook Detectron開源項目初探
※CADEX推出CAD Exchanger Cloud軟體服務的測試版
※使用 BenchmarkDotnet 測試代碼性能
※Discovery超強大腦元宵測試題
※【Inside Xbox】Xbox One春季更新全新功能公布 支持Freesync技術新Avatar系統測試中
※Google正在測試新Gmail中測試自毀郵件
※Xperia XZ2 Pro出現在HTML基準測試中 運行安卓8.1 Oreo
※「Inside Xbox」Xbox One春季更新全新功能公布 支持Freesync技術新Avatar系統測試中
※微軟正在iOS和Android上的Outlook中測試Cortana
※教你在Python中用Scikit生成測試數據集
※外媒稱Surface Phone已經開始測試,或在今年推出
※Web Service和Web API滲透測試指南(一)
※Xbox One春季更新全新功能公布 支持Freesync技術新Avatar系統測試中
※Fraunhofer ILT開發用於LMD 3D列印的在線噴粉測試系統
※曝Facebook正在測試基於標記打造的AR特效軟體