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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot2 集成測(cè)試組件的七種方法

瀏覽:16日期:2023-03-08 09:53:02
目錄一、背景描述二、PostMan工具三、Swagger文檔四、TestRestTemplate類(lèi)五、Http請(qǐng)求模式六、Service層測(cè)試七、MockMvc方式八、Mockito測(cè)試九、源代碼地址一、背景描述

在版本開(kāi)發(fā)中,時(shí)間段大致的劃分為:需求,開(kāi)發(fā),測(cè)試;

需求階段:理解需求做好接口設(shè)計(jì);開(kāi)發(fā)階段:完成功能開(kāi)發(fā)和對(duì)接;測(cè)試上線:自測(cè),提測(cè),修復(fù),上線;實(shí)際上開(kāi)發(fā)階段兩個(gè)核心的工作,開(kāi)發(fā)和流程自測(cè),自測(cè)的根本目的是為自己提前解決可能出現(xiàn)的問(wèn)題;如果缺少自測(cè)和提測(cè)兩個(gè)關(guān)鍵步驟,那么問(wèn)題就會(huì)被傳遞給更多的用戶(hù),產(chǎn)生更多的資源消耗;

自測(cè)是于開(kāi)發(fā)而言,提測(cè)是對(duì)專(zhuān)業(yè)的測(cè)試人員而言,如果盡可能在自測(cè)階段就發(fā)現(xiàn)問(wèn)題,并解決問(wèn)題,那么一個(gè)問(wèn)題就不會(huì)影響到團(tuán)隊(duì)協(xié)作上的更多人員,如果一個(gè)簡(jiǎn)單的問(wèn)題上升到團(tuán)隊(duì)協(xié)作層面,很可能會(huì)導(dǎo)致問(wèn)題本身被放大。

工欲善其事必先利其器,開(kāi)發(fā)如果要做好自測(cè)流程,學(xué)會(huì)使用工具提高效率是十分關(guān)鍵的,自測(cè)的關(guān)鍵在于發(fā)現(xiàn)問(wèn)題和解決問(wèn)題,所以選擇好用和高效的工具可以極大的降低自測(cè)的時(shí)間消耗。

二、PostMan工具

PostMan很常用的接口測(cè)試工具,開(kāi)發(fā)過(guò)程中快速測(cè)試接口,功能強(qiáng)大并且簡(jiǎn)單方便,不但可以單個(gè)接口測(cè)試,也可以對(duì)接口分塊管理批量運(yùn)行:

SpringBoot2 集成測(cè)試組件的七種方法

整體來(lái)說(shuō)工具比較好用,適應(yīng)于開(kāi)發(fā)階段的接口快速測(cè)試,或者在解決問(wèn)題的過(guò)程中單個(gè)接口的測(cè)試,同時(shí)對(duì)測(cè)試參數(shù)有存儲(chǔ)和記憶能力,這也是受歡迎的一大原因。

但是該工具不適應(yīng)于復(fù)雜的流程化測(cè)試,例如需要根據(jù)上次接口的響應(yīng)報(bào)文做分別處理,或者下次請(qǐng)求需要填充某個(gè)接口響應(yīng)的數(shù)據(jù)。

三、Swagger文檔

Swagger管理接口文檔,是當(dāng)下服務(wù)中很常用的組件,通過(guò)對(duì)接口和對(duì)象的簡(jiǎn)單注釋?zhuān)焖偕山涌诿枋鲂畔ⅲ⑶铱梢詫?duì)接口發(fā)送請(qǐng)求,協(xié)助調(diào)試,該文檔在前后端聯(lián)調(diào)中極大的提高效率。

接口文檔的管理本身是一件麻煩事,接口通常會(huì)根據(jù)業(yè)務(wù)不斷的調(diào)整,如果單獨(dú)維護(hù)一份接口文檔,需要付出很多時(shí)間成本,并且容易出問(wèn)題,利用swagger就可以避免這個(gè)問(wèn)題。

借助swagger注解標(biāo)記對(duì)象

