TDD的简述及环境配置
TDD的简述及环境配置
描述
- TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程
优点
- 写出来的代码bug会比较少
缺点
- 测试代码几乎是开发代码的一到两倍之多
配置环境
- 在测试类上添加@RunWith和@SpringBootTest注解
- @RunWith(SpringRunner.class)
- 用SpringRunner来运行
- @SpringBootTest(classes = net.seehope.security.demo.DemoApplication.class)
- 对项目进行单元测试
- 代码
-
@RunWith(SpringRunner.class) @SpringBootTest(classes = net.seehope.security.demo.DemoApplication.class)
- @RunWith(SpringRunner.class)
- 测试类中注入WebApplicationContext类
- 什么是WebApplicationContext
- WebApplicationContext,是继承于ApplicationContext的一个接口,扩展了ApplicationContext,是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化。
- 作用
- 从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文
- 代码
-
@Autowired private WebApplicationContext context;
- 什么是WebApplicationContext
- 引入MockMvc类
- 为何使用MockMvc?
- 对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入了MockMVC。
- MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
- 代码
-
private MockMvc mockMvc;
- 为何使用MockMvc?
- 在测试类的前置通知里用
MockMvcBuilders.webAppContextSetup(context).build();
构建MockMvc
- 代码
-
@Before public void setUp(){ mockMvc= MockMvcBuilders.webAppContextSetup(context).build(); }
编写测试方法
- 在方法头部添加@Test注解
- 输入测试API
- 指定数据格式(dataType)
- 传入参数
- 规定响应数据的结果
- 代码如下
-
@Test public void whenQueryAllUserSuccess() throws Exception { //输入测试API String result=mockMvc.perform(MockMvcRequestBuilders.get("/test/getUser") //MediaType指的是要传递的数据的MIME类型,MediaType对象包含了三种信息:type 、subtype以及charset .contentType(MediaType.parseMediaType("application/json")) //向API传入变量 .param("username","wxb") .param("password","asd") ) //规定响应数据的结果 .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(5)) .andExpect(MockMvcResultMatchers.jsonPath("$[0].username").value("username0")) .andReturn().getResponse().getContentAsString(); //输出测试结果 System.out.println(result); }