2017-11-02 12 views
1

웹 응용 프로그램에 데이터를 여러 번 삽입해야합니다. 나는 데이터 구동 프레임 워크와 함께 testNG와 함께 셀레늄을 사용하고있다.CSV 데이터를 하나씩 읽고 여러 testNG 테스트에서 전달하는 방법

입력 값을 읽는 데 CSV 파일을 사용하고 있습니다.

아래 샘플 코드를 찾으십시오. 여기

public class TestData 
{ 
private static String firstName; 

public static String lastName; 

@BeforeClass 
public void beforeClass() throws IOException 
{ 

    reader = new CSVReader(new FileReader(fileName)); 

    while((record = reader.readNext()) != null) 
    { 
     firstName = record[0]; 
     lastName = record[1]; 
    } 

    } 

@Test 
public void test1() 
{ 
    driver.findElement(By.id(id)).sendKeys(firstName); 

    driver.findElement(By.id(id)).click(); 

    and so on.... 

} 

@Test 
public void test2() 
{ 
    driver.findElement(By.id(id)).sendKeys(lastName); 

    driver.findElement(By.id(id)).click(); 

    and so on.... 
} 

} 

, 나는 3 개 레코드를 삽입해야하지만 내가 위의 코드를 사용하는 경우 만 3 레코드가 삽입됩니다.

이 문제를 해결할 수 있도록 도와주세요.

샘플 입력 파일은

+1

'beforeClass'는 반환하기 전에 파일의 모든 행을 읽습니다 (while 루프는이를 수행합니다). 따라서 항상 마지막 행만 갖게됩니다. CSV 데이터를 배열에 저장하고 각 테스트 내에서 인덱스로 액세스 할 수 있습니다. –

답변

0

당신이 여기에서 필요로하는 것은 DataProvider에 의해 구동 Factory이다. Factory은 테스트 클래스 인스턴스를 생성합니다 (테스트 클래스는 기본적으로 하나 이상의 @Test 메서드가 포함 된 일반 클래스입니다). 데이터 프로 바이더는 기본적으로 팩토리 메소드에 테스트 클래스를 인스턴스화하는 데 필요한 데이터를 제공합니다.

이제 @Test 메서드는 로직을 실행하기 위해 인스턴스의 데이터 멤버와 기본적으로 작동합니다.

다음은 실제 상황을 보여주는 간단한 샘플입니다.

import org.assertj.core.api.Assertions; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Factory; 
import org.testng.annotations.Test; 

public class TestClassSample { 
    private String firstName; 
    private String lastName; 

    @Factory(dataProvider = "dp") 
    public TestClassSample(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    @DataProvider(name = "dp") 
    public static Object[][] getData() { 
     //feel free to replace this with the logic that reads up a csv file (using CSVReader) 
     // and then translates it to a 2D array. 
     return new Object[][]{ 
       {"Mohan", "Kumar"}, 
       {"Kane", "Williams"}, 
       {"Mark", "Henry"} 
     }; 
    } 

    @Test 
    public void test1() { 
     Assertions.assertThat(this.firstName).isNotEmpty(); 
    } 

    @Test 
    public void test2() { 
     Assertions.assertThat(this.lastName).isNotEmpty(); 
    } 
} 
0

주어진 데이터에 따라 while 루프는 CSV 파일의 세 번째 레코드에서 끝납니다. 각 반복에서 "firstName"및 "lastName"변수를 덮어 씁니다.

루프가 끊어지면 변수는 마지막으로 기록 된 값을 저장합니다. 따라서 모든 값을 저장하는 데 더 나은 데이터 구조를 사용하십시오. 나는 지도을 추천한다.

당신은 하나의 방법으로 클럽의 모든 테스트 케이스를 더욱 지도에서 각 항목에 대해 실행을 반복 @Test 주석에 invocationcount 속성을 사용할 수 있습니다. 맵에서 다음 키 세트로 증가시키기 위해 @BeforeTest과 함께 하나 이상의 메소드를 추가하십시오.