java TestNG 在@DataProvider 中使用@Parameters 调用方法
java TestNG calling methods with @Parameters inside @DataProvider
我正在尝试使用 @DataProvider 获取数据,其中 returns Object[][]
,我通过调用另一个方法粘贴值。该方法依次使用 @Parameters 从 XML.
获取值
问题是我得到 NullPointerException
,因为在 @DataProvider 中通过 @Parameters 调用所需的方法传递值 null
,希望 @Parameters 将此值从 XML 更改为合适的值。
同时,我不能通过不传递任何参数来调用方法。
代码:
Class TestSuite
package blablabla.mainPackage;
import blablabla.framework.*;
import java.io.IOException;
import java.util.ArrayList;
import org.testng.annotations.Test;
public class TestSuite extends Config {
FilesOperations fOps = new FilesOperations();
List<String> fileNames = new ArrayList<String>();
@Test(groups = {"positive"},
dataProvider = "getRandomFileName",
priority = 1)
public void createFileRandom(String fileName) throws IOException {
fOps.createFile(fileName, tempPath);
fileNames.add(fileName);
}
}
Class Config
package blablabla.mainPackage;
import blablabla.framework.*;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;
public class Config extends DataProviders{
public static Path tempPath;
DirectoriesOperations dirOps = new DirectoriesOperations();
@BeforeSuite(alwaysRun = true)
@Parameters({"path"})
public void tearUp(String path) throws IOException {
tempPath = dirOps.createTempDir(Paths.get(path));
}
@AfterSuite(alwaysRun = true, enabled = true)
public void tearDown() throws IOException {
dirOps.deleteTempDirOnExit(tempPath);
}
}
Class DataProviders
package blablabla.framework;
import java.io.IOException;
import org.testng.annotations.DataProvider;
public class DataProviders {
FilesOperations fOps = new FilesOperations();
HelpFunctions hf = new HelpFunctions();
ParametrizedFunctions pf = new ParametrizedFunctions();
@DataProvider(name = "getRandomFileName")
public Object[][] getRandomFileName() {
return new Object[][]{new Object[]{pf.generateRandomFileNameWithExtension(null)}};
}
}
Class ParametrizedFunctions
package blablabla.framework;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Parameters;
public class ParametrizedFunctions {
FilesOperations fOps = new FilesOperations();
HelpFunctions hf = new HelpFunctions();
@Parameters({"extensionsArray"})
public String generateRandomFileNameWithExtension(String extensionsArray) {
return fOps.getFileName(hf.stringToArray(extensionsArray), null);
}
}
此处,@Parameters({"extensionsArray"})
不提供来自 XML 文件的值。它只需要 null
,作为调用方法 generateRandomFileNameWithExtension()
的参数传递。而且,与此同时,如果不将任何参数传递给调用的方法,我就无法从 @DataProvider 调用此方法。
希望得到您的建议。
我找到了解决方案。将参数从 XML 传递到 @DataProvider 的最佳方法是将 ITestContext context
作为参数传递给 @DataProvider 方法,然后,使用以下方法获取所需参数:
context.getCurrentXmlTest().getParameter("parameterName");
@DataProvider的完整代码:
@DataProvider(name = "getRandomFileName")
public Object[][] getRandomFileName(ITestContext context) {
String extensionsArray = context.getCurrentXmlTest().getParameter("extensionsArray");
return new Object[][]{new Object[]{pf.generateRandomFileNameWithExtension(extensionsArray)}};
}
感谢大家的建议。
我正在尝试使用 @DataProvider 获取数据,其中 returns Object[][]
,我通过调用另一个方法粘贴值。该方法依次使用 @Parameters 从 XML.
问题是我得到 NullPointerException
,因为在 @DataProvider 中通过 @Parameters 调用所需的方法传递值 null
,希望 @Parameters 将此值从 XML 更改为合适的值。
同时,我不能通过不传递任何参数来调用方法。
代码:
Class TestSuite
package blablabla.mainPackage;
import blablabla.framework.*;
import java.io.IOException;
import java.util.ArrayList;
import org.testng.annotations.Test;
public class TestSuite extends Config {
FilesOperations fOps = new FilesOperations();
List<String> fileNames = new ArrayList<String>();
@Test(groups = {"positive"},
dataProvider = "getRandomFileName",
priority = 1)
public void createFileRandom(String fileName) throws IOException {
fOps.createFile(fileName, tempPath);
fileNames.add(fileName);
}
}
Class Config
package blablabla.mainPackage;
import blablabla.framework.*;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;
public class Config extends DataProviders{
public static Path tempPath;
DirectoriesOperations dirOps = new DirectoriesOperations();
@BeforeSuite(alwaysRun = true)
@Parameters({"path"})
public void tearUp(String path) throws IOException {
tempPath = dirOps.createTempDir(Paths.get(path));
}
@AfterSuite(alwaysRun = true, enabled = true)
public void tearDown() throws IOException {
dirOps.deleteTempDirOnExit(tempPath);
}
}
Class DataProviders
package blablabla.framework;
import java.io.IOException;
import org.testng.annotations.DataProvider;
public class DataProviders {
FilesOperations fOps = new FilesOperations();
HelpFunctions hf = new HelpFunctions();
ParametrizedFunctions pf = new ParametrizedFunctions();
@DataProvider(name = "getRandomFileName")
public Object[][] getRandomFileName() {
return new Object[][]{new Object[]{pf.generateRandomFileNameWithExtension(null)}};
}
}
Class ParametrizedFunctions
package blablabla.framework;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Parameters;
public class ParametrizedFunctions {
FilesOperations fOps = new FilesOperations();
HelpFunctions hf = new HelpFunctions();
@Parameters({"extensionsArray"})
public String generateRandomFileNameWithExtension(String extensionsArray) {
return fOps.getFileName(hf.stringToArray(extensionsArray), null);
}
}
此处,@Parameters({"extensionsArray"})
不提供来自 XML 文件的值。它只需要 null
,作为调用方法 generateRandomFileNameWithExtension()
的参数传递。而且,与此同时,如果不将任何参数传递给调用的方法,我就无法从 @DataProvider 调用此方法。
希望得到您的建议。
我找到了解决方案。将参数从 XML 传递到 @DataProvider 的最佳方法是将 ITestContext context
作为参数传递给 @DataProvider 方法,然后,使用以下方法获取所需参数:
context.getCurrentXmlTest().getParameter("parameterName");
@DataProvider的完整代码:
@DataProvider(name = "getRandomFileName")
public Object[][] getRandomFileName(ITestContext context) {
String extensionsArray = context.getCurrentXmlTest().getParameter("extensionsArray");
return new Object[][]{new Object[]{pf.generateRandomFileNameWithExtension(extensionsArray)}};
}
感谢大家的建议。