容器对象模式。 一种新的测试模式。
如果您搜索什么是頁面對象的描述,就會發現頁面對象模式為我們提供了一種以可重用和可維護的方式對內容建模的常識方法。
還要指出:在Web應用程序的UI中,您的測試與某些區域交互。 Page Object只是將它們建模為測試代碼中的對象。
這減少了重復代碼的數量,并且意味著如果UI更改,則僅需要在一個地方應用此修復程序。
如您所見, Page Object適用于UI元素。 我們( Arquillian社區)在Page Object模式邏輯之后創造了一種新模式,稱為Container Object模式。
您可以將“ 容器對象”視為您的測試可能與之交互的容器區域(現在為Docker容器)。 例如,其中一些領域可能是:
- 獲取運行容器的主機IP。
- 給定暴露端口的有界端口。
- 在配置文件(Dockerfile)中配置的任何參數,例如用于訪問容器公開的服務的用戶或密碼。
- 容器的定義。
一個容器對象內部可能包含多個容器對象的集合。 這有效地在容器之間建立了關系船(鏈接)。
例如,在容器中運行MySQL數據庫的情況下,配置參數的示例可能是訪問數據庫的用戶和密碼。
請注意,沒有什么可以阻止您生成用于從測試訪問服務的正確URL,或阻止針對容器執行命令,例如檢索內部文件。
當然,就像Page Object一樣, Container Object為您提供了一種構建模型內容的方法,該模型內容可用于多個項目。
在研究如何在Arquillian Cube中實現此模式之前,我們先來看一個示例:
假設您所有的應用程序都需要將文件發送到FTP服務器。 要編寫集成/組件測試,您可能需要一個FTP服務器來發送文件并檢查文件是否已正確發送。
一種方法是在執行測試之前使用Docker啟動FTP服務器,然后使用該Docker容器用于FTP服務器執行測試,然后再停止容器以檢查文件是否存在,最后停止容器。
因此,所有涉及FTP服務器和容器的所有操作都可以在Container Object中加入。 該容器對象可能包含以下信息:
- 使用哪個圖像
- 運行此FTP服務器的主機的IP和綁定端口
- 訪問FTP服務器的用戶名和密碼
- 斷言文件存在的方法
然后從測試的角度來看,它僅與該對象通信,而不是直接對測試內部的所有信息進行硬編碼。
再次與Page Object中一樣 ,容器上的任何更改都只會影響Container對象,而不會影響測試本身。
現在,通過一個非常簡單的示例,看看Arquillian Cube如何實現Container Object模式:
Arquillian多維數據集和容器對象
讓我們看一個簡單的示例,說明如何在Cube中實現Container Object 。 假設您要創建一個容器對象,該對象封裝了在Docker內部運行的乒乓服務器。
容器對象將類似于帶有特殊注釋的簡單POJO:
@Cube(value = "pingpong", portBinding = "5000->8080/tcp") // <1> @CubeDockerFile public class PingPongContainer {@HostIp // <2>String dockerHost;@HostPort(8080) // <3>private int port;public URL getConnectionUrl() { // <4>try {return new URL(“http://” + dockerHost + “:” + port);} catch (MalformedURLException e) {throw new IllegalArgumentException(e);}} }在前面的示例中,您必須注意以下幾行:
@Cube批注用于配置此Container對象 。 最初,您將啟動的容器命名為pingpong,并設置容器實例的端口綁定信息,在本例中為5000→8080 / tcp 。
請注意,這可以是一個數組,用于設置多個端口綁定定義。
下一個注釋是@CubeDockerFile ,它配置如何創建容器。 在這種情況下,請使用位于默認類路徑位置的Dockerfile 。 默認位置是package + classname ,因此例如在以前的情況下, Dockerfile應該放置在org / superbiz / containerobject / PingPongContainer目錄中。
當然,您可以通過將注解作為值傳遞來設置任何其他類路徑位置。 CubeDockerFile批注設置找到Dockerfile的位置,而不是文件本身。
同樣,該位置應該可以從ClassLoader到達,因此這意味著應該從類路徑中加載它才能找到它。
任何多維數據集都可以使用任何客戶端擴展器進行擴展 ,在這種情況下,可以使用@HostIp 優化器進行擴展 ,但是也可以使用@ArquillianResource通過DockerClient進行擴展 。
最后, @ HostPort用于將公開的端口轉換為綁定的端口。
因此,在此示例中,端口值將為5000 。 您將簡要了解為什么此批注很重要。
然后,您可以在測試中開始使用此容器對象:
@RunWith(Arquillian.class) public class PingPongTest {@CubePingPongContainer pingPongContainer;@Testpublic void shouldReturnOkAsPong() throws IOException {String pong = ping();assertThat(pong, containsString("OK"));assertThat(pingPongContainer.getConnectionPort(), is(5000));} }這里最重要的是,您需要將Container Object設置為類的字段,并使用@Cube進行注釋。
用Cube注釋字段非常重要,因此Arquillian在運行測試之前,可以檢測到它需要啟動一個新的Cube (Docker容器),創建Container Object并將其注入測試中。
請注意,此批注與定義Container Object時使用的批注完全相同。
之所以這樣,是因為您可以從測試端覆蓋Container Object的任何屬性。 這就是@HostPort批注很重要的原因,因為可以從測試定義中更改端口,所以您需要找到一種在容器對象內部注入正確端口的方法。
在這篇文章中,我介紹了容器對象模式以及如何在Arquillian Cube中使用 。 但這只是一個小嘗試,您可以在以下位置閱讀有關Arquillian Cube和Container Object集成的更多信息:
- https://github.com/arquillian/arquillian-cube#arquillian-cube-and-container-object
還可以在以下位置找到運行示例:
- https://github.com/arquillian/arquillian-cube/tree/master/docker/ftest-docker-containerobject
翻譯自: https://www.javacodegeeks.com/2016/01/container-object-pattern-new-pattern-tests.html
總結
以上是生活随笔為你收集整理的容器对象模式。 一种新的测试模式。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案章和普通章区别在哪(备案章和普通章区
- 下一篇: 外国ddos平台测试(外国ddos平台)