我目前正在完善我们拥有的测试框架。对于当前的需求,我们必须支持多个弹簧配置文件,并多次运行我们的测试,每次使用不同的配置文件。每个配置文件都针对不同的测试环境,因此可以执行具有不同逻辑的不同测试集。
我有一个这样的测试课:
@ContextConfiguration(locations = { "classpath:META-INF/test-context.xml" })
public class Test extends AbstractTestNGSpringContextTests {
@Autowired
ProfileSpeciticBean profileSpecificBean;
...
}
这里,ProfileSpecificBean
是一个接口,由不同的类实现。要注入的实际实现由活动的 Spring 配置文件决定,我使用的是 Spring XML 上下文。我正在使用-Dspring.profiles.active=profileName
命令使用 Maven 构建项目,因此期望测试能够捕获通过的配置文件。
但是,当前测试在完整堆栈跟踪中失败并出现此错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到依赖项的 ProfileSpeciticBean 类型的合格 bean:预计至少有 1 个符合自动装配候选资格的 bean,找到 0
在对这个主题进行了一些研究之后,我发现AbstractTestNGSpringContextTests
期望@ActiveProfiles
在测试类之上有一个注释。所以,这段代码有效:
@ContextConfiguration(locations = { "classpath:META-INF/test-context.xml" })
@ActiveProfiles("profile1")
public class Test extends AbstractTestNGSpringContextTests ...
这样做的问题是:我想避免在我的类中硬编码配置文件名称。我需要为不同的配置文件运行相同的测试类,只需更改命令行脚本。
以上可能吗?有没有办法让 TestNG 知道命令行配置文件,并重新使用相同的测试?我需要避免重复代码和配置以使我的测试运行,因此为每个配置文件创建两个测试类不是我想要的。