2016-07-01 2 views
3

Я хочу, чтобы иметь возможность регистрировать имена функций и имена предложений при выполнении некоторых автоматических тестов. Это поможет с отладкой тестовых проблем при использовании безгласного браузера для автоматизации, в частности, phantomjs. Причина в том, что 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" 
     ... 
} 

Например, было бы здорово, если бы я мог получить выше пример метода функции Спока для входа метки, как это.

Login logout test 
Go to login page 
Submit username and password 
logout 
Returned to login page 

ответ

1

После постоянного поиска я нашел это solution для получения тестового имени. Но, похоже, ничего не может найти на этикетках «когда» и «потом». Сейчас все в порядке.

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

Шаг1: Создайте свое собственное расширение Спка Класс

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

    } 
} 

Шаг2: Создать 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) { 
    } 
} 

Step3: Зарегистрируйте ваше новое расширение Спок

  • В вашем пути к классам или ресурсов путем создания ниже структуры папок META-INF/services/org.spockframework.runtime.extension.IGlobalExtension
  • Имейте это в качестве содержимого файла com.example.spock.exetension.MySpockExtension

Шаг 4: Запустите тест на спотку, и вы должны увидеть результат примерно так.

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

Извините, для меня это немного продвинуто. Я добавляю эти классы в банку спока или могу сохранить их в своем проекте? – WontonJon

2

Спекуляция на @Raghu Kirans ответ, я должен был сделать немного больше, чтобы получить это, чтобы бежать так, что я хотел с Driven данных испытаний. В методе BeforeIteration вашего RunListener я сделал следующее:

@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()))); 
} 

Это просто печатает все перед каждой итерации. Также обратите внимание, что getKind(). Name() в объекте BlockInfo не распечатывает данный, когда, а затем блок спока в нашем тесте, вместо этого вместо этого выводит SETUP, WHEN, THEN и WHERE. getTexts() распечатает комбинированные тексты блока.

Пример:

Дано: "Я просыпаюсь" и: "Я выпить чашечку кофе"

будет отображаться как

НАСТРОЙКИ: [ "Я просыпаюсь", " Я пью чашку кофе "]