如何编写单元测试

一、前言知识

1.开发过程

需求分析->设计->开发->测试->上线

2.测试种类

单元测试(测试模块编码)、黑盒测试(测试功能是否满足需求)、白盒测试(测试程序内部的逻辑结构)、回归测试(提出的缺陷进行二次验证)、集成测试(测试主要的业务功能及模块间的整合性)、系统测试(测试整个产品系统)

二、单元测试的使用

1.引入相关依赖

复制代码
<!-- 单元测试的依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

2.编写单元测试方法

断言:判断程序结果是否符合预期 TestCase.assertXXX

复制代码
package net.xdclass.demoproject;


import junit.framework.TestCase;
import net.xdclass.demoproject.domain.Video;
import net.xdclass.demoproject.service.VideoService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.nio.charset.Charset;
import java.util.List;

//1.配置
@RunWith(SpringRunner.class)  //底层用junit  SpringJUnit4ClassRunner
@SpringBootTest(classes={DemoProjectApplication.class})//启动整个springboot工程
@AutoConfigureMockMvc
public class VideoTest {


    @Autowired//会自动将VideoService对象注入到VideoTest对象中,相当于new VideoService()
    private VideoService videoService;


//2.常用注解的使用
    @Before//在测试用例执行前执行
    public void testOne(){

        System.out.println("这个是测试 before");
    }



    @Test//测试用例
    public void testVideoList(){

        List<Video> videoList = videoService.listVideo();

 //判断videoList的大小是否大于0,如果大于0,则测试通过,如果小于0,则测试失败
        TestCase.assertTrue(videoList.size()>0);

    }

    @After//在测试用例执行后执行
    public void testThree(){

        System.out.println("这个是测试 after");
    }

}

三、单元测试的应用

1.测试controller层登录方法

UserTest

复制代码
package net.xdclass.demoproject;


import junit.framework.TestCase;
import net.xdclass.demoproject.controller.UserController;
import net.xdclass.demoproject.domain.User;
import net.xdclass.demoproject.utils.JsonData;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)  //底层用junit  SpringJUnit4ClassRunner
@SpringBootTest(classes={DemoProjectApplication.class})//启动整个springboot工程
public class UserTest {

    @Autowired
    private UserController userController;

    @Test
    public void loginTest(){

        //模拟前端传递过来的参数
        User user = new User();
        user.setUsername("jack");
        user.setPwd("1234");

        //调用controller的login方法
        JsonData jsonData  = userController.login(user);

        //打印返回的json数据
        System.out.println(jsonData.toString());

        //断言
        TestCase.assertEquals(0,jsonData.getCode());

    }
}

2.测试service层视频列表

VideoTest

复制代码
package net.xdclass.demoproject;


import junit.framework.TestCase;
import net.xdclass.demoproject.domain.Video;
import net.xdclass.demoproject.service.VideoService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.nio.charset.Charset;
import java.util.List;

@RunWith(SpringRunner.class)  //底层用junit  SpringJUnit4ClassRunner
@SpringBootTest(classes={DemoProjectApplication.class})//启动整个springboot工程
public class VideoTest {

    @Autowired//会自动将VideoService对象注入到VideoTest对象中,相当于new VideoService()
    private VideoService videoService;


    @Test//测试用例
    public void testVideoList(){

        List<Video> videoList = videoService.listVideo();

        //判断videoList的大小是否大于0,如果大于0,则测试通过,如果小于0,则测试失败
        TestCase.assertTrue(videoList.size()>0);

    }

}

3.测试对外提供的接口

VideoTest

java 复制代码
package net.xdclass.demoproject;


import junit.framework.TestCase;
import net.xdclass.demoproject.domain.Video;
import net.xdclass.demoproject.service.VideoService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.nio.charset.Charset;
import java.util.List;

@RunWith(SpringRunner.class)  //底层用junit  SpringJUnit4ClassRunner
@SpringBootTest(classes={DemoProjectApplication.class})//启动整个springboot工程
@AutoConfigureMockMvc//自动注入MockMvc对象,用于模拟请求
public class VideoTest {


    @Autowired//会自动将VideoService对象注入到VideoTest对象中,相当于new VideoService()
    private VideoService videoService;

    @Autowired
    private MockMvc mockMvc;//模拟请求


    @Test//测试用例
    public void testVideoListApi()throws Exception{

        //模拟请求:会返回一个MvcResult对象,里面包含了响应的状态码,响应的内容
       MvcResult mvcResult =  mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/pub/video/list"))//访问接口的地址
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

       int status = mvcResult.getResponse().getStatus();//获取响应的状态码

       System.out.println(status);

               // 使用下面这个,增加编码说明,就不会乱码打印
        String result = mvcResult.getResponse().getContentAsString(Charset.forName("utf-8"));

       System.out.println(result);

    }
}

四、小结

单元测试的实质就是通过加入测试工具依赖,然后使用注释和断言来配合验证不同取值下功能模块的输出结果与预期结果是否一致。

相关推荐
旦莫18 小时前
Pytest教程:为什么Pytest要用插件模式?
python·单元测试·自动化·pytest
悟能不能悟2 天前
如何提高单元测试的覆盖率
单元测试
xixixiLucky2 天前
mockMvc构建web单元测试学习笔记
单元测试
世界的尽头在哪里3 天前
python测试框架之pytest
开发语言·python·测试工具·单元测试·pytest
一只鹿鹿鹿3 天前
【测试文档】项目测试文档,测试管理规程,测试计划,测试文档模版,软件测试报告书(Word)
数据库·后端·spring·单元测试
anyup_前端梦工厂3 天前
前端单元测试实战:如何开始?
前端·单元测试
Ser@phIn@4 天前
第三章 单元测试
单元测试·软件工程
惊讶的猫4 天前
单元测试的一般步骤
单元测试
悟能不能悟4 天前
什么是单元测试的“覆盖率”
单元测试
行动π技术博客4 天前
基于大语言模型的自动化单元测试生成系统及测试套件评估方法
语言模型·单元测试·自动化