【发布时间】:2021-03-28 12:44:34
【问题描述】:
我在网上看了几篇文章说单元测试应该是独立的。
但是,这显着增加了代码量,并且我们有很多重复。
这是一个插图:
describe('Magic Calculator', () => {
let param1:any;
let param2:any;
let param3:any;
function arrangeDefault () {
param1 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
param2 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
param3 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
}
it('should work for most common case', () => {
arrangeDefault();
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(200);
})
it('should work for edge case 1', () => {
arrangeDefault();
param1.foo1 = -1
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(500);
})
it('should work for edge case 2', () => {
arrangeDefault();
param1.foo1 = 0
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(503);
})
it('should work for edge case 3', () => {
arrangeDefault();
param1.foo1 = null
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(401);
})
})
如您所见,每个测试用例都使用一个公共排列函数arrangeDefault。这显着减少了所需的代码量,并且在撰写本文时更加简洁。但是几个月后,其中一个测试用例失败了,要理解测试用例失败的原因需要花费很多时间。那是因为我们必须做大量的声明查找,试图了解是什么改变了param 的状态,了解代码如何组合在一起,直到我们知道错误是什么。
所以如果我按照我在网上阅读的帖子的建议,测试代码应该是这样的:
describe('Magic Calculator', () => {
it('should work for most common case', () => {
let param1 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
let param2 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
let param3 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(200);
})
it('should work for edge case 1', () => {
let param1 = {
foo1: -1, foo2: 2, foo3: 3, // ...
}
let param2 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
let param3 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(500);
})
it('should work for edge case 2', () => {
let param1 = {
foo1: 0, foo2: 2, foo3: 3, // ...
}
let param2 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
let param3 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(503);
})
it('should work for edge case 3', () => {
let param1 = {
foo1: null, foo2: 2, foo3: 3, // ...
}
let param2 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
let param3 = {
foo1: 1, foo2: 2, foo3: 3, // ...
}
const result = MagicCalculator(param1, param2, param3)
expect(result.value).equal(401);
})
})
但是现在我们有很多重复,这只是一个例子,实际代码有更多的参数来设置。那么做事的正确方法是什么?我的问题的根本原因在哪里?
【问题讨论】:
标签: unit-testing testing automated-tests