对象容器设计模式_容器对象模式。 一种新的测试模式。
對象容器設(shè)計(jì)模式
如果您搜索什么是頁面對象的描述,您會發(fā)現(xiàn)頁面對象模式為我們提供了一種以可重用和可維護(hù)的方式對內(nèi)容建模的常識方法。
還要指出:在Web應(yīng)用程序的UI中,您的測試與某些區(qū)域交互。 Page Object只是將它們建模為測試代碼中的對象。
這減少了重復(fù)代碼的數(shù)量,并且意味著如果UI更改,則僅需要在一個地方應(yīng)用此修復(fù)程序。
如您所見, Page Object適用于UI元素。 我們( Arquillian社區(qū))在Page Object模式邏輯之后創(chuàng)造了一種新模式,稱為Container Object模式。
您可以將“ 容器對象”視為您的測試可能與之交互的容器區(qū)域(現(xiàn)在為Docker容器)。 例如,其中一些領(lǐng)域可能是:
- 獲取運(yùn)行容器的主機(jī)IP。
- 給定暴露端口的綁定端口。
- 在配置文件(Dockerfile)中配置的任何參數(shù),例如用于訪問容器公開的服務(wù)的用戶或密碼。
- 容器的定義。
一個容器對象內(nèi)部可能包含多個容器對象的集合。 這有效地在容器之間建立了關(guān)系船(鏈接)。
例如,在容器中運(yùn)行MySQL數(shù)據(jù)庫的情況下,配置參數(shù)的示例可能是訪問數(shù)據(jù)庫的用戶和密碼。
請注意,沒有什么可以阻止您生成用于從測試訪問服務(wù)的正確URL,或針對容器執(zhí)行命令(如檢索內(nèi)部文件)。
當(dāng)然,就像Page Object一樣, Container Object為您提供了一種構(gòu)建模型內(nèi)容的方法,該模型內(nèi)容可用于多個項(xiàng)目。
在研究如何在Arquillian Cube中實(shí)現(xiàn)此模式之前,我們先來看一個示例:
假設(shè)您所有的應(yīng)用程序都需要將文件發(fā)送到FTP服務(wù)器。 要編寫集成/組件測試,您可能需要FTP服務(wù)器來發(fā)送文件并檢查文件是否正確發(fā)送。
一種方法是在執(zhí)行測試之前使用Docker啟動FTP服務(wù)器,然后使用該Docker容器用于FTP服務(wù)器執(zhí)行測試,然后再停止容器以檢查文件是否存在,最后停止該容器。
因此,所有涉及FTP服務(wù)器和容器的操作都可以在Container Object中加入。 該容器對象可能包含以下信息:
- 使用哪個圖像
- 運(yùn)行此FTP服務(wù)器的主機(jī)的IP和綁定端口
- 訪問FTP服務(wù)器的用戶名和密碼
- 斷言文件存在的方法
然后從測試的角度來看,它僅與該對象通信,而不是直接對測試內(nèi)部的所有信息進(jìn)行硬編碼。
再次與Page Object中一樣 ,容器上的任何更改都只會影響Container對象,而不會影響測試本身。
現(xiàn)在,通過一個非常簡單的示例,看看Arquillian Cube如何實(shí)現(xiàn)Container Object模式:
Arquillian多維數(shù)據(jù)集和容器對象
讓我們看一個簡單的示例,說明如何在Cube中實(shí)現(xiàn)Container Object 。 假設(shè)您要創(chuàng)建一個容器對象,該對象封裝了在Docker內(nèi)部運(yùn)行的乒乓服務(wù)器。
容器對象將類似于帶有特殊注釋的簡單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,并設(shè)置容器實(shí)例的端口綁定信息,在本例中為5000→8080 / tcp 。
請注意,這可以是一個數(shù)組,用于設(shè)置多個端口綁定定義。
下一個注釋是@CubeDockerFile ,它配置如何創(chuàng)建容器。 在這種情況下,請使用位于默認(rèn)類路徑位置的Dockerfile 。 默認(rèn)位置是package + classname ,因此例如在以前的情況下, Dockerfile應(yīng)該放置在org / superbiz / containerobject / PingPongContainer目錄中。
當(dāng)然,您可以通過將注解作為值傳遞來設(shè)置任何其他類路徑位置。 CubeDockerFile批注設(shè)置找到Dockerfile的位置,而不是文件本身。
同樣,該位置應(yīng)該可以從ClassLoader到達(dá),因此這意味著應(yīng)該從類路徑中加載它才能找到它。
任何多維數(shù)據(jù)集都可以使用任何客戶端擴(kuò)展器進(jìn)行擴(kuò)展 ,在這種情況下,可以使用@HostIp 優(yōu)化器進(jìn)行擴(kuò)展 ,但是也可以使用@ArquillianResource通過DockerClient進(jìn)行擴(kuò)展 。
最后, @ HostPort用于將公開的端口轉(zhuǎn)換為綁定的端口。
因此,在此示例中,端口值將為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設(shè)置為類的字段,并使用@Cube進(jìn)行注釋。
用Cube注釋字段非常重要,因此Arquillian在運(yùn)行測試之前,可以檢測到它需要啟動一個新的Cube (Docker容器),創(chuàng)建Container Object并將其注入測試中。
請注意,此批注與定義Container Object時(shí)使用的批注完全相同。
之所以這樣,是因?yàn)槟梢詮臏y試端覆蓋Container Object的任何屬性。 這就是@HostPort批注很重要的原因,因?yàn)榭梢詮臏y試定義更改端口,所以您需要找到一種在容器對象內(nèi)部注入正確端口的方法。
在這篇文章中,我介紹了Container Object模式以及如何在Arquillian Cube中使用 。 但這只是一個小嘗試,您可以在以下位置閱讀有關(guān)Arquillian Cube和Container Object集成的更多信息:
- https://github.com/arquillian/arquillian-cube#arquillian-cube-and-container-object
還可以在以下位置找到運(yùn)行示例:
- 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
對象容器設(shè)計(jì)模式
總結(jié)
以上是生活随笔為你收集整理的对象容器设计模式_容器对象模式。 一种新的测试模式。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 时间服务器(linux 时间
- 下一篇: javaparser_JavaParse