欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年06月01日 08:37:48   作者:知了一笑  
下面圍繞幾個自己開發(fā)過程中常用的測試工具和手段,做簡單的總結(jié),不在于對比方式的好壞,存在即合理,在不同場景中對合理手段的選擇,快速解決問題才是根本目的。

一、背景描述

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

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

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

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

二、PostMan工具

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

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

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

三、Swagger文檔

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

接口文檔的管理本身是一件麻煩事,接口通常會根據(jù)業(yè)務(wù)不斷的調(diào)整,如果單獨維護一份接口文檔,需要付出很多時間成本,并且容易出問題,利用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 = "聯(lián)系號碼")
    private String contactPhone;

    @ApiModelProperty(value = "1線上、2線下")
    private Integer isOnline;

    @ApiModelProperty(value = "舉辦地址")
    private String address;

    @ApiModelProperty(value = "主辦單位")
    private String organizer;

    @ApiModelProperty(value = "創(chuàng)建時間")
    private Date createTime;
}

借助swagger注解標記接口

@Api(tags = "活動主體接口")
@RestController
public 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) ;
    }
}

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

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

四、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源碼中可以發(fā)現(xiàn),基于RestTemplate做封裝,很多功能的實現(xiàn)都是調(diào)用RestTemplate方法。

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

五、Http請求模式

通過模擬接口的Http請求實現(xià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 (){
        // 查詢
        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);
    }
}

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

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

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

六、Service層測試

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

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

該測試在實際的開發(fā)過程也并不常用,偶爾在于某個業(yè)務(wù)方法實現(xiàn)難度很大,用來針對性測試。

七、MockMvc方式

MockMvc同樣是SpringBoot集成測試包提供的測試方式,通過對象的模擬,驗證接口是否符合預(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);
    }
}

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

八、Mockito測試

Mock屬于非常專業(yè)和標準的測試手段,需要依賴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)
@SpringBootTest
public 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);
    }
}

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

九、源代碼地址

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

以上就是SpringBoot2 集成測試組件的七種方法的詳細內(nèi)容,更多關(guān)于SpringBoot2 集成測試組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • datatables 帶查詢條件java服務(wù)端分頁處理實例

    datatables 帶查詢條件java服務(wù)端分頁處理實例

    本篇文章主要介紹了datatables 帶查詢條件java服務(wù)端分頁處理實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java高效提取PDF文件指定坐標的文本內(nèi)容實戰(zhàn)代碼

    Java高效提取PDF文件指定坐標的文本內(nèi)容實戰(zhàn)代碼

    在日常工作中,有時可能會需要從龐大的PDF文檔中提取其中所包含的文本內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于如何利用Java高效提取PDF文件指定坐標的文本內(nèi)容,需要的朋友可以參考下
    2024-01-01
  • maven多moudle項目在idea里面顯示多個root問題及解決

    maven多moudle項目在idea里面顯示多個root問題及解決

    這篇文章主要介紹了maven多moudle項目在idea里面顯示多個root問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Springboot項目中單元測試時注入bean失敗的解決方案

    Springboot項目中單元測試時注入bean失敗的解決方案

    這篇文章主要介紹了Springboot項目中單元測試時注入bean失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot實現(xiàn)MapperScan添加動態(tài)配置(占位符)

    SpringBoot實現(xiàn)MapperScan添加動態(tài)配置(占位符)

    這篇文章主要介紹了SpringBoot實現(xiàn)MapperScan添加動態(tài)配置(占位符),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 詳解springMVC兩種方式實現(xiàn)多文件上傳及效率比較

    詳解springMVC兩種方式實現(xiàn)多文件上傳及效率比較

    本篇文章介紹了springMVC兩種方式實現(xiàn)多文件上傳及效率比較。springMVC實現(xiàn)多文件上傳有兩種,一種是字節(jié)流的方式進行文件上傳,另外一種是使用springMVC包裝好的解析器進行上傳,有興趣的可以了解一下。
    2016-12-12
  • Spring Boot自動注入的原理分析

    Spring Boot自動注入的原理分析

    這篇文章主要給大家分析介紹了關(guān)于Spring Boot自動注入的原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者使用Spring Boot自具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java緩存Map設(shè)置過期時間實現(xiàn)解析

    Java緩存Map設(shè)置過期時間實現(xiàn)解析

    這篇文章主要介紹了Java緩存Map設(shè)置過期時間實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Intellij IDEA 錄制快捷鍵實現(xiàn)自動格式化的方法

    Intellij IDEA 錄制快捷鍵實現(xiàn)自動格式化的方法

    這篇文章主要介紹了Intellij IDEA 錄制快捷鍵實現(xiàn)自動格式化的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論