一、前言知識
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 {@Autowiredprivate UserController userController;@Testpublic 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
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;@Autowiredprivate 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);}
}
四、小結?
? ? ? ? ? 單元測試的實質就是通過加入測試工具依賴,然后使用注釋和斷言來配合驗證不同取值下功能模塊的輸出結果與預期結果是否一致。
?