Интеграционные тесты UI

Jmix позволяет писать тесты для слоя пользовательского интерфейса. В этих тестах вы можете открывать экраны, загружать данные, проверять содержимое компонентов UI, вносить изменения и моделировать действия пользователя, такие как нажатия кнопок.

Тесты пользовательского интерфейса Jmix запускают полный контекст Spring и могут взаимодействовать с базой данных, подобно интеграционным тестам бизнес-логики. Они близки к end-to-end тестам, основанным на управлении браузером с помощью Selenium WebDriver, в том что они могут проверять широкий спектр функциональности приложения, но в то же время их легко настроить, и выполняются они намного быстрее.

В каждом новом проекте Jmix включен пример интеграционного теста UI: класс UserUiTest, который проверяет экраны управления пользователями. Давайте рассмотрим конфигурацию и логику тестов пользовательского интерфейса, используя этот пример.

Для выполнения тестов UI проект должен содержать зависимость от модуля jmix-flowui-test-assist:

build.gradle
testImplementation 'io.jmix.flowui:jmix-flowui-test-assist'

Класс теста приведен ниже.

UserUiTest.java
package com.company.demo.user;

import com.company.demo.DemoApplication;
import com.company.demo.entity.User;
import com.company.demo.view.user.UserDetailView;
import com.company.demo.view.user.UserListView;
import io.jmix.core.DataManager;
import io.jmix.flowui.ViewNavigators;
import io.jmix.flowui.component.UiComponentUtils;
import io.jmix.flowui.component.grid.DataGrid;
import io.jmix.flowui.component.textfield.JmixPasswordField;
import io.jmix.flowui.component.textfield.TypedTextField;
import io.jmix.flowui.data.grid.DataGridItems;
import io.jmix.flowui.kit.component.button.JmixButton;
import io.jmix.flowui.testassist.FlowuiTestAssistConfiguration;
import io.jmix.flowui.testassist.UiTest;
import io.jmix.flowui.testassist.UiTestUtils;
import io.jmix.flowui.view.View;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * Sample UI integration test for the User entity.
 */
@UiTest (1)
@SpringBootTest(classes = {DemoApplication.class, FlowuiTestAssistConfiguration.class}) (2)
public class UserUiTest {

    @Autowired
    DataManager dataManager; (3)

    @Autowired
    ViewNavigators viewNavigators;

    @Test (4)
    void test_createUser() {
        // Navigate to user list view
        viewNavigators.view(UserListView.class).navigate();

        UserListView userListView = UiTestUtils.getCurrentView(); (5)

        // click "Create" button
        JmixButton createBtn = findComponent(userListView, "createBtn"); (6)
        createBtn.click();

        // Get detail view
        UserDetailView userDetailView = UiTestUtils.getCurrentView();

        // Set username and password in the fields
        TypedTextField<String> usernameField = findComponent(userDetailView, "usernameField");
        String username = "test-user-" + System.currentTimeMillis();
        usernameField.setValue(username);

        JmixPasswordField passwordField = findComponent(userDetailView, "passwordField");
        passwordField.setValue("test-passwd");

        JmixPasswordField confirmPasswordField = findComponent(userDetailView, "confirmPasswordField");
        confirmPasswordField.setValue("test-passwd");

        // Click "OK"
        JmixButton commitAndCloseBtn = findComponent(userDetailView, "saveAndCloseBtn");
        commitAndCloseBtn.click();

        // Get navigated user list view
        userListView = UiTestUtils.getCurrentView();

        // Check the created user is shown in the table
        DataGrid<User> usersDataGrid = findComponent(userListView, "usersDataGrid");

        DataGridItems<User> usersDataGridItems = usersDataGrid.getItems();
        Assertions.assertNotNull(usersDataGridItems);

        usersDataGridItems.getItems().stream()
                .filter(u -> u.getUsername().equals(username))
                .findFirst()
                .orElseThrow();
    }

    @AfterEach (7)
    void tearDown() {
        dataManager.load(User.class)
                .query("e.username like ?1", "test-user-%")
                .list()
                .forEach(u -> dataManager.remove(u));
    }

    @SuppressWarnings("unchecked")
    private static <T> T findComponent(View<?> view, String componentId) {
        return (T) UiComponentUtils.getComponent(view, componentId);
    }
}
1 Аннотация @UiTest определяет расширение JUnit для запуска Vaadin, настройки экранов приложения и установки аутентификации.
2 Аннотация @SpringBootTest должна объявить конфигурации приложения и модуля jmix-flowui-test-assist.
3 Вы можете внедрять любые бины Spring, используя аннотацию @Autowired.
4 Метод тест-кейса.
5 Метод UiTestUtils.getCurrentView() возвращает экран, в настоящее время открытый через навигацию.
6 Метод findComponent() возвращает компонент UI по его идентификатору.
7 Метод, выполняемый после каждого тест-кейса, может использоваться для очистки тестовых данных.