Страницы

Поиск по вопросам

среда, 5 июня 2019 г.

Как сделать data-driven юнит-тесты?

Тестирую веб-сайт с использованием Selenium Webdriver (Firefox) и JUnit. В данный момент разные тест-кейсы работают с одним набором данных. Хочу разделить данные и реализацию, чтобы запускать одни и те же сценарии с разными данными.
Пока что данные инциализируются в @Before, но я могу выделить их хоть в XML, хоть в Properties. С этим затруднений нет.
В чем проблема: не представляю, как заставить юнит-тесты запускаться многократно, используя различные данные?
Я мог бы легко это сделать, отказавшись от использования JUnit. Просто вручную запускать методы и вручную же перебирать и скармливать им данные. Но это страшный велосипед и я не хочу терять преимуществ JUnit (таких, например, как автозапуск через Maven, красивое логирование, легкий запуск одного метода из тест-комплекта либо всего комплекта и т.д).
public class TestSuite { /** * Входные данные — строки и числа * */ String searchString; String firmID; String geoID;
private DGDriver driver; //extends FirefoxDriver
@Before public void setUp() throws Exception { driver = new DGDriver(); driver.manage().timeouts().implicitlyWait(1000, TimeUnit.SECONDS);
/** Сейчас данные инициализируются так */ searchString = "главный вокзал"; firmID = "141265769369926"; geoID = "141373143526113";
}
@Test public void testCase1 {
/* Тут вызываются методы, использующие данные. Думаю, по именам понятно, как они их используют */
driver.homepage(); driver.searchFor(searchString); driver.searchResults.clickItem(firmID); driver.firmCard.clickAddress(); ... } ... }


Ответ

Решил следующим образом:
В JUnit есть аннотации @Parametrized
/** * Обязательна вот такая аннотация класса: */ @RunWith(Parameterized.class) public class LeafletMarkerTests {
/** * значение аннотации value указывает на номер параметра в массиве */ @Parameterized.Parameter(0) public String searchString;
@Parameterized.Parameter(1) public String firmID;
@Parameterized.Parameter(2) public String geoID;
@Parameterized.Parameter(3) public int expectedTransformX; @Parameterized.Parameter(4) public int expectedTransformY; @Parameterized.Parameter(5) public int expectedTransformZ; Vector3d expectedCzarTransform;
// разные другие переменные
/** * можно задать названия датасетов, чтобы было понятнее, на каком тест зафейлился */ @Parameterized.Parameters(name = "{index}: {0}") public static Collection data() { return Arrays.asList(new Object[][]{ /*{searchString, firmID, geoID, x, y, z}*/ {"главный вокзал", "141265769369926", "141373143526113", 767, 289, 0}, {"цирк", "141265769338191", "141373143518884", 935, 289, 0}, {"оперный", "141265769360673", "141373143521691", 767, 289, 0}, {"старый дом", "141265769360664", "141373143532548", 767, 289, 0}, {"сансити", "141265770417218", "141373143572328", 767, 289, 0}, }); }
@Before public void setUp() throws Exception { driver = new DGDriver(); //extends FirefoxDriver driver.manage().timeouts().implicitlyWait(1000, TimeUnit.SECONDS);
// Инициализация этих параметров в @Before уже не нужна }
public void test1() {...}
... }
Так запущенный параметризованный тест-комплект выглядит в IntelliJ IDEA CE:


Нашел специализированное решение для data-driven тестов на JUnit

Комментариев нет:

Отправить комментарий