使用Arquillian,Docker和Selenium使Web UI测试再次变得出色(第1部分)
問題簡(jiǎn)介
大多數(shù)時(shí)候,當(dāng)您需要為Web UI編寫功能測(cè)試/端到端測(cè)試時(shí),您最終會(huì)使用Selenium ,它可以被視為Java世界中用于Web UI測(cè)試的事實(shí)上的工具。 我確定您已經(jīng)將其用于此類測(cè)試。
但是可能同時(shí),您遇到了功能測(cè)試中一些最常見的問題,有些與Web UI測(cè)試有關(guān),而其他則沒有。
例如,人們通常在功能測(cè)試中發(fā)現(xiàn)的主要問題之一是環(huán)境的準(zhǔn)備,運(yùn)行測(cè)試以啟動(dòng)服務(wù)器并部署應(yīng)用程序,然后安裝/啟動(dòng)數(shù)據(jù)庫,還可能是緩存系統(tǒng)等等。在所有服務(wù)器上運(yùn)行,使用戶可以在本地安裝每個(gè)服務(wù)。 可能會(huì)發(fā)生一些錯(cuò)誤,例如安裝生產(chǎn)版本中使用的服務(wù)器的錯(cuò)誤版本,重新使用可能與該版本不同的另一本地?cái)?shù)據(jù)庫安裝,或者例如在生產(chǎn)版本中使用的不同JDK版本中運(yùn)行它們。
但是,還有一些其他更特定于Web UI測(cè)試的問題,例如瀏覽器安裝或WebDriver屬性的配置。
解決第一個(gè)問題
為了解決第一個(gè)問題,您可以想到的最簡(jiǎn)單的解決方案是使用Docker容器,并且當(dāng)然可以使用Docker組合,因?yàn)槟梢远x和運(yùn)行多容器Docker應(yīng)用程序。 因此,基本上,您在docker-compose文件中定義了運(yùn)行測(cè)試可能需要的所有服務(wù)器,因此在運(yùn)行測(cè)試時(shí),所有服務(wù)器都在運(yùn)行,并且使用固定版本更為重要,因此可以確保測(cè)試始終在已知/期望的特定版本的服務(wù)器上運(yùn)行,相同的JDK,……,而不取決于開發(fā)人員/ CI機(jī)器中安裝了什么。
但是這種方法有一個(gè)問題。 您需要專門運(yùn)行docker-compose up , docker-compose down。 當(dāng)然,您可以在構(gòu)建腳本中自動(dòng)執(zhí)行此操作,這將解決CI環(huán)境中的問題,但是如果開發(fā)人員希望通過IDE執(zhí)行測(cè)試,例如調(diào)試,那么他需要意識(shí)到這一點(diǎn)。
這就是Arquillian Cube解決的問題。 Arquillian Cube是Arquillian擴(kuò)展,它使用docker -compose文件啟動(dòng)和配置在那里定義的所有容器,執(zhí)行測(cè)試并最終關(guān)閉所有這些容器。 好消息是,由于Arquillian使用JUnit(以及TestNG和Spock),您可以從IDE運(yùn)行測(cè)試,而不必?fù)?dān)心啟動(dòng)和停止容器,因?yàn)镈ocker生命周期由Arquillian Cube管理。
因此,定義測(cè)試環(huán)境的問題的第一部分已由Arquillian Cube修復(fù)。 讓我們看看如何解決第二個(gè)問題。
解決第二個(gè)問題
Selenium項(xiàng)目為Docker映像提供了Selenium獨(dú)立或帶有瀏覽器(Firefox或Chrome)的Selenium節(jié)點(diǎn)以及已安裝的VNC服務(wù)器。
因此,似乎很適合解決必須在本地安裝具有具體版本或具體配置的瀏覽器的問題,因?yàn)槟梢詫ocker映像與為測(cè)試配置的瀏覽器一起使用。
使用Docker進(jìn)行測(cè)試時(shí)的新問題
那很酷,但是有一些問題。 第一個(gè)是您需要?jiǎng)?chuàng)建一個(gè)專門用于測(cè)試目的的docker-compose文件,盡管這本身并不是一件壞事,但是它需要開發(fā)人員進(jìn)行更多的管理才能維護(hù)該文件,并且當(dāng)然要一遍又一遍地重復(fù)在要使用它的所有項(xiàng)目中,定義要使用的瀏覽器和VNC客戶端映像以獲取記錄以供將來檢查。
第二個(gè)問題是WebDriver的配置。 針對(duì)遠(yuǎn)程瀏覽器運(yùn)行WebDriver時(shí),您需要設(shè)置瀏覽器的位置(IP)并根據(jù)需要的功能配置RemoteWebDriver。
因此,您必須一次又一次地在所有測(cè)試中編寫WebDriver配置。 您可以創(chuàng)建一個(gè)工廠類,該類可以在所有項(xiàng)目中重用,這很好,但是仍然存在一個(gè)問題,一些開發(fā)人員可能會(huì)使用Docker計(jì)算機(jī),因此IP不會(huì)是靜態(tài)的并且可能每次都會(huì)更改,其他人可能正在使用本機(jī)Docker(例如,CI管道的某些階段)可能會(huì)針對(duì)遠(yuǎn)程完整環(huán)境(如生產(chǎn)前環(huán)境)運(yùn)行測(cè)試,因此在執(zhí)行測(cè)試之前,您需要手動(dòng)指定Docker主機(jī)容器的IP。
第三個(gè)問題是您需要指示W(wǎng)ebDriver打開頁面: webdriver.get(“ http://www.google.com”);
問題在于,在這種情況下,瀏覽器位于Docker基礎(chǔ)架構(gòu)內(nèi)部,因此您需要設(shè)置服務(wù)器容器的內(nèi)部IP,因此,您不僅需要知道用于連接遠(yuǎn)程Web驅(qū)動(dòng)程序的Docker主機(jī)IP,還需要了解內(nèi)部IP地址。使用以下命令在遠(yuǎn)程瀏覽器中打開頁面的服務(wù)器容器的IP
獲取方法。 同樣,這可能很難以自動(dòng)方式獲得。
但是,使用Arquillian Drone和Arquillian Cube之間的新集成解決了所有這些問題。
解決新問題
Arquillian Drone是Arquillian擴(kuò)展,它將Selenium WebDriver集成到Arquillian。 此擴(kuò)展程序管理WebDriver的配置,因此您不需要在所有測(cè)試中都重復(fù)它,也不需要在瀏覽器的生命周期中重復(fù)它。
因此,如您所見,這對(duì)擴(kuò)展似乎很適合解決這些問題。 無人機(jī)負(fù)責(zé)配置,而Cube負(fù)責(zé)正確配置Selenium / VNC容器并啟動(dòng)和停止它們。
如您所見,您無需擔(dān)心創(chuàng)建用于測(cè)試目的的docker-compose文件。 您只需要?jiǎng)?chuàng)建一個(gè)用于部署的數(shù)據(jù)庫,其余的將由Arquillian負(fù)責(zé)。
例
首先要做的是創(chuàng)建一個(gè)具有必需依賴項(xiàng)的項(xiàng)目。 對(duì)于此示例,我們使用Maven,但您可以使用其他構(gòu)建工具來實(shí)現(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> 需要注意的重要一點(diǎn)是,您正在使用BOM表定義來設(shè)置組件的版本。 然后我們?cè)O(shè)置Arquillian Standalone依賴項(xiàng),因?yàn)槲覀兊臏y(cè)試不會(huì)
@Deployment方法,因?yàn)橐呀?jīng)在應(yīng)用程序中使用的Docker映像內(nèi)創(chuàng)建了部署文件。 最后,添加Arquillian Cube和Arquillian Drone依賴項(xiàng)。
下一步是在src / test / resources創(chuàng)建一個(gè)名為arquillian.xml的文件,該文件用于配置擴(kuò)展。
<?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機(jī)器,則需要指定docker機(jī)器名稱來啟動(dòng)容器。 如果使用本地Docker,則無需設(shè)置此屬性。
- 您需要設(shè)置相對(duì)于docker-compose文件所在項(xiàng)目的根文件夾的位置。 請(qǐng)注意,您可以使用任何其他名稱。
您可以自定義WebDriver以及配置Arquillian Drone( https://docs.jboss.org/author/display/ARQ/Drone ),但是對(duì)于此測(cè)試,默認(rèn)值就足夠了。 請(qǐng)注意,現(xiàn)在默認(rèn)瀏覽器是firefox 。
重要信息 :如果您正在使用本機(jī)Linux Docker安裝,請(qǐng)注釋machineName的配置行。 如果您使用的是docker機(jī)器,并且與dev叫不同,那么請(qǐng)適應(yīng)
arquillian.xml中的 machineName也是如此。
下一步是在根目錄下創(chuàng)建docker-compose文件。
helloworld:image: lordofthejars/helloworldgoports:- "8080:80" 簡(jiǎn)單的撰寫文件,僅定義一個(gè)容器。 該容器公開了80端口,但隨后綁定到8080端口。此容器啟動(dòng)Go程序,偵聽根上下文并返回
HTML格式的Hello World 。
最后是測(cè)試:
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");}}此測(cè)試中有一些有趣的部分。
- 從使用Arquillian跑步程序的意義上來說,這是標(biāo)準(zhǔn)的Arquillian測(cè)試。
- 使用Arquillian Drone提供的@Drone注入機(jī)制,通過配置為連接到遠(yuǎn)程瀏覽器的WebDriver來豐富測(cè)試。
- 使用@CubeIp注釋使用容器helloworld的內(nèi)部IP豐富測(cè)試。 由于瀏覽器在Docker主機(jī)中運(yùn)行,因此我們可以使用內(nèi)部IP來實(shí)現(xiàn)此目的。 同樣重要的是,您需要使用裸露的端口而不是綁定端口。
- 其他所有內(nèi)容都由Arquillian Cube管理,例如Docker容器的啟動(dòng)和停止(在本例中為helloworld ),但也包含瀏覽器和VNC客戶端的容器。 如果將調(diào)試點(diǎn)放入測(cè)試方法中,然后在終端上執(zhí)行docker ps ,您將看到啟動(dòng)了三個(gè)容器,而不僅僅是helloworld 。
- 如果在運(yùn)行測(cè)試后檢查了target / reports / videos目錄,則會(huì)找到該測(cè)試的錄像。
您還可以觀看此操作的截屏視頻:
因此,如您所見,結(jié)合使用Arquillian Cube和Arquillian Drone可以使您的測(cè)試和docker -compose文件看起來非常整潔。 測(cè)試僅包含與測(cè)試相關(guān)的內(nèi)容,而與WebDriver配置無關(guān)。 同樣,您的docker-compose看起來也很清晰,它僅包含與業(yè)務(wù)相關(guān)的內(nèi)容,與測(cè)試無關(guān)。
在本文中,您已經(jīng)了解了如何使用Arquillian Cube + Arquillian Drone。 在下一個(gè)中,您將看到與Arquillian Graphene的集成,它將把測(cè)試簡(jiǎn)化為僅專注于測(cè)試而不是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部分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沧田打印机不打印是什么原因(沧田打印机无
- 下一篇: 土城战役_避免使用FOR –反假战役