使用mocha與chai對(duì)TypeScript進(jìn)行測(cè)試——02 測(cè)試驅(qū)動(dòng)開發(fā)

1. 準(zhǔn)備測(cè)試用例

測(cè)試用例來源于需求,我們依據(jù)需求分析寫出測(cè)試用例,而需求實(shí)例化非常適合用于TDD開發(fā),一般情況下,可以將需求實(shí)例化后的結(jié)果直接拿來當(dāng)作關(guān)鍵測(cè)試用例。
以下是實(shí)例化后的用例:
用例 性別 年齡 體重 基礎(chǔ)熱量 體重修正系數(shù) 推薦熱量
1 男 12 30 380 14.1 803
2 男 18 60 680 15.2 1592
3 女 18 60 450 14.6 1326
4 男 30 79 680 15.2 1880.8
5 女 31 79 830 8.6 1509.4
6 女 59 79 830 8.6 1509.4
7 男 60 60 830 11.5 1520
8 男 90 50 490 13.4 1160

2. 測(cè)試驅(qū)動(dòng)開發(fā)(TDD)步驟

TDD簡(jiǎn)單來說只有三步曲:

  1. 編寫測(cè)試用例代碼
  2. 快速讓測(cè)試通過
  3. 重構(gòu)

但這三步就完成了一個(gè)從需求到實(shí)現(xiàn)再到架構(gòu)設(shè)計(jì)的閉環(huán)編寫測(cè)試用例代碼就是將需求中每一個(gè)驗(yàn)收條件以測(cè)試用例的形式體現(xiàn)在代碼中,而快速讓測(cè)試通過就是針對(duì)測(cè)試代碼編寫功能實(shí)現(xiàn)代碼,緊扣主題,重構(gòu)是及時(shí)消除代碼中的壞味道,優(yōu)化代碼結(jié)構(gòu),讓代碼與設(shè)計(jì)緊貼當(dāng)前功能。

TDD就是不斷重復(fù)這3個(gè)步驟,將需求一點(diǎn)點(diǎn)實(shí)現(xiàn),因?yàn)樗械墓δ艽a以及設(shè)計(jì)都是依據(jù)需求驅(qū)動(dòng)出來的,所以代碼與設(shè)計(jì)都是最貼合當(dāng)前需求的實(shí)現(xiàn)。

3. 第1個(gè)測(cè)試

describe('#熱量計(jì)算測(cè)試', () => {
  describe('每日消耗熱量估算', () => {
    it('#1 12歲 30公斤的男性推薦每天消耗 803卡熱量', () => {
      const expected = 803;
      const actual = target.calculate(Sex.male, 12, 30);

      expect(actual).to.equal(expected);
    });
  })
})

基于測(cè)試代碼,可以寫出如下功能代碼:

class CaloryCalculator {
  calculate(sex: Sex, age: number, weight: number): number {
    return 803;
  }
}

運(yùn)行結(jié)果如下:

$ npm run test

> TypescriptTesting@1.0.0 test /Users/jason/dev/research/TypescriptTesting
> mocha -r ./node_modules/ts-node/register spec/**/*.ts



  #熱量計(jì)算測(cè)試
    每日消耗熱量估算
      ? #1 12歲 30公斤的男性推薦每天消耗 803卡熱量


  1 passing (9ms)

為什么返回一個(gè)hardcode 803呢?就是快速讓測(cè)試通過,然后進(jìn)行重構(gòu)環(huán)節(jié),我們?cè)谶@里粗略可以找出幾個(gè)壞味道:

  1. 硬編碼
  2. 未使用的參數(shù)

圍繞壞味道進(jìn)行代碼重構(gòu),重構(gòu)后的代碼如下:

class CaloryCalculator {
  calculate(sex: Sex, age: number, weight: number): number {
    if (sex == Sex.male) {
      if (age < 18) {
        return 380 + 14.1 * weight;
      }
    }

    return 0;
  }
}

強(qiáng)調(diào)一點(diǎn),這里重構(gòu)后的代碼并未完全消除壞味道,甚至引入了新的問題,魔法數(shù),我們會(huì)在下一次分享中專門談一談如何進(jìn)行代碼重構(gòu)

另外,因?yàn)槲覀兊墓δ艽a都有測(cè)試代碼所覆蓋,所以可以比較放心大膽地進(jìn)行重構(gòu)操作。重構(gòu)的技能是另外一個(gè)主題,需要至少兩堂培訓(xùn)課才能達(dá)到初見成效。

4. 完善功能

使用TDD三步曲,補(bǔ)充功能進(jìn)行實(shí)現(xiàn),完成后的參考代碼如下:
https://gitee.com/JasonLiSz/TypescriptTesting/tree/feature/TDD_CaloryCalculator

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容