【问题标题】:Best way of progressively testing changing data逐步测试不断变化的数据的最佳方法
【发布时间】:2021-07-10 23:19:43
【问题描述】:

我要测试的代码的目的是通过使用树来解析数学表达式。 因此,我想到了渐进式的测试,我慢慢地建立一棵树,在每次操作后进行测试,如下所示:

TreeBuilder.addNode(small, "A=B*C");
it("should return 0 due to using default values", () => {
    expect(small.getValue("A")).to.equal(0);
});

TreeBuilder.changeValue(small, "B", 2);
TreeBuilder.changeValue(small, "C", 3);

it("should update parent value after changing leaves", () => {
    expect(small.getValue("A")).to.equal(6);
});

等等 - 细节并不重要,但你明白了。现在,显然,这不起作用,因为“it”之外的所有语句都会立即执行,所以我不能进行这样的“渐进式测试”。

当然,我可以为每个测试使用不同的数据对象,但我不喜欢这种解决方案,因为那样会很麻烦。

所以我的问题更多是最佳实践,而不是特定代码:如何最好地测试通过多个函数调用逐步发展的行为?

【问题讨论】:

  • 这有点自以为是,但让测试不相互依赖被认为是一种好习惯。这意味着每个测试都有不同的数据对象,因此它们可以独立运行。另一种方法是创建一个大的it 块并执行类似“设置 -> 预期 -> 更改 -> 预期下一个 -> 更改 -> 预期下一个”之类的操作。尽管这被认为是一种不好的做法,因为您的测试基本上是多个测试合二为一。实际上,这确实实现了您尝试做的相同事情 - 按顺序运行预期。
  • 刚刚注意到,但在您的具体示例中,您也可以将您的 TreeBuilder.addNode(small, "A=B*C"); 包装在 beforeEach() 中,并将取决于您在 describe 中的更改的所有内容使用您的另一个 beforeEach()描述块。

标签: javascript node.js testing mocha.js chai


【解决方案1】:

最佳做法是让每个测试彼此独立(就像@pascalpuetz 所说),但要执行您想要的操作,您可以使用 mocha before 函数:

describe("parser", () => {
    var shared_var;

    before(() => {
        // setup code here
        shared_var = ....
    });

    it("should ...", () => {
       expect(shared_var).to...
    });

    it("should ...", () => {
       expect(shared_var).to....
    });

});

【讨论】:

  • 问题是每个它的前面都不相同。由于我的对象在每次测试之前看起来都不同,因此实际上只有第一行/函数调用能够在 before var 中。
  • 在我的 sn-p 中,before 函数调用在所有 it 之前运行一次(而 beforeEach 将在每个 it 之前运行)。
  • 我意识到了,但是在之前的调用中基本上只有一行代码。因此,我将在哪里放置我的其余调用以逐步构建我的对象的问题仍然存在
  • 这正是丑陋的部分。对象修改代码必须进入it 函数内部,使每个后续it 依赖于前面的。相反,我会做的是在每个 it 中从头开始重新构建对象,然后执行 expect 检查。这是很多代码重复,但它使测试保持独立。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多