了解测试

默认情况下,每个 Jmix 项目已经包含了自动化测试的目录结构,并且在 src/test/java/<base-package>/user 目录下有两个测试类:

  1. UserTest.java - User 实体的集成测试。

  2. UserUiTest.java - 用户管理视图的 UI 集成测试。

UserTest 通过 Jmix 的 DataManager API 保存 User 实体。 然后还有通过用户名加载用户并验证用户存在的测试。

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

import com.company.demo.entity.User;
import com.company.demo.test_support.AuthenticatedAsAdmin;
import io.jmix.core.DataManager;
import io.jmix.core.security.UserRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;

import static org.assertj.core.api.Assertions.assertThat;

/**
 * Sample integration test for the User entity.
 */
@SpringBootTest (1)
@ExtendWith(AuthenticatedAsAdmin.class) (2)
public class UserTest {

    @Autowired (3)
    DataManager dataManager;

    @Autowired
    PasswordEncoder passwordEncoder;

    @Autowired
    UserRepository userRepository;

    User savedUser;

    @Test (4)
    void test_saveAndLoad() {
        // Create and save a new User
        User user = dataManager.create(User.class);
        user.setUsername("test-user-" + System.currentTimeMillis());
        user.setPassword(passwordEncoder.encode("test-passwd"));
        savedUser = dataManager.save(user);

        // Check the new user can be loaded
        User loadedUser = dataManager.load(User.class).id(user.getId()).one();
        assertThat(loadedUser).isEqualTo(user);

        // Check the new user is available through UserRepository
        UserDetails userDetails = userRepository.loadUserByUsername(user.getUsername());
        assertThat(userDetails).isEqualTo(user); (5)
    }

    @AfterEach (6)
    void tearDown() {
        if (savedUser != null)
            dataManager.remove(savedUser);
    }
}
1 @SpringBootTest 注解表示在测试的执行过程中会启动 Spring context。
2 AuthenticatedAsAdmin 允许测试用例通过 admin 用户与系统和数据库交互。
3 使用 @Autowired Spring 注解注入依赖。
4 每个测试用例使用 JUnit 的 @Test 注解。
5 为了进行验证测试结果,Jmix 项目可以直接使用 AssertJ 库。
6 清理工作,比如数据库还原等,都在带 @AfterEach 注解的 teardown 方法中完成。

测试本身只是常规的 Spring Boot 集成测试。会启动完整的 Spring context 并与真实的数据库进行交互。

当本地运行应用程序时,测试与应用程序使用相同的数据库。

Jmix Studio 使用 IntelliJ IDEA 的能力执行测试。当在 Jmix Studio 中打开 UserTest.java 时,可以直接点击测试用例左边的三角播放按钮运行测试。IDE 会显示测试结果以及测试是否成功。

更多关于如何运行测试用例的内容,请参阅 IntelliJ 文档

后面的章节会具体介绍不同的测试类型。