【问题标题】:Can we use functions to arrange unit test so that we can reuse it?我们可以使用函数来安排单元测试以便我们可以重用它吗?
【发布时间】: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


    【解决方案1】:

    如果您想减少与运行测试的“生产”参数相关的样板数量;我建议看一下基于属性的测试库,两个示例是:

    通过这种方式,您可以自动生成值来运行测试并检查不变的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 2021-11-16
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多