使用Nightwatch进行参数化测试(数据驱动测试)

时间:2015-12-11 14:19:32

标签: javascript nightwatch.js data-driven-tests

我需要参数化我的自动化测试,以便它们可以运行多组数据(即数据驱动测试)。我正在使用Nightwatch并且最接近结果我发现this Google Group thread实际上说它不受支持。而且我没有能力尝试修改Nightwatch核心代码以支持这一点。

我一直在使用TestNG:

package parameters;
import org.testng.annotations.Parameters;
// [...] 
@Test
@Parameters({"param1","param2"})
public void testParameter(String param1, String param2)
// [..]

用于从包含测试配置的testng.xml中读取:

<suite name="Smoke Test" thread-count="1">
  <parameter name = "productName" value = "Bonbons" />
  <parameter name = "productID" value = "09464703" />
  <test name = "ProductInfo">
    <classes>
      <class name = "parameters.testParameter">
      </class>
    </classes>
  </test>
</suite>

是否有任何自定义JavaScript库可以在Nightwatch中提供帮助?或者有可能将其与其他工具集成? (据我所知,Nightwatch是在Node.Js上构建的,它不支持数据驱动测试,但它与其他工具集成以实现此目的。)

2 个答案:

答案 0 :(得分:1)

我解决了需要使用多种数据组合运行测试的问题的一种方法是使用模板来处理所有测试中相同的所有内容,并使用node创建具有该模板和每种组合的所有测试文件数据变量。

我需要所有准备使用夜间工作进程的测试来同时运行~20个浏览器。我有4个环境,每个环境有4个站点,每个站点有4种登录类型,每种类型有4种支付类型,每种类型有4种卡类型,用于1024次测试以测试每种组合。

我不是说这是最简单的解决方案。这就是我如何让它允许工作进程在许多环境中工作,也许调整后的版本可能对你有所帮助:

var config = require("../globals").config;
var _ = require('underscore');
var fs = require('fs');

var template = fs.readFileSync('testTemplate.js');

_.each(config.environments, function (env) {
    _.each(config.sites, function (site) {
        _.each(config.logins, function (login) {
            _.each(config.paymentTypes, function (paymentType) {
                _.each(config.cardTypes, function (cardType) {

    var testName = env.name+'-'+site.name+'-'+login.name+'-'+paymentType.name+'-'+cardType.name;

    var s = "var _ = require('underscore');\n\n";
    s += "var env = '" + env.name + "';\n";
    s += "var site = '" + site.name + "';\n";
    s += "var login = '" + login.name + "';\n";
    s += "var paymentType = '" + paymentType.name + "';\n";
    s += "var cardType = '" + cardType.name + "';\n\n";
    s += "module.exports = {\n";
    s += "\t'@tags': ['"+env.name+"','"+site.name+"','"+login.name+"','"+adultType.name+"','"+paymentType.name+"','"+cardType.name+"'],\n";
    s += "\t'"+testName+"' : function (browser) {\n";
    s += template;

    fs.writeFile('./tests/'+env.name+'-'+login.name+'/'+testName+'.js', s, function (err) {
      if (err) return console.log(err);
      console.log('s > '+env.name+'/'+testName+'.js');
    });

                });
            });
        });
    });
});

设置脚本文件以自动创建我需要的所有测试然后运行nightwatch以进行我想要的测试也很有帮助。

所以基本上你在节点中输入你需要的数据,将它转换成你的测试很容易理解的格式(... JS,JSON),创建所有必要的测试,并通过设置标签或运行测试来运行它们包含所有已创建测试的文件夹。

答案 1 :(得分:1)

我通过提供可以这种方式使用的辅助类来解决问题:

  1. 安装 nightwatch-data-driven 模块:

    npm i nightwatch-data-driven

  2. 在测试模块中导入 DataDrivenTest 类:

    import DataDrivenTest from 'nightwatch-data-driven'

  3. 使用这样的类:

    // . Initialize DataDrivenTest with browser and AAA function
    //   and call it for a set of test cases
    new DataDrivenTest(browser, function(data, name){
        // . Arrange
        browser.logout();
        // . Act
        browser.page.login().loginAndWaitForRedirect(data.email, data.pass);
        // . Assert
        browser.page.workspace().assertIsCurrentPage(name);
    })
    .forCases({
        "Valid credentials": {email: authConfig.main.EMAIL, pass: authConfig.main.PASS},
        "Ignore leading space in email": {email: ' ' + authConfig.main.EMAIL, pass: authConfig.main.PASS},
        "Email in upper case": {
            email: authConfig.main.EMAIL.toUpperCase(),
            pass: authConfig.main.PASS,
            disabled: true
        }
    });
    
  4. Link to Github repository