如何编写单元测试

一、前言知识

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

    }
}

四、小结

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

相关推荐
川石课堂软件测试1 天前
涨薪技术|0到1学会性能测试第9课-HTTP响应统计
数据库·功能测试·网络协议·http·kubernetes·单元测试·测试用例
我命由我123452 天前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
神一样的老师5 天前
WS63 嵌入式 SSD1306 OLED 驱动单元测试实战
单元测试·log4j
CesareCheung5 天前
高级软件测试工程师面试锦集
面试·单元测试·压力测试
2501_915918416 天前
在 Xcode 中运行和调试单元测试的完整指南
ide·vscode·macos·ios·单元测试·个人开发·xcode
极小狐7 天前
MR 里测试摘要空白、覆盖率不显示?JUnit 与覆盖率配置 9 步排查
数据库·ci/cd·junit·单元测试·mr·devops·代码覆盖率
toooooop87 天前
FastAdmin(ThinkPHP 5.0)单元测试实践:从零到跑通
单元测试·fastadmin
silvamux_7 天前
大模型 API 单元测试怎么 mock 不误伤
单元测试·log4j·php
Helix2507 天前
Python单元测试实战:pytest框架从入门到企业级测试体系搭建指南
python·单元测试·实战·mock·pytest·测试覆盖率·fixture
2302_805771079 天前
Day24:DDT+EXCEL数据驱动
功能测试·单元测试·自动化·测试用例·需求分析·web自动化