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

Won*_*Jon 5 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"
        ...
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我可以使用上面的示例spock功能方法来记录这样的标签,那将会很酷.

Login logout test
Go to login page
Submit username and password
logout
Returned to login page
Run Code Online (Sandbox Code Playgroud)

Rag*_*ran 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() {

    }
}
Run Code Online (Sandbox Code Playgroud)

第2:创建一个可以监听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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)


Won*_*Jon 1

经过不断搜索,我找到了这个获取测试名称的解决方案。但似乎在“何时”和“然后”标签上找不到任何内容。现在还可以。

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"
 }
}
Run Code Online (Sandbox Code Playgroud)