我有一个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"))
}
我如何告诉Spring使用这些不同的配置文件运行每个测试?事实上,每个配置文件将与不同的数据源(内存中的h2,外部mysql,外部oracle,...)进行通信,因此我的存储库/数据源必须重新初始化。
我知道我可以指定@ActiveProfiles(...),我甚至可以从BaseTest扩展并覆盖ActiveProfile注释。虽然这样可行,但我只展示了我测试套件的一部分。我的很多测试类都是从BaseTest扩展而来的,我不想为每个类创建几个不同的profile-stub。目前工作,但丑陋的解决方案:
由于
答案 0 :(得分:4)
弹簧配置文件不是以这种方式工作的
在您的情况下,每个配置文件使用特定的数据源
因此每个都需要Spring Boot加载来运行具有预期数据源的测试。
事实上,你想要做的就是制作与你想要测试的Spring配置文件一样多的Maven构建。
此外,本地环境的构建应该尽可能快
将DBMS实现的自动化测试执行倍增需要每次重新加载Spring Boot都无济于事。
您不需要指定@ActiveProfiles
。
它看起来像是一个持续集成工具的任务,您可以通过指定特定的Spring Boot配置文件定义一个执行(顺序或并行)每个Maven构建的作业:
mvn clean test -Dspring.profiles.active=h2
mvn clean test -Dspring.profiles.active=mysql
等...
您还可以尝试通过编写执行maven构建执行的脚本在本地执行它
但正如所说,它会减慢你的本地构建,也会使它复杂化。
答案 1 :(得分:3)
如果您使用Maven,您实际上可以从命令行指定活动配置文件(如果需要,还可以指定env变量):
mvn clean test -Dspring.profiles.active=h2-test
在这种情况下,参数化测试的方法可能不起作用,因为必须在Spring启动其上下文之前指定profile。在这种情况下,当您运行参数化集成测试时,上下文将在测试运行器开始运行测试之前启动。此外,JUnit的参数化测试是出于其他原因而发明的(运行不同数据系列的单元测试)。
编辑:还有一件事 - 当你决定使用@RunWith(Parameterized.class)
时,你将无法使用不同的跑步者。在许多情况下(如果不是全部,如果涉及集成测试)你想要指定不同的跑步者,比如SpringRunner.class
- 通过参数化测试,你将无法做到。
答案 2 :(得分:3)
物有所值:
我的用例是为多个 spring 配置文件运行特定的测试类,这是我实现它的方式:
data(airquality)
a=airquality
convert_fahr_to_kelvin <- function(temp) {
kelvin <- ((temp - 32) * (5 / 9)) + 273.15
return(kelvin)
}
a[,4]=
convert_fahr_to_kelvin(a[,4])
oz=a[,1]
sr=a[,2]
wv=a[,3]
te=a[,4]
pairs(~oz+sr+wv+te,
col = c("orange") ,
pch = c(18),
labels = c("Ozono", "Irradiancia Solar", "Velocidad del viento","Temperatura"),
main = "Diagramas de dispersión por parejas")