单元测试实施方案
單元測(cè)試實(shí)施方案
1.關(guān)于單元測(cè)試
? 單元測(cè)試實(shí)施在軟件生命周期中的早期,是最小的測(cè)試單元,開發(fā)人員可以獨(dú)立的編寫單元測(cè)試(隔離性),可以在早期就發(fā)現(xiàn)軟件的問題并修復(fù)。
? 單元測(cè)試的三個(gè)階段:
1. 按功能編寫單元測(cè)試 2. 驗(yàn)證并修復(fù) 3. 完成單元測(cè)試編寫單元測(cè)試時(shí)需要注意的地方:
相關(guān)文檔:
1.https://www.testingxperts.com/blog/unit-testing
? 2. http://fluxens.com/unittesting.html
2.單元測(cè)試要求
準(zhǔn)則:1. Automatic(自動(dòng)化)2.Independent(獨(dú)立性)3.Repeatable(可重復(fù))
結(jié)構(gòu):測(cè)試代碼放在src/test目錄下,各個(gè)模塊分子包,測(cè)試類以Test結(jié)尾,方法以test開頭。
編碼:
1).BCDE原則:
B:Border,邊界值測(cè)試,包括循環(huán)邊界、特殊取值、特殊時(shí)間點(diǎn)、數(shù)據(jù)順序等。
C:Correct,正確的輸入,并得到預(yù)期的結(jié)果。
D:Design,與設(shè)計(jì)文檔相結(jié)合,來編寫單元測(cè)試。
E:Error,強(qiáng)制錯(cuò)誤信息輸入(如:非法數(shù)據(jù)、異常流程、非業(yè)務(wù)允許輸入等),并得到預(yù)期的結(jié)果。
2). 涉及到外部接口、第三方模塊使用mock模擬
3).使用斷言確認(rèn)執(zhí)行結(jié)果
維度:
1).接口功能性測(cè)試
接口功能的正確性,即保證接口能夠被正常調(diào)用,并輸出有效數(shù)據(jù)!
------------------> 是否被順利調(diào)用
------------------> 參數(shù)是否符合預(yù)期
2).局部數(shù)據(jù)結(jié)構(gòu)測(cè)試
保證數(shù)據(jù)結(jié)構(gòu)的正確性
------------------> 變量是否有初始值或在某場(chǎng)景下是否有默認(rèn)值
------------------> 變量是否溢出
3).邊界條件測(cè)試
------------------> 變量無賦值(null)
------------------> 變量是數(shù)值或字符
------------------> 主要邊界:最大值,最小值,無窮大
------------------> 溢出邊界:在邊界外面取值+/-1
------------------> 臨近邊界:在邊界值之內(nèi)取值+/-1
------------------> 字符串的邊界,引用 "變量字符"的邊界
------------------> 字符串的設(shè)置,空字符串
------------------> 字符串的應(yīng)用長(zhǎng)度測(cè)試
------------------> 空白集合
------------------> 目標(biāo)集合的類型和應(yīng)用邊界
------------------> 集合的次序
------------------> 變量是規(guī)律的,測(cè)試無窮大的極限,無窮小的極限
4).所有獨(dú)立代碼測(cè)試
保證每一句代碼,所有分支都測(cè)試完成,主要包括代碼覆蓋率,異常處理通路測(cè)試
------------------> 語句覆蓋率:每個(gè)語句都執(zhí)行到了
------------------> 判定覆蓋率:每個(gè)分支都執(zhí)行到了
------------------> 條件覆蓋率:每個(gè)條件都返回布爾
------------------> 路徑覆蓋率:每個(gè)路徑都覆蓋到了
5).異常模塊測(cè)試
后續(xù)處理模塊測(cè)試:是否包閉當(dāng)前異?;蛘邔?duì)異常形成消化,是否影響結(jié)果!
目標(biāo):
語句覆蓋>= 70%
分支覆蓋 100%
函數(shù)覆蓋 100%
行覆蓋 >= 80%
3.測(cè)試方案
使用 spring-boot-starter-test 、 database-rider 、 H2 內(nèi)存數(shù)據(jù)庫
測(cè)試范圍: WEB、DAL、BIZ
測(cè)試步驟:
1.準(zhǔn)備數(shù)據(jù)、行為
測(cè)試示例
1).WEB
// 測(cè)試類 @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ActiveProfiles("local") @AutoConfigureMockMvc public class ControllerTest {//需要mock的bean@MockBeanprivate Service service;@Autowiredprivate MockMvc mockMvc;@Testpublic void testWork() throws Exception {// 添加依賴類的行為when(service.work()).thenReturn("work");String resultStr = this.mockMvc.perform(MockMvcRequestBuilders.get("/work")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().getResponse().getContentAsString();Assertions.assertEquals("work", resultStr);} }// controller @RestController public class Controller {@Autowiredprivate Service service;@GetMapping("/work")public String work(){return service.work();} }接口測(cè)試:使用 MockMvc 測(cè)試web層Api, MockMvc 提供了豐富的方法用去發(fā)起http請(qǐng)求
準(zhǔn)備數(shù)據(jù)和行為:web層依賴于service層 需要mock service,所以需要使用 @MockBean 注解標(biāo)注service,在具體的測(cè)試方法里為service添加行為
注意:依賴的bean可以使用 MockBean 或 SpyBean ,SpyBean和MockBean是spring-boot-test包所提供的兩個(gè)注解,用于Spy或Mock Spring容器所管理的實(shí)例。而Spy與Mock的方式正好相反,spy默認(rèn)所有方法均真實(shí)調(diào)用,Mock默認(rèn)所有方法均調(diào)用mock的實(shí)現(xiàn).兩者都可以為類添加指定行為,依賴的類為外部接口、redis等使用 MockBean ,為內(nèi)部實(shí)現(xiàn)是更具需求使用。
2).BIZ
@RunWith(SpringRunner.class) @SpringBootTest @ActiveProfiles("local") public class serviceTest {// mock的類,可為其添加行為@MockBeanprivate Dao dao;// 待測(cè)試的類@Autowiredprivate Service service;@Testpublic void testWork() {// 為mock類添加行為doReturn("work").when(dao).work();Assertions.assertEquals("work", service.work());} }與WEB類似, 直接調(diào)用待測(cè)試方法驗(yàn)證即可.
3)DAL
DAL測(cè)試依賴于H2內(nèi)存數(shù)據(jù)庫和 DBRider(為數(shù)據(jù)庫測(cè)試提供數(shù)據(jù)打樁)
1加入依賴:
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.4.195</version><scope>test</scope> </dependency><dependency><groupId>com.github.database-rider</groupId><artifactId>rider-spring</artifactId><version>1.21.0</version><scope>test</scope> </dependency>2添加H2配置(在測(cè)試的包目錄中)
public class H2Config {@Beanpublic DataSource h2DataSource() {EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();return builder.setType(EmbeddedDatabaseType.H2).addScript("classpath:db/schema.sql").addScript("classpath:db/data.sql").build();} }resources/db/schema.sql 文件存放一些建表語句
resources/db/data.sql 文件存放一些初始化數(shù)據(jù)語句
3測(cè)試代碼
resources 目錄下有setUp.yml
user:- id: 1name: "@realpestano"- id: 2name: "wy"- id: 3name: "wy1"- id: 4name: "wy2" // 測(cè)試類 @RunWith(SpringRunner.class) @SpringBootTest @DBRider @Import(H2Config.class) public class DaoTest {@Autowiredprivate Dao dao;@DataSet(value = "setUp.yml", cleanAfter = true)@Testpublic void testQuery() {Integer count = dao.queryCount();Assertions.assertEquals(4, count);} }// dao @Repository public class Dao {@Autowiredprivate JdbcTemplate jdbcTemplate;public Integer queryCount() {return jdbcTemplate.queryForObject("select count(*) from user", Integer.class);} }測(cè)試方法 @DBRider 開啟DBRider 特性
測(cè)試方法上 @DataSet 用來指定測(cè)試需要的數(shù)據(jù),setUp.yml 里記錄了一些和實(shí)體類對(duì)于的數(shù)據(jù)。
通過內(nèi)存數(shù)據(jù)庫和DBRider 提供的特性進(jìn)行DAL層測(cè)試。
相關(guān)資料:
DBRider 文檔:https://github.com/database-rider/database-rider#spring
Mockito文檔:https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html
SpringBoot test 文檔:https://docs.spring.io/spring-boot/docs/2.1.2.RELEASE/reference/htmlsingle/#boot-features-testing
總結(jié)
- 上一篇: JS编程输出我国古代数学家张丘建在《张丘
- 下一篇: 多重中断的处理及其中断源屏蔽字