[springboot一本通]-2(2),2024年最新某大厂开发者对于软件测试多线程的总结

换一种写法:看看有没有什么区别。在测试类上面额外加上这样两个注解,并且mockMvc对象使用@Resource自动注入,删掉Before注解及setUp函数。

@AutoConfigureMockMvc

@SpringBootTest

@ExtendWith(SpringExtension.class)

在这里插入图片描述

启动测试一下,看看和之前有没有什么区别.

在这里插入图片描述

看到上面这个截图,是不是已经明白了!该测试方法真实的启动了一个tomcat容器、以及Spring 上下文,所以我们可以进行依赖注入(@Resource)。实现的效果和使用MockMvcBuilders构建MockMVC对象的效果是一样的,但是有一个非常明显的缺点:每次做一个接口测试,都会真实的启动一次servlet容器,Spring上下文加载项目里面定义的所有的Bean,导致执行过程很缓慢。

2.1 @SpringBootTest 注解

是用来创建Spring的上下文ApplicationContext,保证测试在上下文环境里运行。单独使用@SpringBootTest不会启动servlet容器。所以只是使用SpringBootTest 注解,不可以使用@Resource和@Autowired等注解进行bean的依赖注入。(准确的说是可以使用,但被注解的bean为null)。

2.2 @ExtendWith(@RunWith注解)

  • RunWith方法为我们构造了一个的Servlet容器运行运行环境,并在此环境下测试。然而为什么要构建servlet容器?因为使用了依赖注入,注入了MockMvc对象,而在上一个例子里面是我们自己new的。

  • 而@AutoConfigureMockMvc注解,该注解表示mockMvc对象由spring 依赖注入构建,你只负责使用就可以了。这种写法是为了让测试在servlet容器环境下执行。

简单的说:如果你单元测试代码使用了“依赖注入@Resource”就必须加上@ExtendWith,如果你不是手动new MockMvc对象就加上@AutoConfigureMockMvc

实际上@SpringBootTest 注解注解已经包含了 @ExtendWith注解,如果使用了前者,可以忽略后者!

2.3 @Transactional

该注解加在方法上可以使单元测试进行事务回滚,以保证数据库表中没有因测试造成的垃圾数据,因此保证单元测试可以反复执行;

但是笔者不建议这么做,使用该注解会破坏测试真实性。请参考这篇文章详细理解:

不要在 Spring Boot 集成测试中使用 @Transactional

三、Mock测试


3.1什么是Mock?

在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象。比如:对象B依赖于对象A,但是A代码还没写是一个空类空方法不能用,我们来mock一个假的A来完成测试。

3.2 为什么要使用Mock?

在这里插入图片描述

在单元测试中,模拟对象可以模拟复杂的、真实的对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。

在下面的情形,可能需要使用 “模拟对象行为” 来代替真实对象:

  • 真实对象的行为是不确定的(例如,当前的时间或当前的温度);

  • 真实对象很难搭建起来;

  • 真实对象的行为很难触发(例如,网络错误);

  • 真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);

  • 真实的对象是用户界面,或包括用户界面在内;

  • 真实的对象使用了回调机制;

  • 真实对象可能还不存在(例如,其他程序员还为完成工作);

  • 真实对象可能包含不能用作测试的信息(高度保密信息等)和方法。

3.3.场景实践

我们的保存文章的Controller方法,调用ArticleService的saveArticle进行文章的保存。

在这里插入图片描述

但是因为种种原因,这个接口目前没能实现(只有接口,代码如下)。比如说:另一个程序员暂时没完成工作,或者是机密内容实现,不能被用于测试环境。

public interface ArticleService {

public String saveArticle(Article article);

}

但是现在接口调用方找到我了,需要进行接口验证。怎么办?我们就可以使用Mock的方法,先Mock一个假的ArticleService,把接口验证完成。

@Slf4j

@AutoConfigureMockMvc

@SpringBootTest

@ExtendWith(SpringExtension.class)

public class ArticleRestControllerTest3 {

//mock对象

@Resource

private MockMvc mockMvc;

@MockBean

private ArticleService articleService;

//测试方法

@Test

public void saveArticle() throws Exception {

String article = “{\n” +

" “id”: 1,\n" +

" “author”: “zimug”,\n" +

" “title”: “手摸手教你开发spring boot”,\n" +

" “content”: “c”,\n" +

" “createTime”: “2017-07-16 05:23:34”,\n" +

" “reader”:[{“name”:“zimug”,“age”:18},{“name”:“kobe”,“age”:37}]\n" +

“}”;

ObjectMapper objectMapper = new ObjectMapper();

Article articleObj = objectMapper.readValue(article,Article.class);

//打桩

when(articleService.saveArticle(articleObj)).thenReturn(“ok”);

MvcResult result = mockMvc.perform(

MockMvcRequestBuilders.request(HttpMethod.POST, “/rest/articles”)

.contentType(“application/json”).content(article))

.andExpect(MockMvcResultMatchers.jsonPath(“$.data”).value(“ok”))

.andDo(print())

.andReturn();

result.getResponse().setCharacterEncoding(“UTF-8”);

log.info(result.getResponse().getContentAsString());

}

}

@MockBean

可以用MockBean伪造模拟一个Service ,如上图中的MockBean。

大家注意上文代码中,打了一个桩

when(articleService.saveArticle(articleObj)).thenReturn(“ok”);

也就是告诉测试用例程序,当你调用articleService.saveArticle(articleObj)方法的时候,不要去真的调用这个方法,直接返回一个结果(“ok”)就好了。

.andExpect(MockMvcResultMatchers.jsonPath(“$.data”).value(“ok”))

测试用例跑通了,期望结果andExpect:ok与实际结果thenReturn(“ok”)一致。表示程序真正的去执行了MockBean的模拟行为,而不是调用真实对象的方法。

四、轻量级测试


在ExtendWith的AutoConfigureMockMvc注解的共同作用下,启动了SpringMVC的运行容器,并且把项目中所有的@Bean全部都注入进来。把所有的bean都注入进来是不是很臃肿?这样会拖慢单元测试的效率。如果我只是想测试一下控制层Controller,怎么办?或者说我只想具体到测试一下ArticleRestController,怎么办?要把应用中所有的bean都注入么?有没有轻量级的解决方案?一定是有的。

@ExtendWith(SpringExtension.class)

@WebMvcTest(ArticleController.class)

//@SpringBootTest

使用@WebMvcTest替换@SpringBootTest

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-yFPCC5ub-1712722972559)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值