在创建新场景时,我只想测试我目前正在使用的场景。为此,我想在我的场景之前使用Meta: @skip
标记。我发现我必须使用embedder
来配置使用过的元标记,所以我尝试了:
configuredEmbedder().useMetaFilters(Arrays.asList("-skip"));
但实际上这仍然对我的测试场景没有影响。我在我的SerenityStories
测试套件定义的构造函数中使用它。以下是此类的完整代码:
public class AcceptanceTestSuite extends SerenityStories {
@Managed
WebDriver driver;
public AcceptanceTestSuite() {
System.setProperty("webdriver.chrome.driver", "D:/files/chromedriver/chromedriver.exe");
System.setProperty("chrome.switches", "--lang=en");
System.setProperty("restart.browser.each.scenario", "true");
configuredEmbedder().useMetaFilters(Arrays.asList("-skip"));
runSerenity().withDriver("chrome");
}
@Override
public Configuration configuration() {
Configuration configuration = super.configuration();
Keywords keywords = new LocalizedKeywords(DEFAULTSTORYLANGUAGE);
Properties properties = configuration.storyReporterBuilder().viewResources();
properties.setProperty("encoding", "UTF-8");
configuration.useKeywords(keywords)
.useStoryParser(new RegexStoryParser(keywords, new ExamplesTableFactory(new LoadFromClasspath(this.getClass()))))
.useStoryLoader(new UTF8StoryLoader()).useStepCollector(new MarkUnmatchedStepsAsPending(keywords))
.useDefaultStoryReporter(new ConsoleOutput(keywords)).storyReporterBuilder().withKeywords(keywords).withViewResources(properties);
return configuration;
}
}
这是错误的地方还是我错过了什么?仍然执行所有方案。
修改
我改变了以下课程,现在我认为它“有效”
public AcceptanceTestSuite() {
System.setProperty("webdriver.chrome.driver", "D:/files/chromedriver/chromedriver.exe");
System.setProperty("chrome.switches", "--lang=de");
System.setProperty("restart.browser.each.scenario", "true");
this.useEmbedder(configuredEmbedder());
runSerenity().withDriver("chrome");
}
@Override
public Embedder configuredEmbedder() {
final Embedder embedder = new Embedder();
embedder.embedderControls()
.useThreads(1)
.doGenerateViewAfterStories(true)
.doIgnoreFailureInStories(false)
.doIgnoreFailureInView(false)
.doVerboseFailures(true);
final Configuration configuration = configuration();
embedder.useConfiguration(configuration);
embedder.useStepsFactory(stepsFactory());
embedder.useMetaFilters(Arrays.asList("-skip"));
return embedder;
}
但现在我收到了消息[pool-1-thread-1] INFO net.serenitybdd.core.Serenity - TEST IGNORED
,但该方案仍在执行中。只有在结果页面中,我才能获得忽略此场景(但仍然执行)的信息。有没有办法跳过场景,所以它不会运行?
答案 0 :(得分:1)
我调试了serenity-jbehave
类,试图理解为什么设置
configuredEmbedder().useMetaFilters(Collections.singletonList("-skip"))
在我将其放在扩展SerenityStories
的类中的所有可能位置上都无法正常工作,我发现了metaFilters
中ExtendedEmbedder#embedder
的战略代码位置已被我们在其中定义的内容覆盖我们的班级从serenity-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;
}
此行更改了集合metaFilters
:
configuredEmbedder.useMetaFilters(getMetaFilters());
它会覆盖当前的metaFilters
值。
再往前看,我们将转到定义从何处获取metaFilters
的逻辑,即实际上可以对其进行设置的地方。
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("")));
}
正如我们在此处看到的,metaFilters
可以在三个位置定义,并且它们彼此覆盖。按照优先级降低顺序,它们是:
metafilter
(实际上是所有小写字母!)VM属性的值。net.serenitybdd.jbehave.annotations.Metafilter
类上的SerenityStories
注释的值。net.thucydides.jbehave.annotations.Metafilter
类上的SerenityStories
注释的值。不建议使用此注释,但保留其位置以实现向后兼容。serenity-jbehave
的解决方案我已经尝试/调试了所有这三个选项,它们如上所述都可以工作并相互替代。
metafilter
属性将其添加到我的JVM运行参数中:
-Dmetafilter=skip
@Metafilter
注释import net.serenitybdd.jbehave.SerenityStories;
import net.serenitybdd.jbehave.annotations.Metafilter;
@Metafilter("-skip")
public class Acceptance extends SerenityStories {
@Metafilter
批注import net.serenitybdd.jbehave.SerenityStories;
import net.thucydides.jbehave.annotations.Metafilter;
@Metafilter("-skip") // warned as deprecated
public class Acceptance extends SerenityStories {
当前项目的解决方案是在测试类上使用当前的@Metafilter("-skip")
批注,而不依赖于/不必更改特定Jenkins /本地开发人员执行的VM属性。
https://github.com/serenity-bdd/serenity-core/issues/95 —在这里,Serenity的人建议我使用此修复程序进行PR,因为他们现在不专注于Serenity + JBehave。
我了解在哪里进行更改(在上述代码链中),但是我不知道应该采用什么替代逻辑:
-来自configuredEmbedder
的MetaFilter会覆盖任何ENV /注释MetaFilters。
OR
-任何ENV /注释元过滤器都会覆盖configuredEmbedder
中的元过滤器
OR
-来自configuredEmbedder
的MetaFilter与ENV /注释MetaFilter合并。此选项需要合并优先级。
有什么建议吗?
在任何类型的修复程序中,我都希望添加有关覆盖现在如何在SerenityReportingRunner#getMetafilterSetting
中起作用的显式日志,因为当前的行为实际上并不明显,并且需要花费大量时间进行调查。
答案 1 :(得分:1)
只要您对它进行了很好的记录(https://github.com/serenity-bdd/the-serenity-book中的某些文档将是很棒的),我认为作为JBehave / Serenity用户,您将有足够的资格来决定哪个选项最有意义。
答案 2 :(得分:0)
我无法使用configuredEmbedder()
运行,而是在我的mvn运行配置中添加-Dmetafilter="+working -finished"
作为目标,并使用标签@working
用于我正在使用的方案对于我不想执行的方案,我想要运行@finsihed
。如果我想更改元标记,我仍然需要更改运行配置,因此它不是很舒服,但仍然可以得到我想要的内容。