@TableName('jt_activity')@ApiModel(value='活動(dòng)PO對(duì)象', description='活動(dòng)信息表【jt_activity】')public class Activity { @ApiModelProperty(value = '主鍵ID') @TableId(type = IdType.AUTO) private Integer id; @ApiModelProperty(value = '活動(dòng)主題') private String activityTitle; @ApiModelProperty(value = '聯(lián)系號(hào)碼') private String contactPhone; @ApiModelProperty(value = '1線上、2線下') private Integer isOnline; @ApiModelProperty(value = '舉辦地址') private String address; @ApiModelProperty(value = '主辦單位') private String organizer; @ApiModelProperty(value = '創(chuàng)建時(shí)間') private Date createTime;}

借助swagger注解標(biāo)記接口

@Api(tags = '活動(dòng)主體接口')@RestControllerpublic class ActivityWeb { @Resource private ActivityService activityService ; @ApiOperation('新增活動(dòng)') @PostMapping('/activity') public Integer save (@RequestBody Activity activity){activityService.save(activity) ;return activity.getId() ; } @ApiOperation('主鍵查詢(xún)') @GetMapping('/activity/{id}') public Activity getById (@PathVariable('id') Integer id){return activityService.getById(id) ; } @ApiOperation('修改活動(dòng)') @PutMapping('/activity') public Boolean updateById (@RequestBody Activity activity){return activityService.updateById(activity) ; }}

SpringBoot2 集成測(cè)試組件的七種方法

通常來(lái)說(shuō),基于swagger注解標(biāo)記接口類(lèi)和方法上的入?yún)⒑完P(guān)鍵返參對(duì)象即可,這樣可以避免再單獨(dú)維護(hù)接口文檔。

Swagger接口文檔在開(kāi)發(fā)的過(guò)程中更多是扮演文檔的角色,真正使用swagger去調(diào)試的接口也常是一些增刪改查的簡(jiǎn)單接口,這個(gè)工具也同樣不適應(yīng)于復(fù)雜流程的測(cè)試。

四、TestRestTemplate類(lèi)

SpringBoot測(cè)試包中集成的測(cè)試API,需要依賴(lài)測(cè)試包,可以訪問(wèn)控制層接口,非常方便的完成交互過(guò)程:

Jar包依賴(lài)

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency>

使用案例

@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)public class ActivityTest01 { protected static Logger logger = LoggerFactory.getLogger(ActivityTest01.class) ; @Resource private TestRestTemplate restTemplate; private Activity activity = null ; @Before public void before (){activity = restTemplate.getForObject('/activity/{id}', Activity.class,1);logger.info('n'+JSONUtil.toJsonPrettyStr(activity)); } @Test public void updateById (){if (activity != null){ activity.setCreateTime(new Date()); activity.setOrganizer('One商家'); restTemplate.put('/activity',activity);} } @After public void after (){activity = restTemplate.getForObject('/activity/{id}', Activity.class,1);logger.info('n'+JSONUtil.toJsonPrettyStr(activity));activity = null ; }}

在TestRestTemplate源碼中可以發(fā)現(xiàn),基于RestTemplate做封裝,很多功能的實(shí)現(xiàn)都是調(diào)用RestTemplate方法。

用寫(xiě)代碼的方式去實(shí)現(xiàn)接口測(cè)試,靈活度非常高,可以根據(jù)流程做定制開(kāi)發(fā),很適應(yīng)于中等復(fù)雜的場(chǎng)景測(cè)試,這里為什么這樣描述,下面對(duì)比Http請(qǐng)求再細(xì)說(shuō)。

五、Http請(qǐng)求模式

通過(guò)模擬接口的Http請(qǐng)求實(shí)現(xiàn)的方式,目前來(lái)說(shuō)個(gè)人感覺(jué)靈活的最高的方式,先看簡(jiǎn)單的案例:

