日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单元测试实施方案

發(fā)布時(shí)間:2023/12/31 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单元测试实施方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

單元測(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í)需要注意的地方:

  • 每個(gè)單元測(cè)試都應(yīng)該相互獨(dú)立,是最小的測(cè)試單元,只測(cè)試public API
  • 需要測(cè)試的功能只被測(cè)試一次
  • 分三類用例:正常用例,邊界用例,錯(cuò)誤用例
  • 不依賴特定的環(huán)境(Jdbc、mq、redis、外部接口,使用mock)
  • 具有可讀性
  • 和生產(chǎn)環(huán)境代碼分開
  • 及時(shí)的修復(fù)
  • 相關(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è)試目標(biāo)模塊
  • 驗(yàn)證測(cè)試結(jié)果
  • 測(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é)

    以上是生活随笔為你收集整理的单元测试实施方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲自拍图片 | 国产chinese中国hdxxxx | 国产一区二区成人 | 亚洲精品久久久狠狠狠爱 | 男女透逼视频 | 美美女高清毛片视频免费观看 | 亚洲AV综合色区无码国产播放 | 激情超碰在线 | 97在线精品 | 久久影视一区二区 | 成人在线观看国产 | 国产福利精品在线 | 黄色av观看| 中文在线字幕免费观 | 91九色在线播放 | 波多野结衣二区三区 | 欧美激情一区二区三区四区 | 亚洲天堂自拍 | 国产午夜精品久久久久久久 | 日本视频www色 | 久久看片 | 一区二区三区四区在线 | 日韩电影一区二区三区四区 | 免费观看国产视频 | 日韩高清中文字幕 | 视频在线观看一区二区三区 | 欧美伦理一区二区三区 | 稀缺呦国内精品呦 | 欧日韩不卡在线视频 | 杨幂国产精品一区二区 | julia中文字幕在线 | 欧美大屁股熟妇bbbbbb | 99久久夜色精品国产亚洲 | 欧美v亚洲 | 91狠狠综合| 亚洲av无码一区二区二三区软件 | 欧美热热 | 中文字幕第18页 | www.狠狠| 亚洲日批视频 | 久久亚洲精华国产精华液 | 亚洲男人的天堂在线视频 | www.色悠悠 | 日韩精品在线第一页 | 超碰在线最新地址 | 成人精品网址 | 末路1997全集免费观看完整版 | 国产欧美又粗又猛又爽 | av涩涩| 日韩在线观看网址 | 999国内精品永久免费视频 | 日本精品一区二区在线观看 | 欧美在线观看视频一区 | 天天操天天舔天天干 | 天堂中文在线视频 | 国产ts人妖调教重口男 | 久久久久久久久久久久97 | 日本免费三级网站 | 久久天天东北熟女毛茸茸 | 日本视频久久 | 欧美在线日韩 | 国产在线视频资源 | 日本视频免费在线 | 久久三级网 | 秋霞亚洲 | 农村妇女毛片精品久久久 | 亚洲欧美激情小说另类 | 亚洲视屏一区 | 本站只有精品 | 亚洲精品福利在线观看 | 亚洲一区欧美日韩 | 一区二区三区黄 | 动漫一区二区三区 | 91欧美成人 | 亚洲一区二区久久 | 精品国产一区二区三区久久久蜜月 | 蜜桃视频一区二区三区在线观看 | 欧美老女人bb | 国产无套精品 | 99国产精品免费 | 黄色一级大片在线免费看国产 | 午夜视频在线免费播放 | 日本一区二区三区视频在线 | 亚洲精品在线中文字幕 | 天天干狠狠插 | 少妇的性事hd | julia一区| 99re在线国产 | 91av入口| 日韩av午夜 | 奇米综合网 | 欧美精品播放 | 99亚洲精品| 肉丝肉足丝袜一区二区三区 | 国外成人免费视频 | 日韩免费av一区 | 一级黄在线观看 | 奇米99| 99国产一区|