2014-01-10 2 views
0

테스트 케이스로 dataprovider를 사용하여 CSV를 읽을 때 ArrayIndexOutOfBoundsException이 발생합니다.JAVA testNG로 CSV에서 읽을 때 ArrayIndexOutOfBoundsException이 발생하지만 그 이유는 무엇입니까?

csv로는 다음과 같습니다

TC1;[email protected];tester;t;Valid login 
TC2;[email protected];incorrect;f;Invalid password 
TC3;[email protected];tester;f;Invalid user 
TC4;[email protected];;fp;Empty password 
TC5;;tester;fe;Empty user 

강령 :

package tools; 

import java.io.FileReader; 
import java.io.IOException; 
import java.util.List; 

import org.testng.annotations.DataProvider; 

import au.com.bytecode.opencsv.CSVReader; 

public class DataProviders { 

    @DataProvider 
    static Object[][] LoginTestInput() throws IOException{ 

     CSVReader reader = new CSVReader(new FileReader("src/input/LoginTestInputFile.csv")); 
     List<String[]> myEntries = reader.readAll(); 

     Object[][] returnObject = new Object[myEntries.size()][5]; 
     for(int i = 1;i<myEntries.size();i++){ 
      String testCase = myEntries.get(i)[0]; 
      String username = myEntries.get(i)[1]; 
      String password = myEntries.get(i)[2]; 
      String loginSuccessful = myEntries.get(i)[3]; 
      String description = myEntries.get(i)[4]; 
      returnObject[i][0] = testCase; 
      returnObject[i][1] = username; 
      returnObject[i][2] = password; 
      returnObject[i][3] = loginSuccessful; 
      returnObject[i][4] = description; 

     } 

     return returnObject; 
    } 

} 

스택 트레이스 :

java.lang.RuntimeException: java.lang.ArrayIndexOutOfBoundsException: 1 
     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.ArrayIndexOutOfBoundsException: 1 
     at tools.DataProviders.LoginTestInput(DataProviders.java:22) 
     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 
스택 트레이스의

라인 (22)가 참조 : 문자열 테스트 케이스 = myEntries.get (i) [0];

+0

myEnteries의 크기는 0입니다. print/debug and check ... – TheLostMind

답변

1

라인에서 발생하는 예외 밤은

String testCase = myEntries.get(i)[0]; 

오히려 때문에 당신이에 세미콜론 문자 ;를 사용하고 있다는 사실을 (스택 트레이스 참조)

String username = myEntries.get(i)[1]; 

CSV 파일 - 전체 행에 대해 하나의 토큰 만 발견되었습니다. OpenCSV의 CSVReader은 기본적으로 , 구분 기호를 사용합니다. 그래서 0에서 시작

CSVReader reader = new CSVReader(new FileReader("src/input/LoginTestInputFile.csv"), ';'); 
0

당신은

for(int i = 1;i<myEntries.size();i++){ ... } to 
for(int i = 0;i<myEntries.size();i++){ ... } 

색인에서 다음과 같이 변경해야합니다 : 당신은 CSVReader's 오버로드 된 생성자를 사용할 수 있습니다.

또한 항목은 문자열 배열 당 한 행으로 간주됩니다. 예 "TC1; [email protected]; 테스터; t, 유효한 로그인"

String testCase = myEntries.get(i)[0]; 

뿐만 U 다시 문자열 배열을 반복해야 TAT 내부 결과. 파일의 항목을 세미콜론 (";") 대신 쉼표 (",")로 구분하는 것이 더 좋으므로 문제가 해결됩니다.

+0

정말 도움이된다면 정확하게 입력하십시오. –

관련 문제