2017-01-05 2 views
1

Я пишу тесты Spock + Geb для тестирования веб-сайтов. Веб-сайт используется для создания предложений, и в дальнейшем на них могут выполняться различные действия (подтверждение, отклонение, снятие). Я уже создал рабочий сценарий для создания предложения. Но теперь, когда я пришел к выводу, что мне нужно реализовать сценарии для различных комбинаций действий, я хотел бы иметь возможность повторно использовать «создать предложение» в этих других сценариях. К сожалению, я не могу найти какой-либо пример или хорошо подумать, как это сделать. Может ли кто-нибудь дать мне какие-нибудь идеи об этом?Как повторно использовать код в тестах Spock

Кстати, мне нужно выполнить действия в предопределенной последовательности, поэтому я использую Пошаговое аннотация по моим спецификациям.

ответ

1

Single Page Действие:

Трудно сказать, не видя примеры кода, но один из способов сделать это, чтобы определить методы для ваших действий (подтвердить, отклонить, снять), как простые методы в вашем класс Page:

class ActionsPage extends Page { 

    static content = { 
    //Page content here 
    } 

    def confirm(){ 
    //Code to perform confirm action on the page 
    } 

    def reject(){ 
    //Code to perform reject action on the page 
    } 

Тогда в классе спецификации вы можете сделать

def "Test confirm action"(){ 
    when: "we go to the actions pages" 
    to ActionsPage 

    and: "we perform a confirm action" 
    confirm() 

then: "something happens" 
//Code which checks the confirmation worked 
} 

Это работает, потому что Геб использует метод Groovy, отсутствующий материал, чтобы найти имя метода на текущей странице под названием «confirm()» и выполнит этот код.

Несколько страниц Действия:

Если действия сложны и включают навигации по нескольким страницам, то лучше всего создать абстрактный базовый класс для тестов, которые необходимо выполнить действия:

//Not @Stepwise 
abstract class BaseActionsSpec extends Specification { 

    //Note: don't use Spock when/then blocks in these methods as they are not feature methods 
    protected void confirm(){ 
    //Code to perform multi-page action 
    } 

    protected void reject(){ 
    //Code to perform multi-page action 
    } 
} 

Затем распространяющиеся классы:

@Stepwise 
class ConfirmActionSpec extends BaseActionsSpec{ 

     def "Test confirm action"(){ 
     when: "we go to the actions pages" 
     to ActionsPage 

     and: "we perform a confirm action" 
     confirm() //calls method in super class 

     then: "something happens" 
     //Code which checks the confirmation worked 
    } 
} 
+0

Благодарим за ответ. На самом деле эти действия не так просты, но они состоят из потока действий на разных веб-страницах. Вот почему я хотел бы реализовать их в виде отдельных спецификаций, а позже есть возможность каким-то образом включить их в другие спецификации. Можно ли добавить новые функции в спецификации с помощью расширения? – MantasG

+0

Итак, это решение подходит только для действий с одной страницей, поэтому я добавлю еще одно решение, которое будет работать для вас. – jk47

+1

Кстати, аннотация @Stepwise не поддерживает наследование, поэтому, если у вас есть функции в суперклассе , порядок, который они выполняются в отношении функций подкласса, не определен. Мне пришлось написать пользовательское расширение Spock, чтобы получить поведение (проприетарный код, хотя извините), который вы хотите здесь. Я рекомендую просто переместить код действия из функций и в вспомогательные методы, как показано в моем ответе. – jk47