2015-02-09 44 views
0

我希望使用参数化Junit类从.csv文件读取数据。我想: -在构造函数中带有2个参数的参数化运行器类

  1. 阅读“placeID”(一个字符串),并把它添加到基础URL形成一个网页
  2. 断言地名“名”(一个String)是如我所料它是为地方

的制表符分隔的.csv文件包含2个记录如下(将有100的记录最终):

132 
The Big House 

我目前得到一个非法参数异常。什么是实现这一目标的简单方法?我想有相对的URL,然后在单独的文件中测试数据会更好。

我的代码:

@RunWith(Parameterized.class) 
public class PlaceTest { 

public static WebDriver driver; 
private String placeId; 
private String name; 
private PropertyPage propertyPage; 

public PlaceTest(String page, String name) { 
    this.placeId = page; 
    this.name = name; 
} 

@Parameterized.Parameters 
public static Collection data() { 
    return csvFileAsCollectionOfStringArrays(
      System.getProperty("user.dir") + 
        "/src/test/resources/" + 
        "place_ids.csv"); 
} 

private static Collection<String[]> csvFileAsCollectionOfStringArrays(String csvFileName) { 

    List<String[]> csvRows = new ArrayList<String[]>(); 
    String rawCSVRow; 
    BufferedReader csvFileReader = null; 
    String delimiter = "\t"; 

    System.out.println("Reading data from " + csvFileName); 

    try { 
     csvFileReader = new BufferedReader(new FileReader(csvFileName)); 

    } catch (FileNotFoundException e) { 
     System.out.println("Could not find file " + csvFileName); 
     e.printStackTrace(); 
    } 

    int rowNumber = 1; 
    try { 

     if (csvFileReader != null) { 
      while ((rawCSVRow = csvFileReader.readLine()) != null) { 
       String delimitedItems[] = rawCSVRow.split(delimiter); 
       csvRows.add(delimitedItems); 
       rowNumber++; 
      } 
     } 


    } catch (IOException e) { 
     System.out.println("Error reading row number " + rowNumber); 
     e.printStackTrace(); 
    } 

    try { 
     assert csvFileReader != null; 
     csvFileReader.close(); 
    } catch (IOException e) { 
     System.out.println("Error closing file " + e.getMessage()); 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 

    return csvRows; 

} 

@BeforeClass 
public static void startDriver() { 
    driver = Driver.get(); 
} 

@Before 
public void getNextPage() { 
    propertyPage = new PropertyPage(driver); 
    driver.get(TestWebApp.getURL() + this.placeId); 
} 

@Test 
public void checkNamePresent() { 
    WebElement placeName = propertyPage.checkName(); 
    assertEquals("Expected match on name", this.name, placeName.getText()); 
} 

@AfterClass 
public static void quitDriver() { 
    driver.quit(); 

    } 
} 

回答

0

试试这个:

import static org.junit.Assert.assertEquals; 

import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 

import au.com.bytecode.opencsv.CSVReader; 

@RunWith(Parameterized.class) 
public class PlaceTest { 

    private String placeId; 
    private String name; 

    public PlaceTest(String page, String name) { 
     this.placeId = page; 
     this.name = name; 
    } 

    @Parameterized.Parameters 
    public static Collection<String[]> data() { 
     CSVReader reader = new CSVReader(new InputStreamReader(PlaceTest.class.getResourceAsStream("place_ids.csv"))); 
     List<String[]> lines; 
     try { 
      lines = reader.readAll(); 
      return lines; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return new ArrayList<String[]>(); 
    } 


    @Test 
    public void checkNamePresent() { 
     System.out.println(this.placeId + " " + this.name); 
    } 
} 

place_ids.csv必须是:\src\test\resources\<your package>\place_ids.csv

更新您的POM与CSVReader依赖:

<dependency> 
     <groupId>net.sf.opencsv</groupId> 
     <artifactId>opencsv</artifactId> 
     <version>2.3</version> 
    </dependency> 

更新:

CSV文件:以上

132, Some text 
133, Other text 

你举的例子有每行一个字。上面的代码被编译和测试。

+0

谢谢。我试过这个,但仍然得到:java.lang.IllegalArgumentException:错误的参数数 – Steerpike 2015-02-10 08:33:35

+0

也许你的CSV是错误的 – azbarcea 2015-02-10 12:43:58

相关问题