Javascript 使用Nightwatch的参数化测试(数据驱动测试)
我需要参数化我的自动化测试,以便它们可以使用多组数据运行(即数据驱动测试)。我使用的是Nightwatch,我发现它的最接近结果,实际上表明它不受支持。我没有能力尝试修改Nightwatch核心代码来支持这一点 我在TestNG中使用过如下方法:Javascript 使用Nightwatch的参数化测试(数据驱动测试),javascript,nightwatch.js,data-driven-tests,Javascript,Nightwatch.js,Data Driven Tests,我需要参数化我的自动化测试,以便它们可以使用多组数据运行(即数据驱动测试)。我使用的是Nightwatch,我发现它的最接近结果,实际上表明它不受支持。我没有能力尝试修改Nightwatch核心代码来支持这一点 我在TestNG中使用过如下方法: package parameters; import org.testng.annotations.Parameters; // [...] @Test @Parameters({"param1","param2"}) public void tes
package parameters;
import org.testng.annotations.Parameters;
// [...]
@Test
@Parameters({"param1","param2"})
public void testParameter(String param1, String param2)
// [..]
// . 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
}
});
要读取包含测试配置的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>
在Nightwatch中是否有任何自定义javascript库可以帮助实现这一点?或者有一种方法可以将它与其他工具集成?(据我所知,Nightwatch构建在Node.Js之上,Node.Js也不支持数据驱动测试,但它与其他工具集成以实现这一点。)我解决了需要使用多种数据组合运行测试的问题的一种方法是,对所有测试中相同的所有内容使用一个模板,并使用node使用该模板和每个数据变量组合创建所有测试文件 我需要所有的测试,以便使用nightwatches worker进程同时运行大约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),创建所有必要的测试,并通过设置标记或运行包含所有已创建测试的测试文件夹来运行这些测试。我通过提供辅助类解决了问题,您可以通过以下方式使用这些辅助类:
从“夜视数据驱动”导入DataDrivenTest
package parameters;
import org.testng.annotations.Parameters;
// [...]
@Test
@Parameters({"param1","param2"})
public void testParameter(String param1, String param2)
// [..]
// . 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
}
});
不错!看起来这是一个很好的解决方案,我会尝试将其适应我的测试!谢谢