日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java Testcontainers庫實現測試功能

瀏覽:170日期:2022-08-25 15:23:28

1.Testcontainers介紹:

Testcontainers是一個Java庫,它支持JUnit測試,提供公共數據庫、SeleniumWeb瀏覽器或任何可以在Docker容器中運行的輕量級、一次性實例。

測試容器使以下類型的測試更加容易:

數據訪問層集成測試:

使用MySQL,PostgreSQL或Oracle數據庫的容器化實例測試您的數據訪問層代碼,但無需在開發人員的計算機上進行復雜的設置,并且測試將始終從已知的數據庫狀態開始,避免“垃圾”數據的干擾。也可以使用任何其他可以容器化的數據庫類型。

應用程序集成測試:

用于在具有相關性(例如數據庫,消息隊列或Web服務器)的短期測試模式下運行應用程序。

UI /驗收測試:

使用與Selenium兼容的容器化Web瀏覽器進行自動化UI測試。每個測試都可以獲取瀏覽器的新實例,而無需擔心瀏覽器狀態,插件版本或瀏覽器自動升級。您將獲得每個測試會話或測試失敗的視頻記錄。

更多:

可以簽出各種貢獻的模塊,或使用 GenericContainer作為基礎創建自己的自定義容器類。

2.Testcontainers實踐示例:

Testcontainers提供了多種現成的與測試關聯的應用程序容器,如下圖:

Java Testcontainers庫實現測試功能

在本文中,將演示集成postgresql容器和mockserver容器的測試。

Testcontainers必要條件:

1.Docker

2.支持的JVM測試框架:JUnit4,JUnit5,spock...

2.1 集成postgresql測試依賴:

<dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>1.12.5</version> <scope>test</scope></dependency><dependency> <groupId>org.testcontainers</groupId> <!--指定數據庫名稱,mysql,mariadb等等--> <artifactId>postgresql</artifactId> <version>1.12.5</version> <scope>test</scope></dependency>

配置:

在項目的src/test/resources/application.properties文件中配置postgresql相關信息

#將驅動程序設置為org.testcontainers.jdbc.ContainerDatabaseDriver,它是一個Testcontainers JDBC代理驅動程序。初始化數據源時,此驅動程序將負責啟動所需的Docker容器。spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver

#將JDBC URL設置為JDBC:tc:<database image>:<version>:///以便Testcontainers知道要使用哪個數據庫。#TC_INITSCRIPT=指定的數據庫初始化的腳本文件位置spring.datasource.url=jdbc:tc:postgresql:9.6:///?TC_INITSCRIPT=file:src/main/resources/init_db.sql

#將方言明確設置為數據庫的方言實現,否則在啟動應用程序時會收到異常。當您在應用程序中使用JPA時(通過Spring Data JPA),此步驟是必需的spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect

測試示例:

