参数化的runner类,在构造函数中有2个参数

时间:2015-02-09 16:08:14

标签: java junit selenium-webdriver parameterized

我希望使用Parameterized Junit类来读取.csv文件。我想: -

  1. 读取'placeID'(字符串)并将其附加到基本网址以形成网页
  2. 断言地名'name'(一个字符串)正如我所希望的那样
  3. 制表符分隔的.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();
    
        }
    }
    

1 个答案:

答案 0 :(得分: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

使用CSVReader依赖项更新您的pom:

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

<强>更新

csv文件:

132, Some text
133, Other text

上面的示例每行有一个单词。上面的代码经过编译和测试。