Java 通过TestNG运行测试时获取空指针异常

Java 通过TestNG运行测试时获取空指针异常,java,selenium-webdriver,testng,opencsv,Java,Selenium Webdriver,Testng,Opencsv,我正在使用CSV阅读器从中获取数据,并在使用DataProvider的测试函数中使用这些数据 测试方法 @Test(dataProvider = "regCSVData", dataProviderClass = LoginData.class) public void testLoginUsingCSVFile(LoginData loginData){ driver.get(appURL); Login login = PageFactory.initElements(dri

我正在使用CSV阅读器从中获取数据,并在使用DataProvider的测试函数中使用这些数据

测试方法

@Test(dataProvider = "regCSVData", dataProviderClass = LoginData.class)
public void testLoginUsingCSVFile(LoginData loginData){
    driver.get(appURL);
    Login login = PageFactory.initElements(driver, Login.class);
    login.loginToFwbm(loginData);
}
@DataProvider(name = "regCSVData")
public static Object[][] getCSVData() throws IOException {
    CSVReader csvReader = new CSVReader(new FileReader(
            LoginData.class.getResource("/regdata.csv").getPath()));
    List<String[]>dataList = csvReader.readAll();
    Object[][]data = new Object[dataList.size()][1];
    List<LoginData> logList = new ArrayList<LoginData>();
    for (String[] strArray:dataList){
        LoginData loginData = new LoginData();
        loginData.setUserName(strArray[0].trim());
        loginData.setPassword(strArray[1].trim());
        logList.add(loginData);
    }
    for (int i=0; i<data.length;i++){
        for(int j=0;j<data[i].length;j++){
            data[i][j] = logList.get(i);
        }
    }
    csvReader.close();
    return data;
}
asdf, pa2 qwerty, pa2 john, pa2
登录数据类

@Test(dataProvider = "regCSVData", dataProviderClass = LoginData.class)
public void testLoginUsingCSVFile(LoginData loginData){
    driver.get(appURL);
    Login login = PageFactory.initElements(driver, Login.class);
    login.loginToFwbm(loginData);
}
@DataProvider(name = "regCSVData")
public static Object[][] getCSVData() throws IOException {
    CSVReader csvReader = new CSVReader(new FileReader(
            LoginData.class.getResource("/regdata.csv").getPath()));
    List<String[]>dataList = csvReader.readAll();
    Object[][]data = new Object[dataList.size()][1];
    List<LoginData> logList = new ArrayList<LoginData>();
    for (String[] strArray:dataList){
        LoginData loginData = new LoginData();
        loginData.setUserName(strArray[0].trim());
        loginData.setPassword(strArray[1].trim());
        logList.add(loginData);
    }
    for (int i=0; i<data.length;i++){
        for(int j=0;j<data[i].length;j++){
            data[i][j] = logList.get(i);
        }
    }
    csvReader.close();
    return data;
}
asdf, pa2 qwerty, pa2 john, pa2 当我使用TestNG运行这个测试时,我得到了空指针异常

java.lang.RuntimeException: java.lang.NullPointerException at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:161) at org.testng.internal.Parameters.handleParameters(Parameters.java:429) at org.testng.internal.Invoker.handleParameters(Invoker.java:1383) at org.testng.internal.Invoker.createParameters(Invoker.java:1075) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1180) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at org.testng.SuiteRunner.run(SuiteRunner.java:240) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) at org.testng.TestNG.run(TestNG.java:1057) at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) Caused by: java.lang.NullPointerException at com.fwbm.dataobject.LoginData.getCSVData(LoginData.java:49) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:135) ... 20 more java.lang.RuntimeException:java.lang.NullPointerException 位于org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:161) 位于org.testng.internal.Parameters.handleParameters(Parameters.java:429) 位于org.testng.internal.Invoker.handleParameters(Invoker.java:1383) 位于org.testng.internal.Invoker.createParameters(Invoker.java:1075) 位于org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1180) 位于org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 位于org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 位于org.testng.TestRunner.privateRun(TestRunner.java:767) 位于org.testng.TestRunner.run(TestRunner.java:617) 位于org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 在org.testng.SuiteRunner.runSequential上(SuiteRunner.java:329) 位于org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 运行(SuiteRunner.java:240) 位于org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 位于org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 在org.testng.testng.runSuitesSequentially上(testng.java:1224) 位于org.testng.testng.runSuitesLocally(testng.java:1149) 位于org.testng.testng.run(testng.java:1057) 位于org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 位于org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 位于org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 原因:java.lang.NullPointerException 位于com.fwbm.dataobject.loginda.getCSVData(loginda.java:49) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源) 在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源) 位于java.lang.reflect.Method.invoke(未知源) 位于org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) 位于org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:135) ... 20多
项目结构图

@Test(dataProvider = "regCSVData", dataProviderClass = LoginData.class)
public void testLoginUsingCSVFile(LoginData loginData){
    driver.get(appURL);
    Login login = PageFactory.initElements(driver, Login.class);
    login.loginToFwbm(loginData);
}
@DataProvider(name = "regCSVData")
public static Object[][] getCSVData() throws IOException {
    CSVReader csvReader = new CSVReader(new FileReader(
            LoginData.class.getResource("/regdata.csv").getPath()));
    List<String[]>dataList = csvReader.readAll();
    Object[][]data = new Object[dataList.size()][1];
    List<LoginData> logList = new ArrayList<LoginData>();
    for (String[] strArray:dataList){
        LoginData loginData = new LoginData();
        loginData.setUserName(strArray[0].trim());
        loginData.setPassword(strArray[1].trim());
        logList.add(loginData);
    }
    for (int i=0; i<data.length;i++){
        for(int j=0;j<data[i].length;j++){
            data[i][j] = logList.get(i);
        }
    }
    csvReader.close();
    return data;
}
asdf, pa2 qwerty, pa2 john, pa2

您必须将文件添加到“运行配置”中的类路径中。然后可以使用getRessource()加载该文件

使用QAF的最佳方式。在QAF中,您不需要为解析数据提供程序文件提供实现。它对你来说非常容易使用


您可以参考LoginData?LoginData.class.getResource(“/regdata.csv”).getPath()中第49行中的文档;我已将csv文件置于项目名称下。。。所以它直接位于项目名称下…它不保存在任何文件夹中。。。因此,我直接使用它的名称来引用它。似乎找不到文件
regdata.csv
。必须将此文件添加到类路径。它在类路径中吗?