黄瓜执行的集成测试往往会留下导致后续测试出现问题的上下文。显而易见的解决方案似乎是Spring的@DirtiesContext
,但是在所有黄瓜功能运行之后,它不是在拆除上下文,而是在每个场景之后执行此操作,从而使测试执行时间相当长。
也试过@TestExecutionListeners
,但没有运气。
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( classes = { MyApplication.class, MyTestComponent.class }, loader = SpringApplicationContextLoader.class )
@ActiveProfiles( { "test", "someotherprofile" } )
@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_CLASS )
@WebIntegrationTest( randomPort = true )
public class StepDefs extends StepDefUtils {
// givens, whens, thens
我是否尝试以不受支持的方式使用DirtiesContext?
答案 0 :(得分:0)
将黄瓜测试方法编译到不同的测试类中,以便在每个测试方法之后运行@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_CLASS )
。
不幸的是,我没有看到任何适合您需求的DirtiesContext模式。 我会搜索一些黄瓜监听器并通过它手动使弹簧上下文变脏。
答案 1 :(得分:0)
如先前的回答所述,场景被编译并作为单独的类运行,从而阻止DirtiesContext正常工作,并且出于相同的原因,黄瓜中没有每个功能的挂钩。
解决方法是将标记放在方案中,并让带有钩子的类检测这些标记,并在afterTestClass方法期间有条件地弄脏上下文。 标签可让您控制何时弄脏上下文,例如,如果希望每个功能都具有新的上下文,然后使用标签标记最后一个场景,或者在需要时每个功能可以花费很多时间。
public class CucumberFeatureDirtyContextTestExecutionListener extends AbstractTestExecutionListener{
private static boolean dirtyContext = false;
@After("@DirtyContextAfter")
public void afterDirtyContext(){
dirtyContext = true;
}
@Override public void afterTestClass(TestContext testContext) throws Exception {
if (dirtyContext) {
testContext.markApplicationContextDirty(HierarchyMode.EXHAUSTIVE);
testContext.setAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE, TRUE);
dirtyContext = false;
}
}
}
用标记标记方案
@DirtyContextAfter
Scenario: My scenario
在步骤类中,使用spring注册侦听器
@TestExecutionListeners(listeners = {DependencyInjectionTestExecutionListener.class, CucumberFeatureDirtyContextTestExecutionListener.class})
确保侦听器在黄瓜胶中,以便注册钩子后
由于上下文已经设置,因此无法在beforeClass上使用它,因此必须在afterClass上进行。