返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot2 集成测试组件的七种方法
  • 755
分享到

SpringBoot2 集成测试组件的七种方法

2024-04-02 19:04:59 755人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、背景描述 二、PostMan工具 三、swagger文档 四、TestRestTemplate类 五、Http请求模式 六、Service层测试 七、Mockmvc方式 八、

一、背景描述

在版本开发中,时间段大致的划分为:需求,开发,测试;

需求阶段:理解需求做好接口设计;
开发阶段:完成功能开发和对接;
测试上线:自测,提测,修复,上线;
实际上开发阶段两个核心的工作,开发和流程自测,自测的根本目的是为自己提前解决可能出现的问题;如果缺少自测和提测两个关键步骤,那么问题就会被传递给更多的用户,产生更多的资源消耗;

自测是于开发而言,提测是对专业的测试人员而言,如果尽可能在自测阶段就发现问题,并解决问题,那么一个问题就不会影响到团队协作上的更多人员,如果一个简单的问题上升到团队协作层面,很可能会导致问题本身被放大。

工欲善其事必先利其器,开发如果要做好自测流程,学会使用工具提高效率是十分关键的,自测的关键在于发现问题和解决问题,所以选择好用和高效的工具可以极大的降低自测的时间消耗。

二、PostMan工具

PostMan很常用的接口测试工具,开发过程中快速测试接口,功能强大并且简单方便,不但可以单个接口测试,也可以对接口分块管理批量运行:

整体来说工具比较好用,适应于开发阶段的接口快速测试,或者在解决问题的过程中单个接口的测试,同时对测试参数有存储和记忆能力,这也是受欢迎的一大原因。

但是该工具不适应于复杂的流程化测试,例如需要根据上次接口的响应报文做分别处理,或者下次请求需要填充某个接口响应的数据。

