Protractor Jasmine描述了嵌套在it块中的块

Protractor Jasmine describe blocks nested within an it block

本文关键字:it 嵌套 Jasmine 描述 Protractor      更新时间:2023-09-26

首先,下面的代码似乎可以工作。然而,我还没有看到任何人这样做,所以我想知道这是否合法,我是否错过了不可预见的不利因素。

上下文是我正在用Protractor写一个E2E测试,它使用Jasmine风格的describe/it块。我的目标是加载一个页面并运行一堆it测试块,而不需要每次都重新加载该页面(因为这很耗时)。

我的结构是:

describe("Homepage", function () {
    beforeEach(function () {
        browser.get("/"); //loads the page
    });
    it('elements', function () {
        describe('test group', function () {
            it('test 1', function () {
                //run stuff 1
            });
            it('test2', function () {
                //run stuff 2
            });
        })
    });
});

我意识到另一种选择就是这样做:

describe("Homepage", function () {
    beforeEach(function () {
        browser.get("/"); //goes to homepage
    });
    it('elements', function () {
        //run stuff 1
        //run stuff 2
    });
});

但问题是,我无法分离测试,最终会得到一个大的it块。我想以某种方式避免每次运行beforeEach的问题,但仍然能够有一个很好地分离的测试块集。


顺便说一句,我也试过这个:

describe("Homepage", function () {
    browser.get("/"); //goes to homepage
    it('elements', function () {
        //run stuff 1
        //run stuff 2
    });
});

但当你有多个这样的规格时,这就不起作用了。在测试运行之前,browser.get()都会一个接一个地运行。

将断言分解成更小的it块无疑是个好主意。Jasmine似乎没有只运行一次的全局设置功能。因此,也许你可以欺骗beforeEach块只运行一次设置:

describe("Homepage", function() {
    var pageLoaded = false;
    beforeEach(function() {
        if ( ! pageLoaded) {
            browser.get("/");
            pageLoaded = true;
        }
    });
});

Jasmine2有beforeAll()和afterAll(),它们对整个套件运行一次。