使用Arquillian,Docker和Selenium使Web UI测试再次变得出色(第1部分)
問題簡介
大多數(shù)時候,當(dāng)您需要為Web UI編寫功能測試/端到端測試時,您最終會使用Selenium ,它可以被視為Java世界中用于Web UI測試的事實上的工具。 我確定您已經(jīng)將其用于此類測試。
但是可能同時,您遇到了功能測試中一些最常見的問題,有些與Web UI測試有關(guān),而其他則沒有。
例如,人們通常在功能測試中發(fā)現(xiàn)的主要問題之一是環(huán)境的準(zhǔn)備,運行測試以啟動服務(wù)器并部署應(yīng)用程序,然后安裝/啟動數(shù)據(jù)庫,還可能是緩存系統(tǒng)等等。在所有服務(wù)器上運行,使用戶可以在本地安裝每個服務(wù)。 可能會發(fā)生一些錯誤,例如安裝生產(chǎn)版本中使用的服務(wù)器的錯誤版本,重新使用可能與該版本不同的另一本地數(shù)據(jù)庫安裝,或者例如在生產(chǎn)版本中使用的不同JDK版本中運行它們。
但是,還有一些其他更特定于Web UI測試的問題,例如瀏覽器安裝或WebDriver屬性的配置。
解決第一個問題
為了解決第一個問題,您可以想到的最簡單的解決方案是使用Docker容器,并且當(dāng)然可以使用Docker組合,因為您可以定義和運行多容器Docker應(yīng)用程序。 因此,基本上,您在docker-compose文件中定義了運行測試可能需要的所有服務(wù)器,因此在運行測試時,所有服務(wù)器都在運行,并且使用固定版本更為重要,因此可以確保測試始終在已知/期望的特定版本的服務(wù)器上運行,相同的JDK,……,而不取決于開發(fā)人員/ CI機器中安裝了什么。
但是這種方法有一個問題。 您需要專門運行docker-compose up , docker-compose down。 當(dāng)然,您可以在構(gòu)建腳本中自動執(zhí)行此操作,這將解決CI環(huán)境中的問題,但是如果開發(fā)人員希望通過IDE執(zhí)行測試,例如調(diào)試,那么他需要意識到這一點。
這就是Arquillian Cube解決的問題。 Arquillian Cube是Arquillian擴展,它使用docker -compose文件啟動和配置在那里定義的所有容器,執(zhí)行測試并最終關(guān)閉所有這些容器。 好消息是,由于Arquillian使用JUnit(以及TestNG和Spock),您可以從IDE運行測試,而不必擔(dān)心啟動和停止容器,因為Docker生命周期由Arquillian Cube管理。
因此,定義測試環(huán)境的問題的第一部分已由Arquillian Cube修復(fù)。 讓我們看看如何解決第二個問題。
解決第二個問題
Selenium項目為Docker映像提供了Selenium獨立或帶有瀏覽器(Firefox或Chrome)的Selenium節(jié)點以及已安裝的VNC服務(wù)器。
因此,似乎很適合解決必須在本地安裝具有具體版本或具體配置的瀏覽器的問題,因為您可以將docker映像與為測試配置的瀏覽器一起使用。
使用Docker進行測試時的新問題
那很酷,但是有一些問題。 第一個是您需要創(chuàng)建一個專門用于測試目的的docker-compose文件,盡管這本身并不是一件壞事,但是它需要開發(fā)人員進行更多的管理才能維護該文件,并且當(dāng)然要一遍又一遍地重復(fù)在要使用它的所有項目中,定義要使用的瀏覽器和VNC客戶端映像以獲取記錄以供將來檢查。
第二個問題是WebDriver的配置。 針對遠程瀏覽器運行WebDriver時,您需要設(shè)置瀏覽器的位置(IP)并根據(jù)需要的功能配置RemoteWebDriver。
因此,您必須一次又一次地在所有測試中編寫WebDriver配置。 您可以創(chuàng)建一個工廠類,該類可以在所有項目中重用,這很好,但是仍然存在一個問題,一些開發(fā)人員可能會使用Docker計算機,因此IP不會是靜態(tài)的并且可能每次都會更改,其他人可能正在使用本機Docker(例如,CI管道的某些階段)可能會針對遠程完整環(huán)境(如生產(chǎn)前環(huán)境)運行測試,因此在執(zhí)行測試之前,您需要手動指定Docker主機容器的IP。
第三個問題是您需要指示W(wǎng)ebDriver打開頁面: webdriver.get(“ http://www.google.com”);
問題在于,在這種情況下,瀏覽器位于Docker基礎(chǔ)架構(gòu)內(nèi)部,因此您需要設(shè)置服務(wù)器容器的內(nèi)部IP,因此,您不僅需要知道用于連接遠程Web驅(qū)動程序的Docker主機IP,還需要了解內(nèi)部IP地址。使用以下命令在遠程瀏覽器中打開頁面的服務(wù)器容器的IP
獲取方法。 同樣,這可能很難以自動方式獲得。
但是,使用Arquillian Drone和Arquillian Cube之間的新集成解決了所有這些問題。
解決新問題
Arquillian Drone是Arquillian擴展,它將Selenium WebDriver集成到Arquillian。 此擴展程序管理WebDriver的配置,因此您不需要在所有測試中都重復(fù)它,也不需要在瀏覽器的生命周期中重復(fù)它。
因此,如您所見,這對擴展似乎很適合解決這些問題。 無人機負責(zé)配置,而Cube負責(zé)正確配置Selenium / VNC容器并啟動和停止它們。
如您所見,您無需擔(dān)心創(chuàng)建用于測試目的的docker-compose文件。 您只需要創(chuàng)建一個用于部署的數(shù)據(jù)庫,其余的將由Arquillian負責(zé)。
例
首先要做的是創(chuàng)建一個具有必需依賴項的項目。 對于此示例,我們使用Maven,但您可以使用其他構(gòu)建工具來實現(xiàn)相同的目的。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.lordofthejars.helloworld</groupId><artifactId>dronecube</artifactId><version>1.0-SNAPSHOT</version><dependencyManagement><dependencies><!-- Use BOMs to set same versions in all dependencies --><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.1.11.Final</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.jboss.arquillian.extension</groupId><artifactId>arquillian-drone-bom</artifactId><version>2.0.0.Final</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.jboss.arquillian.selenium</groupId><artifactId>selenium-bom</artifactId><version>2.53.1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- Use standalone mode in Arquillian (no @Deployment) --><dependency><groupId>org.jboss.arquillian.junit</groupId><artifactId>arquillian-junit-standalone</artifactId><scope>test</scope></dependency><!-- Cube dependencies --><dependency><groupId>org.arquillian.cube</groupId><artifactId>arquillian-cube-docker</artifactId><version>1.0.0.Alpha13</version><scope>test</scope></dependency><dependency><groupId>org.arquillian.cube</groupId><artifactId>arquillian-cube-docker-drone</artifactId><version>1.0.0.Alpha13</version><scope>test</scope></dependency><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.5.2</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- Drone dependencies --><dependency><groupId>org.jboss.arquillian.extension</groupId><artifactId>arquillian-drone-webdriver-depchain</artifactId><type>pom</type><scope>test</scope></dependency></dependencies></project> 需要注意的重要一點是,您正在使用BOM表定義來設(shè)置組件的版本。 然后我們設(shè)置Arquillian Standalone依賴項,因為我們的測試不會
@Deployment方法,因為已經(jīng)在應(yīng)用程序中使用的Docker映像內(nèi)創(chuàng)建了部署文件。 最后,添加Arquillian Cube和Arquillian Drone依賴項。
下一步是在src / test / resources創(chuàng)建一個名為arquillian.xml的文件,該文件用于配置擴展。
<?xml version="1.0"?> <arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://jboss.org/schema/arquillian"xsi:schemaLocation="http://jboss.org/schema/arquillianhttp://jboss.org/schema/arquillian/arquillian_1_0.xsd"><extension qualifier="docker"><!-- Not required if native docker or only one docker machine installed --><property name="machineName">dev</property><!-- Not required if file is in root of classpath --><property name="dockerContainersFile">docker-compose.yml</property></extension></arquillian>您可以看到:
- 如果使用docker機器,則需要指定docker機器名稱來啟動容器。 如果使用本地Docker,則無需設(shè)置此屬性。
- 您需要設(shè)置相對于docker-compose文件所在項目的根文件夾的位置。 請注意,您可以使用任何其他名稱。
您可以自定義WebDriver以及配置Arquillian Drone( https://docs.jboss.org/author/display/ARQ/Drone ),但是對于此測試,默認值就足夠了。 請注意,現(xiàn)在默認瀏覽器是firefox 。
重要信息 :如果您正在使用本機Linux Docker安裝,請注釋machineName的配置行。 如果您使用的是docker機器,并且與dev叫不同,那么請適應(yīng)
arquillian.xml中的 machineName也是如此。
下一步是在根目錄下創(chuàng)建docker-compose文件。
helloworld:image: lordofthejars/helloworldgoports:- "8080:80" 簡單的撰寫文件,僅定義一個容器。 該容器公開了80端口,但隨后綁定到8080端口。此容器啟動Go程序,偵聽根上下文并返回
HTML格式的Hello World 。
最后是測試:
package org.lordofthejars.cubedrone;import org.arquillian.cube.CubeIp; import org.jboss.arquillian.drone.api.annotation.Drone; import org.jboss.arquillian.junit.Arquillian; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver;import java.net.MalformedURLException; import java.net.URL;import static org.assertj.core.api.Assertions.assertThat;@RunWith(Arquillian.class) public class HelloWorldTest {public static final int EXPOSED_PORT = 80;// Enrich with webdriver configured to connect to remote browser@DroneWebDriver webDriver;// Enrich with helloworld container ip@CubeIp(containerName = "helloworld")String ip;@Testpublic void shouldShowHelloWorld() throws MalformedURLException, InterruptedException {// Constructs url that browser should connectURL url = new URL("http", ip, EXPOSED_PORT, "/");// Typical test using WebDriverwebDriver.get(url.toString());final String message = webDriver.findElement(By.tagName("h1")).getText();assertThat(message).isEqualTo("Hello World");}}此測試中有一些有趣的部分。
- 從使用Arquillian跑步程序的意義上來說,這是標(biāo)準(zhǔn)的Arquillian測試。
- 使用Arquillian Drone提供的@Drone注入機制,通過配置為連接到遠程瀏覽器的WebDriver來豐富測試。
- 使用@CubeIp注釋使用容器helloworld的內(nèi)部IP豐富測試。 由于瀏覽器在Docker主機中運行,因此我們可以使用內(nèi)部IP來實現(xiàn)此目的。 同樣重要的是,您需要使用裸露的端口而不是綁定端口。
- 其他所有內(nèi)容都由Arquillian Cube管理,例如Docker容器的啟動和停止(在本例中為helloworld ),但也包含瀏覽器和VNC客戶端的容器。 如果將調(diào)試點放入測試方法中,然后在終端上執(zhí)行docker ps ,您將看到啟動了三個容器,而不僅僅是helloworld 。
- 如果在運行測試后檢查了target / reports / videos目錄,則會找到該測試的錄像。
您還可以觀看此操作的截屏視頻:
因此,如您所見,結(jié)合使用Arquillian Cube和Arquillian Drone可以使您的測試和docker -compose文件看起來非常整潔。 測試僅包含與測試相關(guān)的內(nèi)容,而與WebDriver配置無關(guān)。 同樣,您的docker-compose看起來也很清晰,它僅包含與業(yè)務(wù)相關(guān)的內(nèi)容,與測試無關(guān)。
在本文中,您已經(jīng)了解了如何使用Arquillian Cube + Arquillian Drone。 在下一個中,您將看到與Arquillian Graphene的集成,它將把測試簡化為僅專注于測試而不是WebDriver調(diào)用。
翻譯自: https://www.javacodegeeks.com/2016/08/making-web-ui-testing-great-arquillian-docker-selenium-part-1.html
總結(jié)
以上是生活随笔為你收集整理的使用Arquillian,Docker和Selenium使Web UI测试再次变得出色(第1部分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沧田打印机不打印是什么原因(沧田打印机无
- 下一篇: 设计模式 四人帮_四人帮–代理设计模式