复用 JavaScript 测试用例

发表于:2020-10-14 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Uri Kutner    来源:掘金

  大多数人都觉得写测试用例实在是太难了~
  首先思考一下我们为什么会需要测试用例呢?
  代码定义了一组执行特定操作的指令。下面这个函数被视为执行定义明确的数学运算: y = a + b.
  如果开发人员了解它的基本原理,就可以使用代码编写它的正确实现:
//seems about right
function Add(a,b) {
 return a + b;
}
  但是,人为错误、系统约束或一些 bug 引起的异常可能会让代码执行出错:
function Add(a,b){
 return a + ‘ ’ + b; //woops!
}
  这种情况就需要测试用例来大显身手了。
  测试用例真实地映射代码的执行及输出。错误代码在将导致测试用例执行失败:
import Add;
test(‘add should return the sum of two numbers’, () => {
  expect(Add(2,3)).toBe(5); //error! it is actually ‘2 3’!
});
  降低成本的同时提高有效性。
  从数学上讲,“正常”代码是一个连续函数,而测试是同一操作的离散样本。 编写足以确保正确性以的样本量,可能与编写“正常”代码一样困难。
  那么,我们为什么不像使用“正常”代码那样复用现有的测试用例呢?
  复用测试用例
  我知道,复用测试用例是一种不好的体验。
  不管测试用例编写得多么好,用现有的无穷无尽的交织代码进行开发都非常困难。如果您尝试过这么做,我打赌您在短时间内就会头疼不已。
  但是,我想至少有一个用例是具有普适性的:
interface IFileSystem {
  writeFile(path, content);
  unlink(path)
  …
}
//common file-system implementation:
class NodeFs implements IFileSystem {
  …
}
  为 NodeFS 编写的大多数测试,几乎不需要经过修改就可以为 IFileSystem 所用!
  另一个文件系统可以有另一个实现,但是仍然使用相同的测试用例!
// memory-filesystem
//———————————————
// in memory file system for fast short and isolated uses.
class NodeFs implements IFileSystem {
 …
}
//memory-filesystem.test
//———————————————
import FileSystemTests
import MemFs
FileSystemTests.validate(MemFs);
  现在我们可以做到吗?
  当然可以!代码隔离的成本正在逐渐下降,写测试用例是值得的。
  1.写好测试用例:
import expect from ’chai’; //you gotta get it somewhere
import { IBinaryOperation } from ’math-functions’;
import { toPairs } from ’combinatorics’;
function validateAssociativity<T>(
  operation: IBinaryOperation<T>,
  values: T[]) {
  toPairs(values).forEach((x, y) => {
      expect(binaryOperation(x, y))
    .toEqual(binaryOperation(y, x));
  }
}
  2.使用 bit 将测试隔离到原子组件中:
§ bit add AssociativeTests.Ts —-id math/tests/associativity
§ bit add -c bit.envs/compilers/typescript
§ bit tag math/tests/associativity
  3.将您的组件推送到 bit.dev 中的集合:(在此处学习如何 创建 Bit 集合))
§ bit export collection.name math/tests/associativity
  4.现在,我们可以轻松地复用我们共享的可复用测试组件:
import add from ’./add.js’;
import { validateAssociativity } from ’@bit/collection.name.math.tests.associativity’;
test(‘add associativity’, () => {
const sample = [1, 5, 3, 1000, 0.3, -17];
  // or maybe.. math/samples/realNumbers ..?
validateAssociativity(add, sample);
}

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号