Помощ за дизайн: Hashmap в доставчик на данни testng

Пишех тестови скриптове, използвайки функцията DataProvider на TestNG. Досега бях доволен от начина, по който го правех, тъй като броят на параметрите, които предавах, беше по-малък от 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›››, където вътрешният arraylist ще бъде с размер 1. По този начин може да ми позволи да го преобразувам като Object[]. В момента съм малко обвързан, но ще опитам това по-късно. - person jonn_en; 04.01.2013