為了在@DataJpaTest中使用TC,您需要確保使用了應用程序定義的(自動配置的)數據源。您可以通過使用@AutoConfigureTestDatabase注釋測試來輕松完成此操作,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)@DataJpaTest@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)public class OwnerRepositoryTests { @Autowired private OwnerRepository ownerRepository; @Test void findAllReturnsJohnDoe() { // as defined in tc-initscript.sql var owners = ownerRepository.findAll(); assertThat(owners.size()).isOne(); assertThat(owners.get(0).getFirstName()).isEqualTo('John'); assertThat(owners.get(0).getLastName()).isEqualTo('Doe'); }}

以上測試將使用Testcontainers提供的postgresql容器進行測試,從而排除了外部環境對測試的干擾。

當需要用本地數據庫進行集成測試時,我們只要使用@SpringBootTest替換如上兩個注解即可:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)@AutoConfigureMockMvcpublic class OwnerResourceTests { @Autowired WebApplicationContext wac; @Test void findAllReturnsJohnDoe() throws Exception { given().webAppContextSetup(wac) .when().get('/owners') .then().status(HttpStatus.OK).body( '_embedded.owners.firstName', containsInAnyOrder('John'), '_embedded.owners.lastName', containsInAnyOrder('Doe')); }}

以上測試將使用真實運行環境的數據庫進行測試。

2.2 集成mockServer測試

Mock Server可用于通過將請求與用戶定義的期望進行匹配來模擬HTTP服務。

依賴:

<dependency> <groupId>org.testcontainers</groupId> <artifactId>mockserver</artifactId> <version>1.12.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mock-server</groupId> <artifactId>mockserver-netty</artifactId> <version>5.5.4</version> </dependency> <dependency> <groupId>org.mock-server</groupId> <artifactId>mockserver-client-java</artifactId> <version>5.5.4</version> </dependency>

測試示例:

//創建一個MockServer容器@Rulepublic MockServerContainer mockServer = new MockServerContainer();

以及使用Java MockServerClient設置簡單的期望。

new MockServerClient(mockServer.getContainerIpAddress(), mockServer.getServerPort()).when(request() .withPath('/person') .withQueryStringParameter('name', 'peter')).respond(response() .withBody('Peter the person!'));//...當一個get請求至’/person?name=peter’ 時會返回 'Peter the person!'

測試(使用restassured進行測試):

RestAssured.baseURI = 'http://' + mockServer.getContainerIpAddress();RestAssured.port = mockServer.getServerPort();given().queryParam('name', 'peter').get('/person').then().statusCode(HttpStatus.OK.value()).body(is('Peter the person!'));

完整代碼如下:

@RunWith(SpringJUnit4ClassRunner.class)public class OneTests { @Rule public MockServerContainer mockServer = new MockServerContainer(); @Test public void v() { RestAssured.baseURI = 'http://' + mockServer.getContainerIpAddress(); RestAssured.port = mockServer.getServerPort(); new MockServerClient(mockServer.getContainerIpAddress(), mockServer.getServerPort()).when(request() .withPath('/person') .withQueryStringParameter('name', 'peter')).respond(response() .withBody('Peter the person!')); given().queryParam('name', 'peter').get('/person').then().statusCode(HttpStatus.OK.value()).body(is('Peter the person!')); }}

3.總結:

Testcontainers輕松的解決了集成測試時測試代碼與本地組件耦合,從而出現各種意外失敗的問題(比如本地數據庫中存在臟數據影響到了集成測試,多個集成測試同時運行時相互干擾導致測試結果意外失敗)。筆者之前專門為集成測試準備了一套數據庫,使數據和其他環境隔離掉,但還是會遇到多個集成測試一起跑相互干擾的問題,Testcontainers輕松的解決了筆者的問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
激情不卡一区二区三区视频在线| 日韩精品亚洲专区| 亚洲免费专区| 免费在线看一区| 日韩精品不卡一区二区| 亚洲天堂免费| 麻豆视频在线看| 国产精品婷婷| 日韩1区2区| 综合激情网站| 国产精品日韩久久久| 老鸭窝一区二区久久精品| 亚洲aⅴ网站| 香蕉久久99| 精品国产18久久久久久二百| 欧美一级二级三级视频| 久久久久久免费视频| 日本精品国产| 久久久久久自在自线| 国产精品日韩精品中文字幕| 亚洲欧美成人综合| 日av在线不卡| 婷婷丁香综合| 在线视频亚洲欧美中文| 激情久久久久久| 久久一区二区中文字幕| 丝袜美腿一区| 91久久国产| 亚洲黄色在线| 国产精品中文字幕亚洲欧美| 国产精品香蕉| 噜噜噜躁狠狠躁狠狠精品视频| 午夜日韩在线| 亚洲精品黄色| 日本在线不卡视频一二三区| 欧美亚洲免费| 红杏一区二区三区| 激情久久一区二区| 欧美日韩在线播放视频| 亚洲人www| 午夜久久av| 亚洲男人在线| 欧美激情三区| 蜜桃精品在线| 午夜亚洲精品| 蜜桃久久久久| 国产剧情在线观看一区| 免费在线日韩av| 国产精品99一区二区| 久久国产精品99国产| 国产精品成人一区二区网站软件| 在线看片福利| 在线亚洲观看| 日本在线不卡视频| 日韩精品一卡| 亚洲开心激情| 久久亚洲专区| 国产精品videossex| 久久精品国语| 伊人久久婷婷| 动漫av一区| 欧美日韩亚洲在线观看| 久久精品国内一区二区三区| 亚洲一区二区动漫| 精品一二三区| 一区福利视频| 免费污视频在线一区| 日韩激情中文字幕| 日韩在线a电影| 亚洲v在线看| 精品久久亚洲| 高清一区二区| 国产精品视频一区二区三区| 免费看日韩精品| 久久国产日本精品| 久久久一二三| 欧美a级一区二区| 伊人久久成人| 亚洲欧美日韩一区在线观看| 成人亚洲精品| 国产精品亚洲综合久久| 中文在线日韩| 亚洲九九精品| 美美哒免费高清在线观看视频一区二区 | 亚洲免费成人| 欧美va天堂| 久久久久久久久久久妇女| 激情黄产视频在线免费观看| 国产极品久久久久久久久波多结野| 一区二区三区四区在线观看国产日韩| 亚洲四虎影院| 国产一区亚洲| 国产模特精品视频久久久久| 香蕉久久夜色精品国产| 日韩一区网站| 久久免费精品| 国产精品久久久久久久免费观看 | 日本精品在线播放| 在线亚洲成人| 18国产精品| 欧美国产另类| 日本不卡视频在线| 国产激情一区| 一区二区三区四区日本视频| 色婷婷综合网| 欧美特黄一级大片| 日韩精品一级中文字幕精品视频免费观看| 日韩亚洲精品在线观看| 国产麻豆一区| av免费不卡国产观看| 亚洲一区免费| 精品久久国产一区| 国产一区日韩欧美| 亚洲欧美日本日韩| 日韩激情一区二区| 亚洲一级影院| 蜜桃av一区二区| 岛国av在线网站| 日韩av一区二区在线影视| 欧美亚洲二区| 日本91福利区| 中文字幕高清在线播放| 激情五月色综合国产精品| 一本色道精品久久一区二区三区| 久久精品一本| 日韩精品一级二级 | 久久久夜夜夜| 韩国久久久久久| 欧美久久亚洲| 久久精品免费看| 亚洲成人精品| 日本成人在线视频网站| 极品日韩av| 欧美a一区二区| 国产精品激情| 91亚洲精品在看在线观看高清| 五月天av在线| 国产精品日韩精品在线播放| 亚洲精品韩国| 国产亚洲综合精品| 一级欧洲+日本+国产| 国产一区二区三区久久| 高清av不卡| 亚洲尤物av| 亚洲精品福利| 水野朝阳av一区二区三区| 久久精品一本| 精品国产a一区二区三区v免费| 亚洲麻豆一区| 中文字幕日本一区二区| 最新亚洲国产| 综合国产视频| 中文一区在线| 欧美日韩免费看片| 韩国一区二区三区视频| 精品免费在线| 亚洲成人精选| 国产不卡人人| 国产一区二区三区久久| 亚洲成人二区| 国产精品视区| 日本久久一区| 日本一区二区中文字幕| 久久久久美女| 国产日韩专区| 69堂免费精品视频在线播放| 国产免费av国片精品草莓男男| 国产a亚洲精品| 国产成人精品999在线观看| 成人台湾亚洲精品一区二区| 国产一区二区亚洲| 久久精品影视| 日韩亚洲精品在线| 国产午夜精品一区二区三区欧美 | 精品国产乱码久久久久久1区2匹| 国产成人免费精品| 亚洲在线一区| 欧美精品成人| 先锋亚洲精品| 美女视频网站久久| 美女日韩在线中文字幕| 欧美国产偷国产精品三区| 国产精品88久久久久久| 国产一区导航| 国产一区二区三区亚洲| 久久国产精品久久久久久电车| 里番精品3d一二三区| 免费在线观看一区二区三区| 在线日韩一区| 日韩不卡一二三区| 国产精品色网| 亚洲高清不卡| 国产日韩欧美在线播放不卡| 中文精品电影| 午夜久久99| 影音先锋国产精品| 首页国产精品| 福利视频一区| 日韩大片免费观看| 国产精品毛片久久久|