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

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

SpringBoot2 集成測試組件的七種方法

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

在版本開發中,時間段大致的劃分為:需求,開發,測試;

需求階段:理解需求做好接口設計;開發階段:完成功能開發和對接;測試上線:自測,提測,修復,上線;實際上開發階段兩個核心的工作,開發和流程自測,自測的根本目的是為自己提前解決可能出現的問題;如果缺少自測和提測兩個關鍵步驟,那么問題就會被傳遞給更多的用戶,產生更多的資源消耗;

自測是于開發而言,提測是對專業的測試人員而言,如果盡可能在自測階段就發現問題,并解決問題,那么一個問題就不會影響到團隊協作上的更多人員,如果一個簡單的問題上升到團隊協作層面,很可能會導致問題本身被放大。

工欲善其事必先利其器,開發如果要做好自測流程,學會使用工具提高效率是十分關鍵的,自測的關鍵在于發現問題和解決問題,所以選擇好用和高效的工具可以極大的降低自測的時間消耗。

二、PostMan工具

PostMan很常用的接口測試工具,開發過程中快速測試接口,功能強大并且簡單方便,不但可以單個接口測試,也可以對接口分塊管理批量運行:

SpringBoot2 集成測試組件的七種方法

整體來說工具比較好用,適應于開發階段的接口快速測試,或者在解決問題的過程中單個接口的測試,同時對測試參數有存儲和記憶能力,這也是受歡迎的一大原因。

但是該工具不適應于復雜的流程化測試,例如需要根據上次接口的響應報文做分別處理,或者下次請求需要填充某個接口響應的數據。

三、Swagger文檔

Swagger管理接口文檔,是當下服務中很常用的組件,通過對接口和對象的簡單注釋,快速生成接口描述信息,并且可以對接口發送請求,協助調試,該文檔在前后端聯調中極大的提高效率。

接口文檔的管理本身是一件麻煩事,接口通常會根據業務不斷的調整,如果單獨維護一份接口文檔,需要付出很多時間成本,并且容易出問題,利用swagger就可以避免這個問題。

借助swagger注解標記對象

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

借助swagger注解標記接口

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

SpringBoot2 集成測試組件的七種方法

通常來說,基于swagger注解標記接口類和方法上的入參和關鍵返參對象即可,這樣可以避免再單獨維護接口文檔。

Swagger接口文檔在開發的過程中更多是扮演文檔的角色,真正使用swagger去調試的接口也常是一些增刪改查的簡單接口,這個工具也同樣不適應于復雜流程的測試。

四、TestRestTemplate類

SpringBoot測試包中集成的測試API,需要依賴測試包,可以訪問控制層接口,非常方便的完成交互過程:

Jar包依賴

<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源碼中可以發現,基于RestTemplate做封裝,很多功能的實現都是調用RestTemplate方法。

用寫代碼的方式去實現接口測試,靈活度非常高,可以根據流程做定制開發,很適應于中等復雜的場景測試,這里為什么這樣描述,下面對比Http請求再細說。

五、Http請求模式

通過模擬接口的Http請求實現的方式,目前來說個人感覺靈活的最高的方式,先看簡單的案例:

@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 = '服務地址+端口'; @Test public void testHttp (){// 查詢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); }}

這種方式對于復雜的業務流程來說非常好用,當然這里不排除個人習慣,在測試復雜流程的時候,一個簡單方案:

用戶信息:模擬http中token數據; 業務流程:通過數據獲取包裝參數模型; 獨立服務管理,模擬并發場景; 根據執行過程生成分析數據結果;

對于復雜業務流程的測試,每個節點的模擬都具有一定的難度,通常在完整的流程中涉及到的服務和庫表都是多個,并且請求鏈路復雜,基于一個靈活的自動化流程,去測試完整的鏈路,可以對效率有極大的提升。

六、Service層測試

針對服務層的測試手段,其本意在于業務實現的邏輯測試:

@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 (){// 查詢Activity activity = activityService.getById(1) ;// 新增activity.setId(null);activityService.save(activity) ;// 修改activity.setOrganizer('Ser商家');activityService.updateById(activity) ;// 刪除activityService.removeById(activity.getId()) ; }}

該測試在實際的開發過程也并不常用,偶爾在于某個業務方法實現難度很大,用來針對性測試。

七、MockMvc方式

MockMvc同樣是SpringBoot集成測試包提供的測試方式,通過對象的模擬,驗證接口是否符合預期:

@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); }}

對于這種Mock類型的測試,非常專業,通常個人使用極少,暫時沒有Get到其精髓思想。

八、Mockito測試

Mock屬于非常專業和標準的測試手段,需要依賴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>

簡單使用案例:

@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('返回值不符合預期',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); }}

可以通過Mock方式,快速模擬出復雜的對象結構,以便構建測試方法,由于使用很少,同樣個人暫時沒Get到點。

九、源代碼地址

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

