2016-07-01 75 views
3

我希望能夠在運行某些自動化測試時記錄spock功能名稱和子句標籤。當使用無頭瀏覽器進行自動化時,這將有助於調試測試問題,特別是phantomjs。原因是,phantomjs的行爲與使用chrome WebDriver的行爲不一樣。如果這甚至是可能的,那也很好。是否可以記錄spock要素方法名稱和子句標籤?

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 

回答

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" 
} 
} 
1

您可以通過以下獲取每一個特徵方法的名稱:

import spock.lang.Specification 
import org.junit.Rule 
import org.junit.rules.TestName 
import org.slf4j.Logger 
import org.slf4j.LoggerFactory 

class MySpec extends Specification{ 
    private static Logger logger = LoggerFactory.getLogger(ClassName.class) 
    @Rule TestName testName = new TestName() 

    void setup(){ 
     def featureMethodName = testName.methodName 
     logger.info("feature method : " + featureMethodName) 
    } 
} 
4

第一步:創建你自己的斯波克擴展類

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() { 

    } 
} 

第二步:創建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) { 
    } 
} 

第三步:註冊新的斯波克擴展

  • 在類路徑或資源路徑創建以下文件夾結構META-INF/services/org.spockframework.runtime.extension.IGlobalExtension
  • 將此作爲文件的內容com.example.spock.exetension.MySpockExtension

第4步:運行你的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 
+0

哇,謝謝。我需要導入什麼來使用'ETESpockRunListener.class'? – WontonJon

+0

該聲明可以被刪除。仍應按預期工作。我編輯了回答,以刪除該陳述並消除任何混淆 –

+0

對不起,這對我來說有點高級。我是否將這些類添加到spock jar中,還是可以將它們放在我的項目中? – WontonJon

2

捎帶上@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()將打印塊的組合文本。

例子:

給出: 「我醒了」 和: 「我喝了一杯咖啡」

將顯示爲

SETUP: 「我醒了」,「我喝了一杯咖啡「]

相關問題