如何编写单元测试

一、前言知识

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);

    }
}

四、小结

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

相关推荐
卓码软件测评7 小时前
第三方软件测试机构【Gatling源码的本地编译构建方法】
测试工具·性能优化·单元测试·测试用例
哈哈~haha9 小时前
UI5_Walkthrough_Step 27: Unit Test with QUnit 单元测试QUnit
单元测试·qunit
汽车仪器仪表相关领域13 小时前
ZDT-III 通用电机测试系统
数据库·算法·单元测试·压力测试·可用性测试
凌乱风雨121114 小时前
Java单元测试、集成测试,区别
java·单元测试·集成测试
0和1的舞者1 天前
《软件测试分类指南:8 大维度 + 核心要点梳理》
java·软件测试·单元测试·测试·黑盒测试·白盒测试·测试分类
卓码软件测评1 天前
CMA/CNAS软件测评机构:【Gatling XPath检查:XPath语法在XML响应中的应用】
测试工具·单元测试·测试用例
汽车仪器仪表相关领域2 天前
ZRT-I 精密减速器测试系统
大数据·运维·功能测试·安全·单元测试·负载均衡·压力测试
川石课堂软件测试2 天前
软件测试的白盒测试(二)之单元测试环境
开发语言·数据库·redis·功能测试·缓存·单元测试·log4j
renke33642 天前
Flutter 2025 测试工程体系:从单元测试到混沌演练,构建高可靠、可验证、自动化的质量保障闭环
flutter·单元测试·自动化
卓码软件测评2 天前
软件测试:如何在Postman中配置和自动化OAuth 2.0与JWT认证?
测试工具·单元测试·自动化·测试用例·postman·可用性测试