三、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 = "活动主体接口")
@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注解标记接口类和方法上的入参和关键返参对象即可,这样可以避免再单独维护接口文档。

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)
@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("返回值不符合预期",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-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

以上就是SpringBoot2 集成测试组件的七种方法的详细内容,更多关于SpringBoot2 集成测试组件的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringBoot2 集成测试组件的七种方法

本文链接: https://lsjlt.com/news/127271.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot2 集成测试组件的七种方法
    目录一、背景描述 二、PostMan工具 三、Swagger文档 四、TestRestTemplate类 五、Http请求模式 六、Service层测试 七、MockMvc方式 八、...
    99+
    2024-04-02
  • spring boot集成测试的方法
    这篇文章主要介绍“spring boot集成测试的方法”,在日常操作中,相信很多人在spring boot集成测试的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spri...
    99+
    2024-04-02
  • asp.net core 使用 TestServer 来做集成测试的方法
    Intro 之前我的项目里的集成测试是随机一个端口,每次都真实的启动一个 WebServer,之前也有看到过微软文档上 TestServer 的介绍,当时没仔细看过以为差不多就...
    99+
    2022-06-07
    net ASP.NET 集成测试 方法 core 测试 ASP
  • 详解Vue3的七种组件通信方式
    目录写在前面举一个栗子Props方式emit方式v-model方式refs方式provide/inject方式事件总线状态管理工具写在前面 本篇文章是全部采用的<script ...
    99+
    2024-04-02
  • 软件测试中服务器稳定性测试几种方法
    服务器稳定性是最重要的,如果在稳定性方面不能够保证业务运行的需要,再高的性能也是无用的。正规的服务器厂商都会对产品进行不同温度和湿度下的运行稳定性测试。重点要考虑的是冗余功能,如:数据冗余、网卡冗余、电源冗余、风扇冗余等。一些服务器稳定性测...
    99+
    2023-06-05
  • Springboot2 集成 druid 加密数据库密码的配置方法
    一:环境 springboot 2.x druid 1.1.21 二:druid加密数据库密码 本地下载druid-1.1.21.jar包,运行cmd,输入命令 java -cp...
    99+
    2024-04-02
  • Postman测试报告的生成方法
    目录1.安装node.js2.安装newman3.控制台生成测试报告4.生成HTML的测试报告    5.输出htmlextra报告我们使用工具newman就可以生成测试报告(自动化...
    99+
    2024-04-02
  • Oracle安装成功后的测试方法
    Oracle是一款功能强大的数据库管理系统,它可以帮助用户存储和管理大量数据。成功安装Oracle后,为了确保系统能够正常运行,我们需要测试一些基本的功能。下面将介绍一些测试方法,并提...
    99+
    2024-03-07
    验证数据库连接 运行示例查询 测试数据库性能
  • Spring集成MongoDB的两种方法实例
    目录前言一、准备工作1、工程生成2、配置项二、使用MongoTemplate1、创建实体UserInfo2、定义接口3、接口实现4、定义调用controller5、结果三、使用Mon...
    99+
    2024-04-02
  • Java读取Properties文件的七种方法的总结
    Java读取Properties文件的方法总结         读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法...
    99+
    2023-05-31
    java properties 七种
  • .NETCore单元测试的两种方法介绍
    应用程序测试的类型很多,包括集成测试,Web 测试,负载测试等。在最底层的是单元测试,此测试可以测试单个软件组件或方法。单元测试一般只测试开发人员的代码,不应该测试基础结构普、问题,...
    99+
    2024-04-02
  • GitLab的自动测试和自动化测试报告生成方法
    GitLab的自动测试和自动化测试报告生成方法,需要具体代码示例随着软件开发项目的不断增加,测试变得越来越重要,而自动化测试成为了一种必不可少的手段。GitLab作为一个流行的代码托管平台,提供了许多工具和功能来支持自动测试和自动化测试报告...
    99+
    2023-10-22
    gitlab 自动测试 自动化测试报告
  • redis集群性能测试的方法是什么
    进行Redis集群性能测试的一种常用方法是使用基准测试工具,如redis-benchmark。以下是一些步骤,可以用来进行Redis...
    99+
    2024-04-09
    redis
  • Quartz与Spring集成的两种方法示例
    目录Quartz与Spring集成方式:1.MethodInvokeJobDetailFactoryBean2.JobDetailBean3.两种集成方式的简单说明Quartz与Sp...
    99+
    2024-04-02
  • SpringBoot2异常处理与web原生组件注入的方法
    这篇文章主要介绍“SpringBoot2异常处理与web原生组件注入的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot2异常处理与web原生组件注入的方法”文章能帮助大家解决问...
    99+
    2023-06-29
  • SpringMVC集成redis配置的多种实现方法
    第一步:下载并安装Redis(网上已经有很多安装教程在此不细讲了) 第二步:pom文件引入jar包 在此需要注意Redis和jedis连接工厂版本 redsi:https://mvn...
    99+
    2024-04-02
  • Shell动态生成数组的多种方法
    如果对linux shell 数组不是很熟悉的话,请看上一篇文章:linux shell 数组建立及使用技巧 ,这篇文章主要讲是动态生成数组系列。方法应该很多,我这里主要以一个求和计算的题目为例进行分析。...
    99+
    2022-06-04
    数组 多种 方法
  • JavaScript判断数组成员的几种方法
    目录indexOf()incudes()find()与findIndex()find()findIndex()对于NaN值最后前言: 在开发中经常需要我们在数组中查找元素又或者是判断...
    99+
    2022-11-13
    JavaScript判断数组成员方法 JavaScript判断数组成员
  • react组件传值的四种方法
    目录1、父向子传值2、子向父传值3、非父子传值4、Context 方法 传值 【类似vue的 provide / inject】1、父向子传值 父组件 classAppextends...
    99+
    2023-05-18
    react组件传值 react 传值
  • Pytest生成HTML测试报告及优化的方法
    这篇文章主要介绍了Pytest生成HTML测试报告及优化的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pytest生成HTML测试报告及优化的方法文章都会有所收获,下面我们一起来看看吧。一、安装插件  要...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作