【发布时间】:2019-04-20 20:45:00
【问题描述】:
从 excel 文件中读取测试数据。 要求:我首先希望我的所有测试都应该在相同的测试数据上运行,即。 excel 行,然后用另一行全部测试。
分辨率: 尝试将@Factory 与我的@DataProvider 一起使用
问题: 如果我在 @dataProvider 中使用硬核值,它就可以正常工作。 但是当从excel中动态获取时,如果给我错误:[ERROR] Caused by: java.lang.NullPointerException
package com;
import java.util.HashMap;
import utils.*;
import org.testng.annotations.*;
public class TestFile extends BaseClass {
public HashMap<String, String> values = new HashMap<String, String>();
@Test()
private void Test_01() {
System.out.println(values.get("Number"));
}
@Factory(dataProvider = "getDataSet")
public TestFile(HashMap<String, String> values) {
this.values = values;
}
@DataProvider
private static Object[] getDataSet() {
String sheetName = mContext.getCurrentXmlTest().getSuite().getParameters().get(Constants.BU_LEISURE_SHEET_NAME);
int i = 0;
Object[] dataSet = null;
HashMap<String, HashMap<String, String>> sheet = testData.get(sheetName);
dataSet = new Object[sheet.size()][1];
for (String row : sheet.keySet()) {
HashMap<String, String> rowValuesMap = new HashMap<>();
for (String columnName : sheet.get(row).keySet()) {
rowValuesMap.put(columnName, sheet.get(row).get(columnName));
}
dataSet[i] = rowValuesMap;
i++;
}
return dataSet;
}
}
基类
public class BaseClass extends DataReader {
@BeforeSuite
public static void setup(ITestContext context) throws IOException {
mContext = context;
// other code
}
}
读取excel文件的Datareader类
public class DataReader {
public static HashMap<String, HashMap<String, HashMap<String, String>>> testData = new HashMap<String, HashMap<String, HashMap<String, String>>>();
// other code
}
错误日志
[ERROR] 未能执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test 项目 ATGDMAP 上的(默认测试):执行目标的默认测试 org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: 分叉进程中出现错误 [错误] java.lang.RuntimeException: java.lang.NullPointerException [错误] 在 org.testng.internal.MethodInvocationHelper.invokeMethodNoCheckedException(MethodInvocationHelper.java:49) [错误] 在 org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:131) [错误] 在 org.testng.internal.Parameters.handleParameters(Parameters.java:706) [错误] 在 org.testng.internal.FactoryMethod.invoke(FactoryMethod.java:151) [错误] 在 org.testng.internal.TestNGClassFinder.processFactory(TestNGClassFinder.java:223) [错误] 在 org.testng.internal.TestNGClassFinder.processMethod(TestNGClassFinder.java:179) [错误] 在 org.testng.internal.TestNGClassFinder.processClass(TestNGClassFinder.java:171) [错误] 在 org.testng.internal.TestNGClassFinder.(TestNGClassFinder.java:121) [错误] 在 org.testng.TestRunner.initMethods(TestRunner.java:370) [错误] 在 org.testng.TestRunner.init(TestRunner.java:271) [错误] 在 org.testng.TestRunner.init(TestRunner.java:241) [错误] 在 org.testng.TestRunner.(TestRunner.java:167) [错误] 在 org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:663) [错误] 在 org.testng.SuiteRunner.init(SuiteRunner.java:260) [错误] 在 org.testng.SuiteRunner.(SuiteRunner.java:198) [错误] 在 org.testng.TestNG.createSuiteRunner(TestNG.java:1295) [错误] 在 org.testng.TestNG.createSuiteRunners(TestNG.java:1273) [错误] 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1128) [错误] 在 org.testng.TestNG.runSuites(TestNG.java:1049) [错误] 在 org.testng.TestNG.run(TestNG.java:1017) [错误] 在 org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:295) [错误] 在 org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:84) [错误] 在 org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:90) [错误] 在 org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) [错误] 在 org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) [错误] 在 org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) [错误] 引起:java.lang.NullPointerException [错误] 在 com.TestFile.getDataSet(TestFile.java:27) [错误] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [错误] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [错误] 在 java.lang.reflect.Method.invoke(Method.java:498) [错误] 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) [错误] 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:74) [错误] 在 org.testng.internal.MethodInvocationHelper.invokeMethodNoCheckedException(MethodInvocationHelper.java:45) [ERROR] ... 25 个 [ERROR] -> [Help 1] [ERROR] [ERROR] 查看 错误的完整堆栈跟踪,使用 -e 开关重新运行 Maven。 [错误] 使用 -X 开关重新运行 Maven 以启用完整的调试日志记录。
【问题讨论】:
-
在你调用mContext之前,你能添加更多关于它的代码吗?并请添加日志...
-
请立即查看@JonathanJohx
-
问题出在这一行 String sheetName = mContext.getCurrentXmlTest().getSuite().getParameters().get(Constants.BU_LEISURE_SHEET_NAME);我想运行这个项目,但我不确定你是否可以分享它..或者你看看调试模式这个方法抛出什么 null..
-
mContext.getCurrentXmlTest().getSuite().getParameters().get(Constants.BU_LEISURE_SHEET_NAME);很好,因为如果我不使用工厂和静态数据提供程序,那么一切都可以作为一种魅力。 @Jonathan Johx
标签: java selenium testng dataprovider