是否可以记录spock功能方法名称和子句标签?

时间:2016-07-01 12:40:25

标签: spock geb

我希望能够在运行一些自动化测试时记录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

4 个答案:

答案 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