量角器/茉莉花条件测试案例

时间:2016-06-10 12:32:33

标签: angularjs jasmine protractor

与此问题相关:How can I create conditional test cases using Protractor? - 我很好奇是否对这些情景有合理的(记录的)答案,因为我无法得到直接答案。

虽然链接问题中发布的ignore解决方案有效,但在风格上我并不喜欢它。乍一看,它看起来就像是在忽略/跳过规范。

此外,我在Gitter上提出了这个问题 - 以下代码是不是很糟糕?

if(questionAnswer == "Yes") {
   it('should display another question', function() {
       // code
   });
}

我在量角器团队中从Gitter收到的答案相当含糊:

  

这可能导致片状测试......我认为没有任何东西可以说这不是一种不好的做法。如果它适合你,那就用它运行。

我对这个答案并不满意,因为他开始说“可能是片状的......”这对我来说听起来并不稳定。我看到的唯一选择是在规范内部创建条件,并创建一个任意断言来捕获else场景,即:

it('should display another question', function() {
    if(questionAnswer == "Yes") {
        expect(question2.isDisplayed()).toBe(true);
    }
    else {
        expect(true).toBe(true);
    }
});

但是当我只需要50%的时间时,我会自动添加一个额外的测试用例。我知道这是一个小问题,但它确实困扰我。

以上代码是我目前面临的情况 - 如果最后一个规范回答“是”,我需要为下一个问题运行一个额外的规范。如果没有,那就是我测试的结束。是否真的没有官方方式在Jasmine / Protractor中有条件地运行规范?

1 个答案:

答案 0 :(得分:7)

在这些情况下,我会使用名为 context 的内容。通常,上下文用于表示影响您正在测试的代码行为的状态更改。

虽然Jasmine没有明确提供,但它们确实存在于其他BDD风格的测试框架中,如Rspec(related reference)。通常,context只是describe的别名。

所以在Jasmine中,我将使用describe并按如下方式构建我的测试:

describe('someMethod', function() {
    describe('when a privileged account', function() {
        beforeEach(function() {
           questionAnswer = "Yes";
           someMethod();
        });

        it('should do something', function() {
            // expectation
        }
    });

    describe('when not a privileged account', function() {
        beforeEach(function() {
           questionAnswer = "No";
           someMethod();
        });

        it('should do something else', function() {
            // expectation
        }
    });
);

我避免"条件测试"。我宁愿运行更多测试,以确保我已经耗尽了所有代码路径。另外,我发现测试更具可读性,这是BDD风格测试的目标之一。

最后,为测试添加逻辑是人们走上测试测试的荒谬道路的一个原因。然后测试测试测试的测试。然后......