Страницы

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

воскресенье, 15 марта 2020 г.

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

#java #юнит_тесты #junit


Тестирую веб-сайт с использованием 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();
        ...
    }
    ...
}

    


Ответы

Ответ 1



Решил следующим образом: В 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.

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

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