以上就是SpringBoot2 集成測試組件的七種方法的詳細內容,更多關于SpringBoot2 集成測試組件的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频一区欧美日韩| 日韩欧美一区二区三区免费看| 蜜桃成人精品| 国产精选在线| 久久这里只有| 国产欧美一区二区色老头| 国产伦理一区| 久久成人高清| 精品久久精品| 日韩欧美国产精品综合嫩v| 91精品韩国| 九九久久婷婷| 人人精品人人爱| 日韩 欧美一区二区三区| 国产亚洲高清一区| 青草综合视频| 你懂的国产精品| 日韩精品1区| 影音国产精品| 一区二区不卡| 国产精品主播在线观看| 久久久精品区| 影视先锋久久| 亚洲专区一区| 国产亚洲电影| 日韩理论片av| 免费精品视频最新在线| 国产欧美大片| 亚洲一区资源| 视频精品一区二区| 69堂精品视频在线播放| 久久精品亚洲| 一本一道久久a久久精品蜜桃| 亚洲制服欧美另类| 久久久精品区| 亚洲精品a级片| 日韩福利视频一区| 麻豆精品久久| 久久视频一区| 亚洲毛片在线免费| 国产成人调教视频在线观看| 国产综合色产| 日韩激情av在线| 久久久久久婷| 久久成人国产| 国产精品免费99久久久| 日韩另类视频| 日韩中出av| 久久久久久婷| 蜜桃av一区二区| 国产伊人久久| 日韩精品一二区| 精品欧美日韩精品| 国产精品社区| 九九久久国产| 91久久视频| 国产毛片一区二区三区| 999精品在线| 欧美日韩中出| 视频小说一区二区| 日韩精品高清不卡| 日韩高清成人| 欧美亚洲免费| 九九综合九九| 久久久91麻豆精品国产一区| 亚洲精品一区二区妖精| 精品一区二区男人吃奶 | 精品久久网站| 美女日韩在线中文字幕| 精品三级久久久| 欧美日韩国产免费观看| 久久精品99国产精品日本| 久久婷婷丁香| 国产精品一在线观看| 91久久国产| 精品国产欧美| 日韩一区二区三区在线看| 91精品精品| 牛牛精品成人免费视频| 午夜性色一区二区三区免费视频| 波多野结衣久久精品| 国产三级一区| 亚洲图片久久| 欧美日韩国产精品一区二区亚洲| 国产91在线播放精品| 日韩三级精品| 伊人久久大香线蕉av超碰演员| 美女国产精品久久久| 亚洲制服一区| 最新日韩欧美| 久久国产毛片| 精品一区二区三区四区五区| 日韩一区二区三区高清在线观看| 欧美午夜不卡| 欧美三级精品| 国产欧洲在线| 国产一区二区三区黄网站| 欧美久久精品| 婷婷亚洲精品| 亚洲bt欧美bt精品777| 亚洲欧洲一区| 久久五月天小说| 精品视频国内| 久久精品三级| 国产日韩一区二区三区在线| 亚洲欧美在线综合| 日韩午夜电影| 国产精品7m凸凹视频分类| 日韩中文影院| 亚洲播播91| 国产精品国产三级国产在线观看| 国产乱码精品一区二区三区亚洲人 | 精品国产中文字幕第一页| 日本亚州欧洲精品不卡| 在线精品视频在线观看高清| 欧美日韩中文一区二区| 日韩国产欧美| 国产aa精品| 国产一区二区色噜噜| 久久99免费视频| 久久99久久久精品欧美| 久久尤物视频| 不卡专区在线| 久久影院午夜精品| 国产伦久视频在线观看| 日韩一区二区三区免费播放| 国产伦久视频在线观看| 热三久草你在线| 日韩精品一卡| 五月综合激情| 亚洲一区久久| 亚洲三级精品| **爰片久久毛片| 久久不卡国产精品一区二区| 国产精品2区| 国产伊人久久| 久久狠狠婷婷| 亚洲一区日本| 亚洲精品成a人ⅴ香蕉片| 日韩高清不卡一区| 久久影视三级福利片| 热三久草你在线| 欧美特黄视频| 日韩精品1区2区3区| 国产欧美日韩精品一区二区三区| 国产经典一区| 丰满少妇一区| 久久精品中文| 羞羞答答国产精品www一本| 亚洲精品大片| 久久爱www成人| 欧美日韩视频网站| 欧美另类专区| **爰片久久毛片| 国产精品久久久久蜜臀| 伊人久久婷婷| 国产精品入口久久| 日韩三区免费| 免费不卡在线观看| 国产日韩三级| 日韩国产一区| 在线看片一区| 精品国产一区二区三区噜噜噜| 久久中文字幕二区| 性欧美精品高清| 国产精品99精品一区二区三区∴ | 中文字幕av一区二区三区四区| 国产精品自在| 人人精品亚洲| 香蕉久久夜色精品国产| 国产欧美日韩视频在线| 日韩免费小视频| 香蕉久久一区| а√天堂8资源在线| 亚洲自拍另类| 精品一区二区三区免费看| 欧美另类综合| 久久成人高清| 一区免费视频| 久久99偷拍| 免费久久99精品国产自在现线| 国产精品色在线网站| 欧美成人精品| 国产精品红桃| 欧美福利在线| 国产精品大片| 国产精品美女久久久| 欧美激情99| 爽好多水快深点欧美视频| 久久一区精品| 另类av一区二区| 国产一区日韩| 亚洲精品动态| 久久高清免费| 国产精品宾馆| 日韩精品一二三四| 亚洲伦乱视频| 国产福利亚洲| 一区二区三区四区日韩| 国产成人调教视频在线观看|