我希望能够在运行一些自动化测试时记录spock功能名称和子句标签。当使用无头浏览器进行自动化时,这有助于调试测试问题,特别是幻像。原因是,phantomjs的行为并不总是与使用chrome WebDriver时的行为相同。如果这是可能的话,那也很好。
def "Login logout test"(){
given: "Go to login page"
...
when: "Submit username and password"
...
then: "Dashboard page displayed"
...
when: "logout"
...
then: "Returned to login page"
...
}
例如,如果我可以使用上面的示例spock功能方法来记录这样的标签,那会很酷。
Login logout test
Go to login page
Submit username and password
logout
Returned to login page
答案 0 :(得分:7)
第1步:创建自己的spock扩展类
package com.example.spock.exetension;
public class MySpockExtension implements IGlobalExtension {
@Override
public void start() {
}
@Override
public void visitSpec(SpecInfo spec) {
spec.addListener(new MyCustomSpockRunListener());
}
@Override
public void stop() {
}
}
Step2:创建一个可以监听spock运行的RunListener
package com.example.spock.exetension;
public class MyCustomSpockRunListener extends AbstractRunListener {
private boolean specFailed;
private boolean featureFailed;
@Override
public void beforeSpec(SpecInfo spec) {
// TODO Auto-generated method stub
specFailed = false;
}
@Override
public void beforeFeature(FeatureInfo feature) {
// TODO Auto-generated method stub
featureFailed = false;
}
@Override
public void beforeIteration(IterationInfo iteration) {
}
@Override
public void afterIteration(IterationInfo iteration) {
}
@Override
public void afterFeature(FeatureInfo feature) {
// TODO Auto-generated method stub
for ( BlockInfo block : feature.getBlocks() ) {
System.out.println(block.getKind().name() + " : " + block.getTexts() );
}
}
@Override
public void afterSpec(SpecInfo spec) {
// TODO Auto-generated method stub
System.out.println(spec.getName() + " : STATUS : " + specFailed != null ? "failure":"success");
}
@Override
public void error(ErrorInfo error) {
specFailed = true;
FeatureInfo feature = error.getMethod().getFeature();
if (feature != null) {
featureFailed = true;
System.out.println(error.getMethod().getName() + " : " + error.getException());
}else {
}
}
@Override
public void specSkipped(SpecInfo spec) {
}
@Override
public void featureSkipped(FeatureInfo feature) {
}
}
第3步:注册新的Spock扩展程序
META-INF/services/org.spockframework.runtime.extension.IGlobalExtension
com.example.spock.exetension.MySpockExtension
Step4:运行spock测试,您应该看到类似的输出。
given: "Go to login page"
when: "Submit username and password"
then: "Dashboard page displayed"
when: "logout"
then: "Returned to login page"
Login logout test : STATUS : success
答案 1 :(得分:2)
PiggyBacking对@Raghu Kirans的回答,我不得不做更多的事情来让我按照数据驱动测试的方式运行。在RunListener的BeforeIteration方法中,我执行了以下操作:
@Override
public void beforeIteration(IterationInfo iteration) {
Optional.of(iteration)
.map(feature -> iteration.getFeature())
.map(FeatureInfo::getBlocks)
.ifPresent( blocks -> blocks.forEach(
blockInfo -> log.info(blockInfo.getKind().name() + " : " + blockInfo.getTexts())));
}
这只是在每次迭代之前打印出所有内容。另请注意,BlockInfo对象上的getKind()。name()不打印出我们测试中的spock块的给定时间,而是打印出SETUP,WHEN,THEN和WHERE。 getTexts()将打印出块的组合文本。
示例:
给出:"我醒来" 并且:"我喝了一杯咖啡"将显示为
设置:["我醒来","我喝了一杯咖啡"]
答案 2 :(得分:1)
在连续搜索后,我发现这个solution来获取测试名称。但似乎无法在'when'和'then'标签上找到任何东西。现在可以了。
import org.junit.Rule
import org.junit.rules.TestName
class MySpec extends Specification {
@Rule TestName name = new TestName()
def "some test"() {
expect: name.methodName == "some test"
}
}
答案 3 :(得分:0)
您可能需要查看Spock Reports Extension