2015-12-11 84 views
3

我需要我的参数自动测试,使他们能够用多组数据(即数据驱动测试)运行。我使用Nightwatch和最贴近它,我发现this Google Group thread这实际上说,它不支持的结果。我也没有能力来尝试修改夜巡核心代码,以支持这一点。与Nightwatch参数测试(数据驱动的测试)

我一直在使用TestNG中是这样的:从含有测试配置中的testng.xml阅读

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

<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的,但为了实现这一目标与其他工具集成。)

回答

1

一种方法我已经解决了需要测试数据的多种组合运行的问题,就是用一切的模板是相同的在所有的测试和使用节点创建的所有测试文件与模板和数据变量的每个组合。

我所需要的所有准备使用nightwatches工作进程在同一时间运行约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'); 
    }); 

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

它也有助于建立一个脚本文件来自动创建,我需要的所有测试然后运行我想要的测试的夜班。

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

1

我提供,你可以以这种方式使用的辅助类,解决了这个问题:

  1. 安装nightwatch数据驱动模块:

    NPM我nightwatch数据驱动

  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 
        } 
    }); 
    

Link to Github repository

+0

真好!看起来这是一个很好的解决方案,将尝试将其适应我的测试!谢谢! – anasarbescu