Fra*_*e91 8 java junit spring parameterized spring-boot
我有一个BaseTest类,它包含几个测试.每个测试都应该针对我列出的每个配置文件执行.
我想过使用参数化值,例如:
@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"))
}
Run Code Online (Sandbox Code Playgroud)
我如何告诉Spring使用这些不同的配置文件运行每个测试?事实上,每个配置文件将与不同的数据源(内存中的h2,外部mysql,外部oracle,...)进行通信,因此我的存储库/数据源必须重新初始化.
我知道我可以指定@ActiveProfiles(...),我甚至可以从BaseTest扩展并覆盖ActiveProfile注释.虽然这样可行,但我只展示了我测试套件的一部分.我的很多测试类都是从BaseTest扩展而来的,我不想为每个类创建几个不同的profile-stub.目前工作,但丑陋的解决方案:
谢谢
Ami*_*mar 15
物有所值:
我的用例是为多个弹簧配置文件运行特定的测试类,这就是我实现它的方法:
@SpringBootTest
abstract class BaseTest {
@Test void doSomeTest() {... ARRANGE-ACT-ASSERT ...}
}
@ActiveProfiles("NextGen")
class NextGenTest extends BaseTest {}
@ActiveProfiles("Legacy")
class LegacyTest extends BaseTest {}
Run Code Online (Sandbox Code Playgroud)
如果您使用 Maven,您实际上可以从命令行指定活动配置文件(或 env 变量,如果需要):
mvn clean test -Dspring.profiles.active=h2-test
Run Code Online (Sandbox Code Playgroud)
在这种情况下,参数化测试的方法可能不起作用,因为必须在 Spring 启动其上下文之前指定配置文件。在这种情况下,当您运行参数化集成测试时,上下文将在测试运行程序开始运行测试之前启动。JUnit 的参数化测试也是出于其他原因而发明的(使用不同的数据系列运行单元测试)。
编辑:还有一件事 - 当您决定使用时,@RunWith(Parameterized.class)您将无法使用不同的跑步者。在许多情况下(如果不是全部,如果涉及集成测试)您想要指定不同的运行程序,例如SpringRunner.class- 使用参数化测试您将无法做到这一点。
弹簧型材并非设计用于以这种方式工作。
在您的情况下,每个配置文件都使用特定的数据源。
因此,每个都需要 Spring Boot 加载才能使用预期的数据源运行测试。
事实上,您想要做的就像是让 Maven 构建与您想要测试的 Spring 配置文件一样多的构建。
此外,本地环境中的构建应该尽可能快。
通过 DBMS 实现来增加自动化测试的执行,每个测试都需要 Spring Boot 重新加载,这不会有任何帮助。
您不需要指定 @ActiveProfiles.
它看起来很像持续集成工具的任务,您可以在其中定义一个作业,通过指定特定的 Spring Boot 配置文件来执行(顺序或并行)每个 Maven 构建:
mvn clean test -Dspring.profiles.active=h2
mvn clean test -Dspring.profiles.active=mysql
Run Code Online (Sandbox Code Playgroud)
ETC...
您还可以尝试通过编写执行 Maven 构建的脚本来在本地执行它。
但正如所说的,它会减慢你的本地构建速度并使其复杂化。
| 归档时间: |
|
| 查看次数: |
3875 次 |
| 最近记录: |