Как настроить и удалить данные функционального тестирования в Geb Grails

У меня есть много рабочих/проходящих функциональных тестов geb/spock (каждый из которых расширяет GebReportingSpec), которые тестируют веб-приложение с тестовыми данными, созданными из BootStrap.groovy в начале набора функциональных тестов.

Я хочу переместить создание тестовых данных в методы startup() / teardown() в каждой спецификации, ну, на самом деле я хотел, чтобы они наследовали их от базового класса, но, очевидно, у StepWise есть проблемы с наследованием.

Итак, в настоящее время каждый из моих тестовых спецификаций выглядит примерно так:

@Stepwise
class ExampleSpec extends GebReportingSpec {

    def "valid root user logs in"() {

        given: "I am at the login page"
        to LoginPage

        when: "I enter root's credentials"
        username = "root"
        password = "password"

        and: "I click the login button"
        loginButton.click()

        then: "I am logged in and directed to the welcome page"
        at WelcomePage
    }
}

Теперь моя проблема в том, что я не могу создать новый тест (выше первого теста), который может создавать тестовые данные. Без действительного оператора «данный/когда/тогда» тест не выглядит выполненным, и вызов метода из существующего теста также не работает. Я изучил плагин grails-remote-control, чтобы помочь мне, и я считаю, что это позволит мне успешно вызывать замыкания для настройки данных, но я не уверен в лучшем механизме для вызова этого из GebReportSpecs (или какой-то абстрактный родитель) .

Ниже приведен краткий обзор того, что я хочу сделать, либо сделав 'setupData()' первым тестом, либо вызвав этот метод из теста... Ни один из них не работает.

def remote = new RemoteControl()
def setupData() {

    def id = remote {        
        def ShiroUser user = new ShiroUser(username: "root", ...)
        user.save()
        user.id
   }
   println(id)
}

.... Tests then follow

Существуют ли какие-либо аннотации, такие как @before и т. д., которые могут вызвать вызов этих методов?

Любые предложения приветствуются.

Решение: я принял ответ dmahapatro ниже с правильным ответом, но также предоставил пример моего окончательного решения ниже для тех, кто может найти его полезным.


person John Dalton    schedule 17.06.2013    source источник
comment
вместо того, чтобы помещать свое решение в вопрос, вам, вероятно, следует добавить его как отдельный ответ... meta.stackexchange.com/questions/17845/   -  person AndrewW    schedule 27.01.2014
comment
Спасибо, AndrewW, обновлено, как было предложено.   -  person John Dalton    schedule 30.01.2014


Ответы (2)


(Не проверено)
GebReportingSpec расширяет GebSpec, который в конечном итоге расширяет spock.lang.Specification, имеющий Методы фиксации.

Вы можете использовать их как:

@Stepwise
class ExampleSpec extends GebReportingSpec {
    def setupSpec(){
       super.setupSpec()
       //setup your data
    }

    def cleanupSpec(){
       super.cleanupSpec()
       //I do not think you would need anything else here
    }

    def "This is test 1"(){

    }

    def "This is test 2"(){

    }
}

Вы не можете использовать настройку в качестве одного из методов тестирования, потому что состояние не поддерживается для одного тестового примера. Это происходит так: -

setup called -> test1 -> teardown called  
setup called -> test2 -> teardown called  
setup called -> test3 -> teardown called  
.........
person dmahapatro    schedule 18.06.2013
comment
Это верно только с одним примечанием — вам не нужно явно вызывать родительские setupSpec() и cleanupSpec(), поскольку Спок вызывает их по умолчанию для вас. - person erdi; 19.06.2013
comment
@erdi Это относится ко всем средам тестирования, таким как JUnit, Spock, Mockito. Я имел в виду именно это, может быть, словоблудие сбило с толку. Спасибо, что указали на это в любом случае. :) - person dmahapatro; 19.06.2013
comment
Спасибо, удалось заставить это работать сейчас и с помощью плагина Remote Control. Единственное, что следует отметить, это то, что я не думаю, что установка/разборка выполняется вокруг каждого теста, это происходит вокруг каждой спецификации. Хотя, возможно, это то, что вы имели в виду, и я неправильно прочитал. Я добавил свое решение к исходному вопросу. - person John Dalton; 28.06.2013
comment
предложенное решение работает!! мы можем вызвать GORM в методе setupSpec... например: def setupSpec() { def random = RandomStringUtils.randomAlphabetic(5) new Person(firstName: random,lastName: random,enabled: true).save(flush: true,failOnError : true) def person = Person.findAll() } - person Ben W; 13.09.2013


## Решено ##

Спасибо dmahapatroerdi). Я особо не упомянул setupSpec() и cleanup(), поскольку они являются частными в GebReportingSpec.

Просто для завершения я собираюсь опубликовать упрощенную версию моего окончательного решения, используя плагин удаленного управления Grails на всякий случай, это поможет кому-то еще. Единственное, что следует отметить, это то, что установка/разборка вызывается один раз для каждой спецификации, а не перед каждым тестом. Что для меня на самом деле предпочтительнее, поскольку мои тестовые данные довольно сложны и требуют времени для создания. Таким образом, у вас есть набор тестовых данных из спецификации, который изменяется с помощью тестов в спецификации, а затем, наконец, очищается перед выполнением вашей следующей спецификации.

@Stepwise
class TestDataBaseSpec extends GebReportingSpec {

    protected void createTestUsers() {

        def remote = new RemoteControl()
        def created = remote {

        def createUser = { name, roles, pwHash ->
            def user = new ShiroUser(username: name, passwordHash: pwHash, passwordSetDate: new Date())
            roles.each { user.addToRoles(it) }
            user.save(failOnError: true)
            return user
        }

        createUser("root", [ShiroRole.findByName("base_user")], pwHash)
        // .. repeat for more
        }
    }

    protected void deleteTestUsers() {

        def remote = new RemoteControl()
        def created = remote {
            ShiroUser.findAll().each {
                it.delete(flush: true)
            }
            return true
        }
    }
}

@Stepwise
class ExampleSpec extends TestDataBaseSpec {

    def setupSpec() {
        super.createTestUsers()
    }

    def cleanupSpec() {
        super.deleteTestUsers()
    }

    def "valid root user logs in"() {

        given: "I am at the login page"
        to LoginPage

        when: "I enter root's credentials"
        username = "root"
        password = "password"

        and: "I click the login button"
        loginButton.click()

        then: "I am logged in and directed to the welcome page"
        at WelcomePage
    }
}
person John Dalton    schedule 30.01.2014