电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Java Testcontainers庫實現測試功能

瀏覽:102日期: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
相關文章:
主站蜘蛛池模板: ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 圆窗水平仪|伊莉莎冈特elesa+ganter | 北京律师咨询_知名专业北京律师事务所_免费法律咨询 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 浙江美尔凯特智能厨卫股份有限公司 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 网站制作优化_网站SEO推广解决方案-无锡首宸信息科技公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 市政路灯_厂家-淄博信达电力科技有限公司| 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 微信小程序定制,广州app公众号商城网站开发公司-广东锋火 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 制样机-密封锤式破碎机-粉碎机-智能马弗炉-南昌科鑫制样 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 发光字|标识设计|标牌制作|精神堡垒 - 江苏苏通广告有限公司 | 捆扎机_气动捆扎机_钢带捆扎机-沈阳海鹞气动钢带捆扎机公司 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 云杂志网-学术期刊-首页| 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 |