我可以在回调中动态创建测试规范吗?

时间:2016-01-26 09:45:36

标签: jasmine protractor

我想检索页面上的元素列表,并为每个元素创建一个测试规范。我的(伪)代码是: -

fetchElements().then(element_list) {
   foreach element {
     it("should have some property", function() {
        expect("foo")
     })
   }
}

当我运行它时,我得到"没有找到规格",我认为这是有意义的,因为它们是在主路径上定义的。

实现动态创建规范的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

存在阻碍其轻松实现的主要问题:

  • 您正在创建的规范基于异步代码的结果 - 在元素Protractor应该首先找到
  • 您只能在Protractor/WebDriverJSitbeforeEachbeforeAllafterEach中包含afterAll特定代码才能生效正确并将承诺放在控制流等上。
  • 您不能拥有嵌套的it块 - jasmine不会执行它们Cannot perform a 'it' inside another 'it'

如果它不是您想要生成测试用例的元素,而是具有定义值的静态变量,那么它将非常简单:

describe("Check something", function () {
    var arr = [
        {name: "Status Reason", inclusion: true},
        {name: "Status Reason", inclusion: false}
    ];

    arr.map(function(item) {
        it("should look good with item " + item, function () {
            // test smth
        });
    });
});

但是,如果arr是一个承诺,那么测试将在一开始就失败,因为describe内部的代码(不在it内)将被执行当jasmine加载测试时

总而言之,只有一个it()块并在其中工作

it("should have elements with a desired property", function() {
    fetchElements().then(element_list) {
        foreach element {
            expect("foo")
        })
    }
}

如果您担心将测试失败与元素区分开来,您可以提供可读的错误消息,这样,如果测试失败,您可以轻松地说,哪些元素未通过测试(在你的伪测试案例中没有特定属性)。例如,您可以提供custom messages to expect()

expect(1).toEqual(2, 'because of stuff') 

答案 1 :(得分:0)

我们可以使用jasmin data provider生成动态测试,但它仅适用于静态数据。

如果要通过量角器中的异步调用生成测试,则需要在量角器config js中使用onprepare函数。

创建一个引导加载程序,并从excel或服务器读取测试用例,并在onprepare函数中导入数据加载程序。很难解释,因为我已经面对 此JavaScript版本不支持很多导入之类的问题,并且期望2个args,但是只有1个。最后,我使用babel修复了这些问题并能够生成测试。

下面是我在on prepare方法中完成的示例实现

var automationModule = require('./src/startup/bootloader.ts');
var defer = protractor.promise.defer();
automationModule.tests.then(function(res) {
  defer.fulfill(res);
});

bootloader.ts包含用于从excel工作表读取测试套件和测试的代码,并将测试设置为单个到类。

res是从bootloader.ts返回的单例类的实例。

这里很难解释所有内容,但是您可以在我的github https://github.com/mannejkumar/protractor-keyword-driven-framework

中查看我的完整实现