由于現(xiàn)在前端涉及的東西越來越多,也越來越復(fù)雜,就對我們前端工程化能力提出了更高的要求。
好的前端工程化一般包括三個(gè)大的方面:
. 前端(自動化)測試(前提條件)
. 高質(zhì)量的代碼設(shè)計(jì)
. 高質(zhì)量的代碼實(shí)現(xiàn)
如果要想保證后兩個(gè) “高質(zhì)量的代碼設(shè)計(jì)” 和 “高質(zhì)量的代碼實(shí)現(xiàn)”,就必須要有前端自動化測試。
一、測試包括
=> 單元測試
單元測試,調(diào)用被測試的類或方法,根據(jù)類或方法的參數(shù),傳入相應(yīng)的數(shù)據(jù)。然后,得到一個(gè)返回結(jié)果。最終斷言返回的結(jié)果是否等于預(yù)期結(jié)果。如果相等,測試通過;如果不相等,測試失敗。所以,這里單元測試關(guān)注的是代碼的實(shí)現(xiàn)與邏輯。
=> 接口測試
接口測試,根據(jù)接口文檔,到底是傳get請求呢?還是post請呢?調(diào)用被測試的接口,構(gòu)造相應(yīng)的數(shù)據(jù)(id=1,name=‘xiaoming’),得到返回值,是200成功,并返回查詢結(jié)果。還是10021,用戶名不能為空。不管輸入的參數(shù)是怎樣的,我們都將得到一個(gè)結(jié)果。最終斷言返回的結(jié)果是否等于預(yù)期結(jié)果。如果相等,測試通過;如果不相等,測試失敗。所以,接口測試關(guān)注的是數(shù)據(jù)。只要數(shù)據(jù)正確了,功能就做成大半,剩下的無非是如何把這些數(shù)據(jù)展示在頁面上。
=> web測試
web測試更貼近用戶的行為,模擬用戶點(diǎn)擊了某個(gè)按鈕,向個(gè)輸入框里輸入了什么。用戶可以看到登錄成功了,但web自動化測試并不知道它剛才的點(diǎn)擊有沒有生效。所以,要找“證據(jù)”,比如,登錄成功后頁面右上角會顯示“歡迎,xxx”。這就是登錄成功的有力“證據(jù)”。于是,當(dāng)web自動化測試登錄成功后,就去獲取這個(gè)數(shù)據(jù)進(jìn)行斷言。斷言如果相等,測試通過;如果不相等,測試失敗。所以,web測試關(guān)注點(diǎn)是用戶操作行為,頁面上真正的按鈕和輸入框是否可用。
二、單元測試的定義
單元測試(unit testing),是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證。
在前端就是指一個(gè)模塊,并且在前端最小必須是一個(gè)模塊,如果不是模塊就沒有辦法導(dǎo)出,就無法進(jìn)行測試。
什么時(shí)候進(jìn)行單元測試:程序員們對自己開發(fā)的每個(gè)功能進(jìn)行單元測試。
單元測試對應(yīng)的集成測試。
集成測試:又叫組裝測試或者聯(lián)合測試。 在做完單元測試的基礎(chǔ)上還要做一個(gè)集成測試,對幾個(gè)相關(guān)聯(lián)功能點(diǎn)一起測試,不僅限于一個(gè)模塊。或者將所有模塊按照設(shè)計(jì)要求組裝成一個(gè)子系統(tǒng)或者完整的系統(tǒng)進(jìn)行集成測試。
什么時(shí)候進(jìn)行集成測試:代碼和團(tuán)隊(duì)合并后,把整個(gè)代碼進(jìn)行集成測試,或者在項(xiàng)目要“竣工”的時(shí)候,就要進(jìn)行集成測試。
三、單元測試的目的
1)驗(yàn)證代碼與設(shè)計(jì)相符合
2)跟蹤需求和設(shè)計(jì)的實(shí)現(xiàn)
3)發(fā)現(xiàn)設(shè)計(jì)和需求中存在的錯(cuò)誤
4)發(fā)現(xiàn)編碼過程中引入的錯(cuò)誤
四、單元測試工作原理
測試是如何進(jìn)行的:編寫測試用例,測試用例當(dāng)中最主要的是測試步驟和預(yù)期結(jié)果;測試人員根據(jù)測試用例執(zhí)行操作步驟,然后通過眼睛和思考判斷實(shí)際結(jié)果與預(yù)期結(jié)果是否相等。如果相等,測試通過;如果不相等,測試失敗。
手工測試與自動化測:
從測試的行為本質(zhì)上來看,手工測試與自動化測試并沒有區(qū)別。主要的區(qū)別是,一個(gè)由人來執(zhí)行,一個(gè)由代碼或工具執(zhí)行。快慢的問題。
五、前端單元測試主流框架介紹
目前主流的前端測試框架:Jasmine、Mocha、Jest,三足鼎立。還有很多就不一一列舉了。
Jasmine:比較老的一個(gè)js測試框架,據(jù)說過去也曾很風(fēng)流。
Mocha:誕生于2011年,也是一個(gè)主流的前端測試框架,有著豐富的功能,但是很多功能需要添加其他的插件庫,成本比較高。
(Mocha是一個(gè)獨(dú)立的開源項(xiàng)目,由志愿者獨(dú)家維護(hù)。版權(quán)所有2011-2020 OpenJS基金會和貢獻(xiàn)者。許可麻省理工學(xué)院。)
Jest:是由Facebook發(fā)布的開源的前端測試框架,是目前最流行的前端測試框架,是一個(gè)比較新的框架,在程序領(lǐng)域,一般情況下新出的東西都要比老的好用一點(diǎn),大部分是這樣的,要不然怎么在江湖上混。目前國內(nèi)很多的大型互聯(lián)網(wǎng)公司大廠都在用jest,所以我也選擇了jest框架,下面演示的 demo 案例也是用的jest。
六、jest框架優(yōu)點(diǎn)介紹
jest框架內(nèi)置了常用的測試工具,比如自帶斷言、測試覆蓋率工具,實(shí)現(xiàn)了開箱即用。不需要額外配置添加其他的插件,集成了 Mocha,chai,jsdom,sinon等功能,對react組件支持度非常友好, 同時(shí)它也支持Babel、 TypeScript、 Node、 React、 Angular、 Vue 等!,自帶snapshot(快照)功能,成本較低。
snapshot功能:能夠確保UI不會意外被改變。Jest會把結(jié)果值保存在一個(gè)文檔中,每次進(jìn)行測試的時(shí)候會把測試值與文件中的結(jié)果進(jìn)行比較,如果兩個(gè)結(jié)果值不同,那么開發(fā)者可以選擇要么改變代碼,要么替代結(jié)果文件。
三大優(yōu)點(diǎn): 比較新(剛出來不久)、 基礎(chǔ)好(性能好 功能多 簡單易用)、 速度快。
七、jest框架Demo演示
1、確保node 和npm已安裝
2,創(chuàng)建項(xiàng)目文件夾jesttest
3,創(chuàng)建 package.json 文件
在項(xiàng)目文件夾里 執(zhí)行命令 =》 npm init 創(chuàng)建 package.json 文件。并將 scripts.test 修改為如下所示。
{
"name": "jesttest",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest"
},
"author": "",
"license": "ISC",
"devDependencies": {
"jest": "^24.8.0"
}
}
4、安裝jest框架
執(zhí)行命令 =》npm install jest@24.8.0 -D
5、創(chuàng)建被測試文件
新建文件math.js(被測試文件),并且寫一些業(yè)務(wù)邏輯方法,如下代碼所示。
// math.js
function add(a, b){
return a + b;
}
function sub(a, b){
return a - b;
}
module.exports={
add, sub
}
6、創(chuàng)建測試文件
再新建文件math.test.js(測試文件),寫一些測試用例,如下代碼所示。
// math.test.js
const math = require('./math.js')
const {add, sub} = math
test('加法測試', () => {
expect(add(1,6)).toBe(7)
})
test('減法測試', () => {
expect(sub(5,3)).toBe(2)
})
test方法:jest封裝的測試方法,一般填寫兩個(gè)參數(shù),描述和測試方法。
expect方法 :預(yù)期方法,就是你調(diào)用了什么方法,傳遞了什么參數(shù),得到的預(yù)期是什么。
toBe方法:匹配器(Matchers),測試輸入輸出的值是否符合預(yù)期。(繼續(xù)往下看,后面有常用匹配器的介紹)。
7、進(jìn)行測試
執(zhí)行命令 =》npm run test 看結(jié)果。
開啟自動測試:
在package.json文件里設(shè)置。修改如下:
"scripts": {
"test": "jest --watchAll"
},
修改保存后,我們在終端再次運(yùn)行npm run test,這時(shí)候測試一次后,它并沒有結(jié)束,而是等待測試文件的變化,只要文件發(fā)生變化,ctrl+s保存后就會自動進(jìn)行測試。
8,如何查看代碼測試覆蓋率
代碼測試覆蓋率:就是測試的代碼對功能性的代碼和業(yè)務(wù)邏輯代碼做了百分之多少的測試。這個(gè)百分比就是代碼測試覆蓋率。
步驟:
a,Jest初始化配置:
執(zhí)行命令 =》 npx jest --init
初始化完成后,根目錄會出現(xiàn)一個(gè) jest.config.js 文件。
b,生成代碼覆蓋率:
這是終端直觀展示,便于開發(fā)人員查看測試結(jié)果。 在執(zhí)行完 npx jest --coverage 命令后會在根目錄自動生成一個(gè) coverage 文件夾,里面 index.html 文件是一個(gè)網(wǎng)頁版的測試結(jié)果報(bào)表,可以展示給客戶或者領(lǐng)導(dǎo)看。
注意:在 jest.config.js 文件中,配置項(xiàng) coverageDirectory: "coverage" 的屬性值 "coverage" 不是固定的,是可以自定義的,是用來定義生成報(bào)告文件夾的名字的。
八、jest框架常用匹配器:
匹配器是jest中非常重要的一個(gè)概念,使用不同匹配器可以測試輸入輸出的值是否符合預(yù)期,它提供了很多匹配規(guī)則,理解它類似于js的邏輯運(yùn)算符。
toBe()
相等,相當(dāng)于===,也就是我們常說的嚴(yán)格相等。引用地址不同,也會測試失敗。
(在剛才的案例中我們就用的這個(gè)匹配器)
toEqual()
相等,相當(dāng)于==。
toBeNull()
匹配器只匹配null值,需要注意的是不匹配undefined的值。
toBeUndifined()
我們要匹配undefined時(shí),就可以使用toBeUndifined()匹配器。
toBeDefined()
toBeDefined()匹配器的意思是只要定義過了,都可以匹配成功。這里需要注意的是,給一個(gè)null值也是可以通過測試的。
toBeTruthy()
這個(gè)是true和false匹配器,就相當(dāng)于判斷真假的。
oBeFalsy()
跟toBeTruthy()對應(yīng)的就是toBeFalsy(),這個(gè)匹配器只要是返回的false就可以通過測試。
toBeGreaterThan()
這個(gè)是用來作數(shù)字比較的,大于什么數(shù)值,只要大于傳入的數(shù)值,就可以通過測試。
toBeLessThan()
toBeLessThan跟toBeGreaterThan相對應(yīng)的,就是少于一個(gè)數(shù)字時(shí),就可以通過測試。
toBeGreaterThanOrEqual()
當(dāng)測試結(jié)果數(shù)據(jù)大于等于時(shí),就可以通過測試。
toBeLessThanOrEqual()
這個(gè)跟toBeGreaterThanOrEqual()相對應(yīng)。
toBeCloseTo()
這個(gè)是可以自動消除JavaScript浮點(diǎn)精度錯(cuò)誤的匹配器,舉個(gè)例子,比如我們讓0.1和0.2相加,這時(shí)候js得到的值應(yīng)該是0.30000000000004,所以如果用toEqual()匹配器,測試用例會通過不了測試的。這時(shí)候我們就需要使用toBeCloseTo()匹配器,可以順利通過測試。
toMatch()
字符串包含匹配器,比如“HTTP Status 404”,這時(shí)候我們要看看字符串中有沒有“404”就可以使用toMatch()匹配器。
toContain()
數(shù)組包含匹配器。比如[1,2,3],這時(shí)候我們要看看這個(gè)數(shù)組中有沒有3,就可以使用toContain()匹配器。
toThrow()
專門對異常進(jìn)行處理的匹配器,可以檢測一個(gè)方法會不會拋出異常。
not匹配器
not匹配器是Jest中比較特殊的匹配器,意思就是相反或者說取反。
關(guān)于匹配器的學(xué)習(xí)文檔地址:https://jestjs.io/docs/en/expect
九、 jest框架常用的四個(gè)鉤子函數(shù)
beforeAll()
在所有測試用例之前進(jìn)行執(zhí)行。
afterAll()
是在完成所有測試用例之后才執(zhí)行的函數(shù)。
beforeEach()
鉤子函數(shù),是在每個(gè)測試用例前都會執(zhí)行一次的鉤子函數(shù)。
afterEach()
是在每次測試用例完成測試之后都會執(zhí)行一次的鉤子函數(shù)。
// math.test.js
const math = require('./math.js')
const { add, sub, addMix, subMix } = math
beforeAll(()=>{
console.log('月考測試開始')
})
beforeEach(()=>{
console.log('開始計(jì)算這道題。。。。')
})
test('加法測試', () => {
expect(add(1,6)).toBe(7)
console.log('加法題已算完')
})
test('減法測試', () => {
expect(sub(5,3)).toBe(2)
console.log('減法題已算完')
})
afterEach(()=>{
console.log('接著算下一道題。。。。')
})
afterAll(()=>{
console.log('月考測試結(jié)束')
})
執(zhí)行命令 =》npm run test 看結(jié)果。
4.png
十、 Jest框架測試用例分組
Jest對測試用例提供了進(jìn)行分組的方法describe()
// math.test.js
const math = require('./math.js')
const { add, sub, addMix, subMix } = math
beforeAll(()=>{
console.log('月考測試開始')
})
beforeEach(()=>{
console.log('開始計(jì)算這道題。。。。')
})
describe('一年級考試',()=>{
test('加法測試', () => {
expect(add(1,6)).toBe(7)
console.log('加法題已算完')
})
test('減法測試', () => {
expect(sub(5,3)).toBe(2)
console.log('減法題已算完')
})
})
describe('二年級考試',()=>{
test('加法混合運(yùn)算測試', () => {
expect(addMix(2, 3, 4)).toBe(9)
console.log('加法混合運(yùn)算已算完')
})
test('減法混合運(yùn)算測試', () => {
expect(subMix(10,5,2)).toBe(3)
console.log('減法混合運(yùn)算已算完')
})
})
afterEach(()=>{
console.log('接著算下一道題。。。。')
})
afterAll(()=>{
console.log('月考測試結(jié)束')
})
執(zhí)行命令 =》npm run test 看結(jié)果。十一、jest鉤子函數(shù)作用域
三個(gè)特色:
1,鉤子函數(shù)在父級分組可作用域子集,類似繼承
2,鉤子函數(shù)同級分組作用域互不干擾,各起作用
3,先執(zhí)行外部的鉤子函數(shù),再執(zhí)行內(nèi)部的鉤子函數(shù)
為了更好的說明鉤子函數(shù)的作用域,現(xiàn)在我們把程序的最外層加入一個(gè)describe,其實(shí)不加這個(gè),系統(tǒng)默認(rèn)也是有這個(gè)的,只是不那么直觀。
1,鉤子函數(shù)在父級分組可作用域子集,類似繼承,代碼說明如下:
// math.test.js
const math = require('./math.js')
const { add, sub, addMix, subMix } = math
describe('最外層分組',()=>{
beforeAll(()=>{
console.log('月考測試開始')
})
beforeEach(()=>{
console.log('開始計(jì)算這道題。。。。')
})
describe('一年級考試',()=>{
test('加法測試', () => {
expect(add(1,6)).toBe(7)
console.log('加法題已算完')
})
test('減法測試', () => {
expect(sub(5,3)).toBe(2)
console.log('減法題已算完')
})
})
describe('二年級考試',()=>{
test('加法混合運(yùn)算測試', () => {
expect(addMix(2, 3, 4)).toBe(9)
console.log('加法混合運(yùn)算已算完')
})
test('減法混合運(yùn)算測試', () => {
expect(subMix(10,5,2)).toBe(3)
console.log('減法混合運(yùn)算已算完')
})
})
afterEach(()=>{
console.log('接著算下一道題。。。。')
})
afterAll(()=>{
console.log('月考測試結(jié)束')
})
})
執(zhí)行命令 =》npm run test 看結(jié)果。通過打印的結(jié)果,我們看到父級的每一個(gè)beforeEach和afterEach也都在子集的每一個(gè)測試用例的前后執(zhí)行了。這就是我們說的第一條鉤子函數(shù)在父級分組可作用域子集,類似繼承。
2,鉤子函數(shù)同級分組作用域互不干擾,各起作用,代碼說明如下:
// math.test.js
const math = require('./math.js')
const { add, sub, addMix, subMix } = math
describe('最外層分組',()=>{
// beforeAll(()=>{
// console.log('月考測試開始')
// })
// beforeEach(()=>{
// console.log('開始計(jì)算這道題。。。。')
// })
describe('一年級考試',()=>{
beforeEach(()=>{
console.log('一年級小明你是最棒的。。。。')
})
test('加法測試', () => {
expect(add(1,6)).toBe(7)
console.log('加法題已算完')
})
test('減法測試', () => {
expect(sub(5,3)).toBe(2)
console.log('減法題已算完')
})
})
describe('二年級考試',()=>{
beforeEach(()=>{
console.log('二年級小強(qiáng)你是最優(yōu)秀的。。。。')
})
test('加法混合運(yùn)算測試', () => {
expect(addMix(2, 3, 4)).toBe(9)
console.log('加法混合運(yùn)算已算完')
})
test('減法混合運(yùn)算測試', () => {
expect(subMix(10,5,2)).toBe(3)
console.log('減法混合運(yùn)算已算完')
})
})
// afterEach(()=>{
// console.log('接著算下一道題。。。。')
// })
// afterAll(()=>{
// console.log('月考測試結(jié)束')
// })
})
執(zhí)行命令 =》npm run test 看結(jié)果。這個(gè)案例輸出的結(jié)果也說明了鉤子函數(shù)在同級的describe分組里是互不干擾的。
3,先執(zhí)行外部的鉤子函數(shù),再執(zhí)行內(nèi)部的鉤子函數(shù),代碼說明如下:
// math.test.js
const math = require('./math.js')
const { add, sub, addMix, subMix } = math
describe('最外層分組',()=>{
beforeAll(()=>{
console.log('月考測試開始')
})
// beforeEach(()=>{
// console.log('開始計(jì)算這道題。。。。')
// })
describe('一年級考試',()=>{
beforeEach(()=>{
console.log('一年級小明你是最棒的。。。。')
})
test('加法測試', () => {
expect(add(1,6)).toBe(7)
console.log('加法題已算完')
})
test('減法測試', () => {
expect(sub(5,3)).toBe(2)
console.log('減法題已算完')
})
})
describe('二年級考試',()=>{
beforeEach(()=>{
console.log('二年級小強(qiáng)你是最優(yōu)秀的。。。。')
})
test('加法混合運(yùn)算測試', () => {
expect(addMix(2, 3, 4)).toBe(9)
console.log('加法混合運(yùn)算已算完')
})
test('減法混合運(yùn)算測試', () => {
expect(subMix(10,5,2)).toBe(3)
console.log('減法混合運(yùn)算已算完')
})
})
// afterEach(()=>{
// console.log('接著算下一道題。。。。')
// })
afterAll(()=>{
console.log('月考測試結(jié)束')
})
})
執(zhí)行命令 =》npm run test 看結(jié)果。這個(gè)案例也說明了先執(zhí)行外部的鉤子函數(shù),再執(zhí)行內(nèi)部的鉤子函數(shù)。
十二、讓jest支持import...from...語法
目前我們的Jest是不支持import...from....這種形式,如果使用就會報(bào)錯(cuò),因?yàn)镴est默認(rèn)支持的是CommonJS規(guī)范,也就是Node.js中的語法,他只支持require這種引用。所以我們使用import...from...是ES6的語法,所以使用就會報(bào)錯(cuò)。只要我們把import形式轉(zhuǎn)行成require就可以了。
1,安裝Babel轉(zhuǎn)換器
直接使用Babel就可以把代碼轉(zhuǎn)換成CommonJS代碼,然后就可以順利進(jìn)行測試了。
執(zhí)行命令=》 npm install @babel/core@7.4.5 @babel/preset-env@7.4.5 -D
2,Babel基本配置
我們在項(xiàng)目根目錄下新建一個(gè).babelrc的文件。
{
"presets":[
[
"@babel/preset-env",{
"targets":{
"node":"current"
}
}
]
]
}
為什么會這樣呢?其實(shí)在Jest里有一個(gè)babel-jest組件,我們在使用npm run test的時(shí)候,它先去檢測開發(fā)環(huán)境中是否安裝了babel,也就是查看有沒有babel-core,如果有bable-core就會去查看.babelrc配置文件,根據(jù)配置文件進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換完成,再進(jìn)行測試。
十三. 異步代碼測試方法
1, 回調(diào)函數(shù)式
a.安裝axios: install axios@0.19.0 –save。
c.創(chuàng)建 fetchData.test.js文件,測試用例代碼如下。
// fetchData.test.js
import {fetchData, fetchData2} from './fetchData.js';
test('fethData測試', (done) => {
fetchData((data)=>{
expect(data.isSuccess).toEqual(true)
done()
})
})
在這里需要注意的是,寫測試用例的時(shí)候一定要記得加 done方法, 用來保證回調(diào)完成。如果不加done的話出現(xiàn)的現(xiàn)象是,還沒有等到回調(diào),結(jié)果就完成了,這種結(jié)果是不保證正確的。
2、直接返回promise
b.在fetchData.test.js文件編寫測試用例代碼如下。
// fetchData.test.js
import {fetchData, fetchData2} from './fetchData.js';
// test('fethData測試', (done) => {
// fetchData((data)=>{
// expect(data.isSuccess).toEqual(true)
// done()
// })
// })
test('fetchData2測試', ()=> {
return fetchData2().then((response) => {
// console.log(response.data)
expect(response.data.isSuccess).toEqual(true)
})
})
在這里注意的是,測試的時(shí)候一定要記得加 return,不加return 也會沒跑完就返回結(jié)果,測試結(jié)果無法保證正確。
3, 測試接口是否存在
比如有些后臺需求不允許前臺訪問時(shí),這時(shí)候就會返回404(頁面不存在),這時(shí)候再測試時(shí)也存在一些坑。
b.在fetchData.test.js文件編寫測試用例代碼如下。
// fetchData.test.js
import {fetchData, fetchData2, fetchData3} from './fetchData.js';
// test('fethData測試', (done) => {
// fetchData((data)=>{
// expect(data.isSuccess).toEqual(true)
// done()
// })
// })
// test('fetchData2測試', ()=> {
// return fetchData2().then((response) => {
// // console.log(response.data)
// expect(response.data.isSuccess).toEqual(true)
// })
// })
test('fetchData3測試', () => {
expect.assertions(1)
return fetchData3().catch((e) => {
// console.log(e.toString())
expect(e.toString().indexOf('404')>-1).toEqual(true)
})
})
在這里注意的是,測試的時(shí)候一定要加上斷言expect.assertions(1),表示必須走一遍expect(),測試用例才通過,不走的話即使顯示測試通過,但測試結(jié)果也無法保證正確。
4,async...await... 寫法
上面案例寫異步測試用例時(shí)使用了return的形式,這只是其中的一種方法,還有另一種方法,就是使用async...await...的這種語法形式來寫測試用例。兩種語法沒有好壞之分,就看自己習(xí)慣和容易理解那種方法。
b.在fetchData.test.js文件編寫測試用例代碼如下。
// fetchData.test.js
import {fetchData, fetchData2, fetchData3, fetchData4} from './fetchData.js';
// test('fethData測試', (done) => {
// fetchData((data)=>{
// expect(data.isSuccess).toEqual(true)
// done()
// })
// })
// test('fetchData2測試', ()=> {
// return fetchData2().then((response) => {
// // console.log(response.data)
// expect(response.data.isSuccess).toEqual(true)
// })
// })
// test('fetchData3測試', () => {
// expect.assertions(1)
// return fetchData3().catch((e) => {
// // console.log(e.toString())
// expect(e.toString().indexOf('404')>-1).toEqual(true)
// })
// })
test.only('fetchData4測試', async() => {
const response = await fetchData4()
expect(response.data.isSuccess).toEqual(true)
})
十四、dist框架only的用法
在測試的時(shí)候,經(jīng)常會一個(gè)測試文件里寫很多個(gè)測試用例,有時(shí)候我們只想讓某一個(gè)測試用例執(zhí)行,這時(shí)候我們就可以使用only指定哪個(gè)執(zhí)行,其他的會自動跳過,只執(zhí)行這一個(gè),如下圖所示。十五、TDD 和 BDD
TDD
Test Driven Development 測試驅(qū)動的開發(fā)
關(guān)注需求,深入業(yè)務(wù),把業(yè)務(wù)需求最簡化,迭代到細(xì)節(jié)。
BDD
Behavior Driven Development 行為驅(qū)動開發(fā)
關(guān)注反應(yīng),用戶行為會產(chǎn)生什么反應(yīng),反應(yīng)是否正確。
BDD幫助開發(fā)人員設(shè)計(jì)(design)軟件,TDD幫助開發(fā)人員測試(test)軟件。
以上內(nèi)容是我本次入門單元測試的學(xué)習(xí)筆記。
通過查閱文檔和網(wǎng)上各路大神貢獻(xiàn)的博客以及視頻教程,總結(jié)出來的一篇學(xué)習(xí)筆記,知識來源于網(wǎng)絡(luò),再給人家還回去,算是禮尚往來。如有需要改正/補(bǔ)充的地方,或者對你有所幫助,歡迎留言一起探討。