Возврат двух аргументов из списка csv с использованием BufferedReader и разбиение на запятую - PullRequest
0 голосов
/ 24 августа 2018

Простите вопрос для начинающих, но я прежде всего тестировщик, и я пытаюсь понять, как с этим справиться.Я просто пытаюсь заполнить некоторые тестовые данные, прочитав частичный URL-адрес веб-сайта и соответствующий ему идентификатор входа в систему синдикатора, используя буферизованный читатель входного потока и возвращая два значения из каждой строки, разделенные запятой.

Вот мой csv:

 website1.uk, website1syndicator
 website2.uk, website2syndicator
 website3.uk, website3syndicator

Вот мой класс для чтения csv и заполнения List одним элементом String:

public class AbstractTestAllSites extends PageBase {

private static Logger log = LoggerFactory.getLogger(AbstractTestAllSites.class);

private static List<String> allWebsiteNames;

static {
    try (InputStream websiteListInputStream = AbstractTestAllSites.class.getResourceAsStream("/websites/my_sites.csv")) {
        readAllWebsiteNamesFrom(websiteListInputStream);
    } catch (IOException e) {
        log.error("Failed to read websitelist!", e);
    }
}

private static void readAllWebsiteNamesFrom(InputStream input) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
    List<String> websites = new ArrayList<String>();
    String listLine;
    while ((listLine = reader.readLine()) != null) {
        listLine = listLine.trim();
        if (!(listLine.startsWith("#") || isBlank(listLine))) {
            websites.add(listLine);
        }
    }
    allWebsiteNames = unmodifiableList(websites);
}

@Parameterized.Parameters
public static final List<String> data() {
    return allWebsiteNames;
}

}

Затем я могу передать конечные точки веб-сайта в свой тест следующим образом:

private static final String url = "http://mydomain.";
private String website;
private String syndicator;
public static WebDriver driver;

public TestAllSitesTest(String website, String syndicator){
    this.website = website;
    this.syndicator = syndicator;
}

@Before
public void getNextWebsite(){
    driver.get(url + this.website);
}
//run my tests here...

... и выполнить итерацию по ним до завершения.Но как я могу передать два параметра, чтобы я мог получить доступ к переменной синдикатора - возможно, нужен HashMap или аналогичный, а затем разделить на запятую, но с трудом.

1 Ответ

0 голосов
/ 24 августа 2018

Если вы хотите знать, как разбить каждую строку вашего CSV-файла, чтобы создать объект класса TestAllSitesTest (в котором есть конструктор, принимающий веб-сайт и синдикатор), вы можете сделать это следующим образом (внужная позиция в вашем коде, это только основной метод, показывающий пример):

public static void main(String[] args) {
    // create two ArrayLists, first one containing lines, second containing desired objects
    List<String> websites = new ArrayList<String>();
    List<TestAllSitesTest> testAllSitesTests = new ArrayList<TestAllSitesTest>();

    // add csv lines to the first ArrayList
    websites.add("website1.uk, website1syndicator");
    websites.add("website2.uk, website2syndicator");
    websites.add("website3.uk, website3syndicator");

    // iterate the list containing the csv lines
    websites.forEach((String website) -> {
        // split one line into the desired two parts, eliminating comma and space
        String[] splitWebsite = website.split(", ");
        // create a new object passing the parts of the split line as constructor parameters
        TestAllSitesTest test = new TestAllSitesTest(splitWebsite[0], splitWebsite[1]);
        testAllSitesTests.add(test);
    });

    // print the resulting objects
    testAllSitesTests.forEach((TestAllSitesTest t) -> {
        System.out.println("Website: " + t.getWebsite()
                + ", Syndicator: " + t.getSyndicator());
    });
}

Надеюсь, это поможет…

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...