@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)public class ActivityTest03 { protected static Logger logger = LoggerFactory.getLogger(ActivityTest03.class) ; protected static String REQ_URL = '服務(wù)地址+端口'; @Test public void testHttp (){// 查詢(xún)String getRes = HttpUtil.get(REQ_URL+'activity/1');logger.info('n {} ',JSONUtil.toJsonPrettyStr(getRes));Activity activity = JSONUtil.toBean(getRes, Activity.class) ;// 新增activity.setId(null);activity.setOrganizer('Http商家');String saveRes = HttpUtil.post(REQ_URL+'/activity',JSONUtil.toJsonStr(activity));logger.info('n {} ',saveRes);// 更新activity.setId(Integer.parseInt(saveRes));activity.setOrganizer('Put商家');String putRes = HttpRequest.put(REQ_URL+'/activity').body(JSONUtil.toJsonStr(activity)).execute().body();logger.info('n {} ',putRes); }}

這種方式對(duì)于復(fù)雜的業(yè)務(wù)流程來(lái)說(shuō)非常好用,當(dāng)然這里不排除個(gè)人習(xí)慣,在測(cè)試復(fù)雜流程的時(shí)候,一個(gè)簡(jiǎn)單方案:

用戶(hù)信息:模擬http中token數(shù)據(jù); 業(yè)務(wù)流程:通過(guò)數(shù)據(jù)獲取包裝參數(shù)模型; 獨(dú)立服務(wù)管理,模擬并發(fā)場(chǎng)景; 根據(jù)執(zhí)行過(guò)程生成分析數(shù)據(jù)結(jié)果;

對(duì)于復(fù)雜業(yè)務(wù)流程的測(cè)試,每個(gè)節(jié)點(diǎn)的模擬都具有一定的難度,通常在完整的流程中涉及到的服務(wù)和庫(kù)表都是多個(gè),并且請(qǐng)求鏈路復(fù)雜,基于一個(gè)靈活的自動(dòng)化流程,去測(cè)試完整的鏈路,可以對(duì)效率有極大的提升。

六、Service層測(cè)試

針對(duì)服務(wù)層的測(cè)試手段,其本意在于業(yè)務(wù)實(shí)現(xiàn)的邏輯測(cè)試:

@RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)public class ActivityTest04 { protected static Logger logger = LoggerFactory.getLogger(ActivityTest04.class) ; @Autowired private ActivityService activityService ; @Test public void testService (){// 查詢(xún)Activity activity = activityService.getById(1) ;// 新增activity.setId(null);activityService.save(activity) ;// 修改activity.setOrganizer('Ser商家');activityService.updateById(activity) ;// 刪除activityService.removeById(activity.getId()) ; }}

該測(cè)試在實(shí)際的開(kāi)發(fā)過(guò)程也并不常用,偶爾在于某個(gè)業(yè)務(wù)方法實(shí)現(xiàn)難度很大,用來(lái)針對(duì)性測(cè)試。

七、MockMvc方式

MockMvc同樣是SpringBoot集成測(cè)試包提供的測(cè)試方式,通過(guò)對(duì)象的模擬,驗(yàn)證接口是否符合預(yù)期:

@AutoConfigureMockMvc@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)public class ActivityTest02 { protected static Logger logger = LoggerFactory.getLogger(ActivityTest02.class) ; @Resource private MockMvc mockMvc ; private Activity activity = null ; @Before public void before () throws Exception {ResultActions resultAction = mockMvc.perform(MockMvcRequestBuilders.get('/activity/{id}',1)) ;MvcResult mvcResult = resultAction.andReturn() ;String result = mvcResult.getResponse().getContentAsString();activity = JSONUtil.toBean(result,Activity.class) ; } @Test public void updateById () throws Exception {activity.setId(null);activity.setCreateTime(new Date());activity.setOrganizer('One商家');ResultActions resultAction = mockMvc.perform(MockMvcRequestBuilders.post('/activity') .contentType(MediaType.APPLICATION_JSON) .content(JSONUtil.toJsonStr(activity))) ;MvcResult mvcResult = resultAction.andReturn() ;String result = mvcResult.getResponse().getContentAsString();activity.setId(Integer.parseInt(result));logger.info('result : {} ',result); } @After public void after () throws Exception {activity.setCreateTime(new Date());activity.setOrganizer('Update商家');ResultActions resultAction = mockMvc.perform(MockMvcRequestBuilders.put('/activity').contentType(MediaType.APPLICATION_JSON).content(JSONUtil.toJsonStr(activity))) ;MvcResult mvcResult = resultAction.andReturn() ;String result = mvcResult.getResponse().getContentAsString();logger.info('result : {} ',result); }}

對(duì)于這種Mock類(lèi)型的測(cè)試,非常專(zhuān)業(yè),通常個(gè)人使用極少,暫時(shí)沒(méi)有Get到其精髓思想。

八、Mockito測(cè)試

Mock屬于非常專(zhuān)業(yè)和標(biāo)準(zhǔn)的測(cè)試手段,需要依賴(lài)powermock包:

<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <scope>test</scope></dependency><dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <scope>test</scope></dependency><dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <scope>test</scope></dependency>

簡(jiǎn)單使用案例:

@RunWith(PowerMockRunner.class)@SpringBootTestpublic class ActivityTest05 { @Test public void testMock (){Set mockSet = PowerMockito.mock(Set.class);PowerMockito.when(mockSet.size()).thenReturn(10);int actual = mockSet.size();int expected = 15 ;Assert.assertEquals('返回值不符合預(yù)期',expected, actual); } @Test public void testTitle (){String expectTitle = 'Mock主題' ;Activity activity = PowerMockito.mock(Activity.class);PowerMockito.when(activity.getMockTitle()).thenReturn(expectTitle);String actualTitle = activity.getMockTitle();Assert.assertNotEquals('主題相符', expectTitle, actualTitle); }}

可以通過(guò)Mock方式,快速模擬出復(fù)雜的對(duì)象結(jié)構(gòu),以便構(gòu)建測(cè)試方法,由于使用很少,同樣個(gè)人暫時(shí)沒(méi)Get到點(diǎn)。

九、源代碼地址

GitHub·地址https://github.com/cicadasmile/middle-ware-parentGitEE·地址https://gitee.com/cicadasmile/middle-ware-parent

以上就是SpringBoot2 集成測(cè)試組件的七種方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot2 集成測(cè)試組件的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美韩日一区| 国产情侣一区| 色综合狠狠操| 啪啪国产精品| 久久高清一区| 日本一区二区中文字幕| 麻豆久久一区| 日韩网站中文字幕| 视频一区在线播放| 午夜欧美精品| 亚洲综合婷婷| 久久在线91| 亚洲成人一区| 欧美精品国产白浆久久久久| 久久免费精品| 欧美精品一区二区久久| 91九色精品| 欧美日韩一区二区三区不卡视频| 老司机精品视频在线播放| 欧美日韩尤物久久| 亚洲欧洲国产精品一区| 福利一区二区三区视频在线观看| 欧美特黄一区| 国产精品777777在线播放| 欧美影院三区| 国产调教精品| 亚洲无线一线二线三线区别av| 日本欧美韩国一区三区| 亚洲精品一区三区三区在线观看| 亚洲2区在线| a日韩av网址| 只有精品亚洲| 日韩欧美国产精品综合嫩v| 在线观看一区| 亚洲日本网址| 欧美影院精品| 欧美日韩国产高清| 老色鬼精品视频在线观看播放| 中文字幕在线看片| 日韩国产精品久久久久久亚洲| 成人影视亚洲图片在线| 综合亚洲视频| 亲子伦视频一区二区三区| 日韩高清不卡一区二区| 国产91一区| 精品中文字幕一区二区三区| aa国产精品| 国产精品国产一区| 日本中文字幕不卡| 99riav1国产精品视频| 日本一区二区高清不卡| 日韩福利视频网| 午夜久久影院| 久久国产日韩| 麻豆成人91精品二区三区| 蜜臀精品久久久久久蜜臀| 999国产精品永久免费视频app| 免费在线观看一区| 日韩国产欧美三级| 日韩中文欧美在线| 久久中文字幕二区| 国产精品99在线观看| 婷婷精品在线观看| 国产亚洲精品久久久久婷婷瑜伽| 一本大道色婷婷在线| 久久精品国产在热久久| 亚洲精品中文字幕99999| 最新亚洲激情| 久久精品亚洲欧美日韩精品中文字幕| 欧美激情福利| 国产日韩中文在线中文字幕 | 欧美专区一区二区三区| 激情视频网站在线播放色| 国产精品久久久久久久久久齐齐| 视频在线观看一区二区三区| 一区二区三区视频免费观看| 波多视频一区| 日本一区二区免费高清| 精品一区二区三区视频在线播放| 91精品国产自产观看在线| 美国三级日本三级久久99 | 午夜久久av| 夜久久久久久| 亚洲视频综合| 国产在线成人| 1024精品一区二区三区| 久久精品国产亚洲夜色av网站| 日韩av福利| 99久久久久| 亚洲午夜av| 欧美高清一区| 视频一区中文| 好吊视频一区二区三区四区| 激情久久婷婷| 国产精品7m凸凹视频分类| 午夜久久tv| 视频一区视频二区中文| 男女激情视频一区| 在线一区二区三区视频| 亚洲精品视频一二三区| 亚洲精品麻豆| 青青草国产成人99久久| 国产精品久久久久久久久久白浆| 国产精品日韩精品在线播放| 欧美国产日韩电影| 免费一区二区三区在线视频| 麻豆精品99| 首页国产精品| 999久久久免费精品国产| 免费视频国产一区| 天堂va蜜桃一区二区三区| 在线一区二区三区视频| 国产调教一区二区三区| 美女视频黄久久| 日本在线啊啊| 免费黄色成人| 亚洲人成网站在线在线观看| 日本麻豆一区二区三区视频| 免费在线亚洲欧美| 免费在线小视频| 欧美精品自拍| 日韩激情视频网站| 欧美精品不卡| 久久精品123| 久久国产66| 国产探花一区| 日韩在线视频精品| 在线亚洲欧美| 日韩精品久久久久久| 嫩草伊人久久精品少妇av杨幂| 日韩成人综合| 欧美专区一区二区三区| 国产精品视频一区二区三区四蜜臂 | 在线精品亚洲| 欧美日本不卡高清| 日韩免费av| 天堂成人免费av电影一区| 国产日本精品| 日韩在线二区| 亚洲在线久久| 欧美国产亚洲精品| 久久精品国产亚洲夜色av网站 | 国产一区二区视频在线看| 精品一区毛片| 国产欧美自拍| 婷婷亚洲五月色综合| 日本午夜精品一区二区三区电影| 色一区二区三区四区| 免费日本视频一区| 久久午夜影院| 国产偷自视频区视频一区二区| 欧美另类中文字幕| 色综合www| 日本成人精品| 999国产精品| 国产日产高清欧美一区二区三区 | 91精品国产自产在线丝袜啪| 日韩精品dvd| 日本va欧美va欧美va精品| 日韩欧美精品| 欧美一区网站| av一区二区高清| 国产极品嫩模在线观看91精品| 欧美日中文字幕| 日本欧美在线| 欧美网站在线| 日本黄色精品| 日韩欧美在线精品| 在线日韩视频| 精品日产乱码久久久久久仙踪林| 亚洲专区在线| 吉吉日韩欧美| 欧美在线观看天堂一区二区三区| 精品亚洲美女网站| 国产精品久久| 免费人成在线不卡| 久久国产亚洲精品| 久久av综合| 中文字幕亚洲精品乱码| 日本蜜桃在线观看视频| 国产精品天堂蜜av在线播放| 天堂va蜜桃一区二区三区| 日韩欧美精品一区| 国产精品一区二区三区美女 | 亚洲激情中文| 成人在线黄色| 久久国产三级| 欧美日韩国产高清| 高清在线一区| 国产亚洲字幕| 日韩中文字幕区一区有砖一区| 亚洲一级少妇| 精品国产乱码久久久久久樱花 | 亚洲小说欧美另类婷婷| 国精品产品一区| 亚洲精品精选| 午夜宅男久久久| 亚洲黑丝一区二区| 国产精品高颜值在线观看| 国产视频一区二区在线播放|