在groovy和spock中为不同的类运行相同的测试

时间:2013-04-06 02:00:52

标签: unit-testing testing groovy tdd spock

我目前正在尝试为2个不同的类运行相同的测试用例但是遇到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()
    }
}

所以有人知道如何从我的具体类MethodOneTest和MethodTwoTest中抽象MainTest中运行所有测试吗?如何正确实例化设置?我希望我很清楚。

1 个答案:

答案 0 :(得分:2)

忘记控制器设置。当您执行具体类的测试时,将自动执行来自超类的所有测试。 E.g。

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
}