Spring Boot / JUnit,运行多个配置文件的所有单元测试

2022-09-04 02:37:16

我有一个BaseTest类,它由几个测试组成。每个测试都应针对 I 列出的每个配置文件执行。

我想过使用参数化值,例如:

@RunWith(Parameterized.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// @ActiveProfiles("h2-test") // <-- how to iterate over this?
public abstract class BaseTest {

@Autowired
private TestRepository test;

// to be used with Parameterized/Spring
private TestContextManager testContextManager;

public BaseTest(String profile) {
   System.setProperty("spring.profiles.active", profile);
   // TODO what now?
}

@Parameterized.Parameters
public static Collection<Object[]> data() {
  Collection<Object[]> params = new ArrayList<>();
  params.add(new Object[] {"h2-test" });
  params.add(new Object[] {"mysql-test" });
  return params;
}

@Before 
public void setUp() throws Exception {
  this.testContextManager = new TestContextManager(getClass());
  this.testContextManager.prepareTestInstance(this);
  // maybe I can spinup Spring here with my profile?
}

@Test
public void testRepository() {
  Assert.assertTrue(test.exists("foo"))
}

我如何告诉Spring使用这些不同的配置文件运行每个测试?事实上,每个配置文件将与不同的数据源(内存中的h2,外部mysql,外部oracle,..)进行通信,因此我的存储库/数据源必须重新初始化。


我知道我可以指定@ActiveProfiles(...),我甚至可以从BaseTest扩展并覆盖ActiveProfile注释。虽然这可以工作,但我只显示了我的测试套件的一部分。我的许多测试类都是从BaseTest扩展而来的,我不想为每个类创建几个不同的配置文件存根。目前工作,但丑陋的解决方案:

  • BaseTest (@ActiveProfiles(“mysql”))
    • FooClassMySQL(来自BaseTest的注释)
      • FooClassH2(@ActiveProfiles(“h2”))
    • BarClassMySQL(来自 BaseTest 的注释)
      • BarClassH2(@ActiveProfiles(“h2”))

谢谢


答案 1

对于它的价值:

我的用例是为多个弹簧配置文件运行一个特定的测试类,这就是我实现它的方式:

@SpringBootTest
abstract class BaseTest {
 @Test void doSomeTest() {... ARRANGE-ACT-ASSERT ...}
}

@ActiveProfiles("NextGen")
class NextGenTest extends BaseTest {}

@ActiveProfiles("Legacy")
class LegacyTest extends BaseTest {}

答案 2

如果您使用 Maven,您实际上可以从命令行指定活动配置文件(如果需要,也可以指定 env 变量):

mvn clean test -Dspring.profiles.active=h2-test

在这种情况下,具有参数化测试的方法可能不起作用,因为在Spring启动其上下文之前必须指定配置文件。在这种情况下,当您运行参数化集成测试时,在测试运行程序开始运行测试之前,上下文已经启动。此外,JUnit的参数化测试是出于其他原因(使用不同的数据系列运行单元测试)而发明的。

编辑:还有一件事 - 当你决定使用时,你将无法使用不同的跑步者。在许多情况下(如果不是全部,如果涉及到集成测试),您希望指定不同的运行器,例如 - 使用参数化测试,您将无法做到这一点。@RunWith(Parameterized.class)SpringRunner.class


推荐