Помощь в проектировании: Hashmap в поставщике данных testng

Я писал тестовые сценарии, используя функцию TestNG DataProvider. До сих пор я был доволен тем, как я это делал, так как количество параметров, которые я передавал, было меньше 10, но некоторые из новых страниц, которые я тестирую, имеют более 30-35 параметров, добавление этих параметров в метод тестирования делает это выглядит очень уродливо, поэтому я начал использовать varArgs 'Object...'.

Это хороший способ динамической передачи параметров, но затем их использование затруднено, так как вы должны быть очень осторожны с индексами и склонны к ошибкам, если это необходимо сделать для многих методов.

Я попытался передать тестовые данные как ArrayList>, где HashMap — это пара «имя-значение столбца», но TestNG не примет это, поскольку HashMap не может быть приведен как Object[]. Причина, по которой я подумал об использовании HashMap, заключается в том, что вы можете запросить ключ и получить его значение, а ключ мне известен. Я мог бы написать общий метод для получения значения и присвоения его переменной, представляющей имена полей на странице.

Источник данных (XLS) хранит только тестовые данные, введенные на странице, поэтому он основан исключительно на данных, а не на ключевых словах. Все страницы, которые я тестирую, являются страницами ввода данных.

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

Любая помощь в этом отношении очень ценится.

Спасибо, Джон


person jonn_en    schedule 03.01.2013    source источник


Ответы (2)


Почему бы не использовать карту в качестве аргумента для вашего тестового метода, и ваш поставщик данных возвращает массив аргументов, состоящий только из карты для каждого набора данных:

public class MyTest {

  @Test(...)
  public void testThis(Map<String,Object> args) {
    String arg1 = (String) args1.get("args1");
    ...
  }

  @Dataprovider(...)
  public Object[][] dataprovider() {
    return new Object[][]{
      { map("arg1", "foo") },
      { map("arg1", "bar", "arg2", new Object() }
    };
  }

  private Map<String,Object> map(Object... kv) {
    //helper that creates Map from Array for brevity.
  }

}

Это должно облегчить использование переменных аргументов, эмулируя другие языки с именованной передачей параметров.

person jabbrwcky    schedule 04.01.2013

Почему бы не написать собственную функцию преобразования, которая превращает Map в Object[], которую затем можно передать методу TestNG?

person Cedric Beust    schedule 03.01.2013
comment
Спасибо, Седрик, за то, что нашел время в своем плотном графике, если я его конвертирую, я потеряю функциональность HashMap и, вероятно, в конечном итоге буду делать много непроверенных приведение. Другим способом, о котором я думал, было возвращение данных в виде ArrayList‹ArrayList‹HashMap‹String,String›››, где внутренний массив будет иметь размер 1. Таким образом, это может позволить мне преобразовать его как Object[]. Я немного занят в данный момент, но я попробую это позже. - person jonn_en; 04.01.2013