调查
我调试了
serenity-jbehave
类,试图了解设置的原因
configuredEmbedder().useMetaFilters(Collections.singletonList("-skip"))
不是在所有可能的地方工作,我把它放在我的课堂上
SerenityStories
,我找到了战略代码的地方
metaFilters
在里面
ExtendedEmbedder#embedder
被我们在类中定义的内容覆盖到
宁静的jbehave
.
这种方法是
SerenityReportingRunner#createPerformableTree
:
private PerformableTree createPerformableTree(List<CandidateSteps> candidateSteps, List<String> storyPaths) {
ExtendedEmbedder configuredEmbedder = this.getConfiguredEmbedder();
configuredEmbedder.useMetaFilters(getMetaFilters());
BatchFailures failures = new BatchFailures(configuredEmbedder.embedderControls().verboseFailures());
PerformableTree performableTree = configuredEmbedder.performableTree();
RunContext context = performableTree.newRunContext(getConfiguration(), candidateSteps,
configuredEmbedder.embedderMonitor(), configuredEmbedder.metaFilter(), failures);
performableTree.addStories(context, configuredEmbedder.storyManager().storiesOfPaths(storyPaths));
return performableTree;
}
这一行改变了集合
图元过滤器
:
configuredEmbedder.useMetaFilters(getMetaFilters());
它覆盖当前
图元过滤器
价值
进一步深入调用链,我们将了解定义它从何处开始的逻辑
图元过滤器
,即我们可以实际设置它的位置。
SerenityReportingRunner#createPerformableTree
SerenityReportingRunner#getMetaFilters
SerenityReportingRunner#getMetafilterSetting
这是我们需要的方法!
private String getMetafilterSetting() {
Optional<String> environmentMetafilters = getEnvironmentMetafilters();
Optional<String> annotatedMetafilters = getAnnotatedMetafilters(testClass);
Optional<String> thucAnnotatedMetafilters = getThucAnnotatedMetafilters(testClass);
return environmentMetafilters.orElse(annotatedMetafilters.orElse(thucAnnotatedMetafilters.orElse("")));
}
正如我们在这里看到的
图元过滤器
可以在三个位置定义,并且它们彼此覆盖。按照优先级降低顺序,它们是:
-
的值
metafilter
(完全小写!)VM属性。
-
上的值
net.serenitybdd.jbehave.annotations.Metafilter
我们的注释
宁静故事
班
-
上的值
net.thucydides.jbehave.annotations.Metafilter
我们的注释
宁静故事
班此批注已弃用,但为了向后兼容,保留在原地。
使用电流的解决方案
宁静的jbehave
版本
我已经尝试/调试了所有这三个选项,它们如上所述相互作用并覆盖。
1.使用环境
过滤器
所有物
将此添加到我的JVM运行参数中:
-Dmetafilter=skip
2.使用现代
@Metafilter
注释
import net.serenitybdd.jbehave.SerenityStories;
import net.serenitybdd.jbehave.annotations.Metafilter;
@Metafilter("-skip")
public class Acceptance extends SerenityStories {
3.使用已弃用的
@金属过滤器
注释
import net.serenitybdd.jbehave.SerenityStories;
import net.thucydides.jbehave.annotations.Metafilter;
@Metafilter("-skip") // warned as deprecated
public class Acceptance extends SerenityStories {
我当前项目的解决方案是使用当前
@Metafilter("-skip")
我的测试类上的注释,不依赖于/必须更改特定Jenkins/localdev执行的VM属性。
可能的拉取请求
https://github.com/serenity-bdd/serenity-core/issues/95
在这里,Serenity的人建议我用这个补丁做公关,因为他们现在不专注于Serenity+JBehave。
我知道在哪里进行更改(在上面描述的代码链中),但我不知道重写逻辑应该是什么:
来自的MetaFilter
configuredEmbedder
覆盖任何ENV/annotation MetaFilters。
或
任何ENV/annotation MetaFilters覆盖来自
已配置的嵌入器
或
来自的MetaFilter
已配置的嵌入器
与ENV/annotation MetaFilters合并。此选项需要合并优先级。
有什么建议吗?
在任何类型的修复中,我都希望添加有关重写现在如何工作的显式日志
SerenityReportingRunner#getMetafilter设置
,因为目前的行为确实不明显,需要花费大量时间进行调查。