выполнение одних и тех же тестов для разных классов в groovy и spock

В настоящее время я пытаюсь запустить одни и те же тестовые примеры для двух разных классов, но у меня проблемы с setup(), я вижу похожие вопросы, но не видел решения для заводного тестирования с помощью Spock, и я не смог понять это.

Таким образом, я, по сути, решаю одну и ту же проблему, используя 2 разных метода, поэтому одни и те же тестовые примеры должны быть применимы к обоим классам, я стараюсь не повторяться (DRY).

Итак, я настроил MainTest как абстрактный класс, а MethodOneTest и MethodTwoTest — как конкретные классы, расширяющие абстрактный MainTest:

import spock.lang.Specification
abstract class MainTest extends Specification {
    private def controller

    def setup() {
        // controller = i_dont_know..
    }

    def "test canary"() {
        expect:
        true
    }

    // more tests
}

Мои конкретные классы выглядят примерно так:

class MethodOneTest extends MainTest {
    def setup() {
        def controller = new MethodOneTest()
    }
}

class MethodTwoTest extends MainTest {
    def setup() {
        def controller = new MethoTwoTest()
    }
}

Итак, кто-нибудь знает, как я могу запустить все тесты в абстрактном MainTest из моих конкретных классов MethodOneTest и MethodTwoTest? Как правильно создать экземпляр установки? Я надеюсь, что я ясно.


person ArmYourselves    schedule 06.04.2013    source источник


Ответы (1)


Просто забудьте о настройке контроллера. Все тесты из суперкласса будут автоматически выполняться при выполнении тестов для конкретного класса. Например.

import spock.lang.Specification
abstract class MainTest extends Specification {
    def "test canary"() {
        expect:
        true
    }

    // more tests
}

class MethodOneTest extends MainTest {

    // more tests
}

class MethodTwoTest extends MainTest {

    // more tests
}

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

import spock.lang.Specification
abstract class MainSpecification extends Specification {
    @Shared 
    protected Controller controller

    def "test canary"() {
        expect:
        // do something with controller
    }

    // more tests
}

class MethodOneSpec extends MainSpecification {
    def setupSpec() {
        controller = //... first instance
    }

    // more tests
}

class MethodTwoSpec extends MainSpecification {
    def setupSpec() {
        controller = //... second instance
    }

    // more tests
}
person sody    schedule 06.04.2013
comment
Отличный ответ. Работал отлично для меня. Я тестирую библиотеку структур данных, в которой я делаю несколько реализаций похожих структур, списков, стеков, очередей, и это сэкономило мне сотни строк повторяющегося кода, потому что я могу проверить все общие свойства с помощью этого метода. Большое спасибо! - person Jabari Dash; 16.04.2018