为什么Jasmine被称为“BDD”测试框架,即使不支持“Given/When/Then”?

20
Jasmine的介绍中,它说:

Jasmine是一个用于测试JavaScript代码的行为驱动开发框架。

我阅读了几篇有关BDD的文章,似乎我们应该使用'Given/When/Then'来定义“场景”,这正是“cucumber”的做法。但是在Jasmine中,我看不到任何这样的方法。
即使没有这样的概念,我们仍然可以将Jasmine称为"BDD"测试框架吗?
3个回答

21

Jasmine不会阻止您使用给定-当-然后,下面是一个示例,展示了在使用Jasmine时您可以使用给定-当-然后的两种方式。

describe("Given a string containing 'foo'", function(){
    var someString;
    beforeEach(function() {
        someString = "foo";
    });
    describe("When I append 'bar'", function(){
        beforeEach(function() {
            someString += "bar";
        });
        it("Then the string is 'foobar'", function(){
            expect(someString).toBe("foobar");
        });
    });
    it("When I append 'baz' Then the string is 'foobaz'", function(){
        someString += "baz";
        expect(someString).toBe("foobaz");
    });
});

找到适合自己的测试风格。您应确保测试说明有效地描述了您要测试的内容。您可以使用“给定-当-那么”样式语句作为一种工具,以确保您的测试说明准确地描述了正在进行的测试内容。


1
我一直使用这种风格,大多数BDD框架都很好地对你的描述和其内容进行分组,并将它们漂亮地缩进。通过 ui/tests/reducers/drawerreducer.spec.js 切换导航抽屉 假设抽屉关闭且操作类型为TOGGLE_DRAWER ✓ 它应该将抽屉状态isOpen切换为true(2ms) ✓ 如果当前状态未传递,则应将抽屉状态isOpen切换为true(2ms) 假设抽屉关闭且操作类型不是TOGGLE_DRAWER ✓ 它应该按原样返回当前状态 - Mr. Doomsbuster
你好,如何使用嵌套的describe?根据Jasmin的说法,describe用于测试套件,而it用于测试用例。 - PDHide

19
我将描述Jasmine为一个JavaScript单元测试框架,它有很多语法糖,可以让我们更像是在描述行为的规范,而不仅仅是写“测试”内容。通常,当我们用商业语言来描述/规定系统的整体行为时,我们会使用Given、When和Then。当您描述系统组件时,通常使用自然语言的好处较少 - 在抽象层次较低的情况下需要更多的详细信息,这可以通过编程语言更好地支持。
现在,单元测试是BDD(行为驱动开发)的基本部分,Jasmine以一种相当简洁的方式支持此功能,因此,即使它只针对较低的抽象级别,它也肯定是一种BDD测试工具/框架。
Cucumber仅针对较高的抽象级别。它不擅长编写低级别的规范,并不意味着它不是BDD测试框架(BDD协作工具)。
有趣的一点是,要进行BDD,您确实需要两种不同的测试工具,一种用于高级抽象内容,另一种用于低级详细规范内容。不同的任务需要不同的工具,但它们都是同一过程的一部分。
最后,GWT实际上只是场景编写的实现细节。它区分了以下三个步骤:
- 设置状态G - 描述动作W - 检查动作T的结果

谢谢你的出色回答,很抱歉我的英语不好,我无法理解这句话:“The fact that its pants at writing low level specifications doesn't make it any less a BDD testing framework”,你能用更简单的表达方式吗? - Freewind
抱歉,这句话的意思是仅仅因为黄瓜在BDD生命周期的某个部分(即执行低级别测试的TDD部分)表现不佳,并不意味着它不是一个好的BDD工具。同样的标准也适用于Jasmine。它可能不擅长黄瓜擅长的事情,但它非常擅长执行低级别的任务,同时支持BDD的一个关键理念,即规定而非测试。 - diabolist
但是BDD不是从测试开始编码吗?所以你首先编写测试,然后它们失败,然后你编写代码?我猜Jasmine可以用于在编写代码后进行测试,对吗? - Tester
1
@Tester,你可以使用任何框架、BDD或TDD来测试代码,只需调用工具来检查代码。而TDD关注的是何时进行测试,BDD则更注重如何进行测试。 - Andre Figueiredo

1
回应@PDHide的问题:在Jasmine中是允许的。
嵌套describe如何使用?根据Jasmin,describe用于测试套件和测试用例。 文档中说:
嵌套describe块 可以嵌套调用describe,并在任何级别定义规范。这允许将套件组合成函数树。在执行规范之前,Jasmine按顺序向下遍历树并执行每个beforeEach函数。在执行规范后,Jasmine以类似的方式遍历afterEach函数。
他们还说:
describe函数用于分组相关规范[...]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接