TypeScript 代码整洁之道- 测试

将 Clean Code 的概念适用到 TypeScript,灵感来自 clean-code-javascript。
原文地址: clean-code-typescript
中文地址: clean-code-typescript

简介

TypeScript 代码整洁之道- 测试_第1张图片
image

这不是一份 TypeScript 设计规范,而是将 Robert C. Martin 的软件工程著作 《Clean Code》 适用到 TypeScript,指导读者使用 TypeScript 编写易读、可复用和易重构的软件。

测试

测试比发货更重要。如果没有测试或数量不足,那么每次发布代码时都无法确保不引入问题。怎样才算是足够的测试?这取决于团队,但是拥有100%的覆盖率(所有语句和分支)会让团队更有信心。这一切都要基于好的测试框架以及覆盖率工具。

没有任何理由不编写测试。有很多优秀的 JS 测试框架都支持 TypeScript,找个团队喜欢的。然后为每个新特性/模块编写测试。如果您喜欢测试驱动开发(TDD),那就太好了,重点是确保在开发任何特性或重构现有特性之前,代码覆盖率已经达到要求。

TDD(测试驱动开发)三定律

  1. 在编写不能通过的单元测试前,不可编写生产代码。
  2. 只可编写刚好无法通过的单元测试,不能编译也算不过。
  3. 只可编写刚好足以通过当前失败测试的生产代码。

F.I.R.S.T.准则

整洁的测试应遵循以下准则:

  • 快速(Fast),测试应该快(及时反馈出业务代码的问题)。
  • 独立(Independent),每个测试流程应该独立。
  • 可重复(Repeatable),测试应该在任何环境上都能重复通过。
  • 自我验证(Self-Validating),测试结果应该明确通过或者失败
  • 及时(Timely),测试代码应该在产品代码之前编写。

单一的测试每个概念

测试也应该遵循单一职责原则,每个单元测试只做一个断言。

反例:


import { assert } from 'chai';

describe('AwesomeDate', () => {

  it('handles date boundaries', () => {

    let date: AwesomeDate;

    date = new AwesomeDate('1/1/2015');

    date.addDays(30);

    assert.equal('1/31/2015', date);

    date = new AwesomeDate('2/1/2016');

    date.addDays(28);

    assert.equal('02/29/2016', date);

    date = new AwesomeDate('2/1/2015');

    date.addDays(28);

    assert.equal('03/01/2015', date);

  });

});

正例:


import { assert } from 'chai';

describe('AwesomeDate', () => {

  it('handles 30-day months', () => {

    const date = new AwesomeDate('1/1/2015');

    date.addDays(30);

    assert.equal('1/31/2015', date);

  });

  it('handles leap year', () => {

    const date = new AwesomeDate('2/1/2016');

    date.addDays(28);

    assert.equal('02/29/2016', date);

  });

  it('handles non-leap year', () => {

    const date = new AwesomeDate('2/1/2015');

    date.addDays(28);

    assert.equal('03/01/2015', date);

  });

});

测试用例名称应该显示它的意图

当测试失败时,出错的第一个迹象可能就是它的名字。

反例:


describe('Calendar', () => {

  it('2/29/2020', () => {

    // ...

  });

  it('throws', () => {

    // ...

  });

});

正例:


describe('Calendar', () => {

  it('should handle leap year', () => {

    // ...

  });

  it('should throw when format is invalid', () => {

    // ...

  });

});

上一章:TypeScript 代码整洁之道 - SOLID原则
下一章:TypeScript 代码整洁之道- 并发

你可能感兴趣的:(TypeScript 代码整洁之道- 测试)