测试报告

https://github.com/renatoathaydes/spock-reports
image.png

类Gradle风格的测试报告

https://github.com/tprado/damage-control-report
image.png

参数化数据生成器

https://github.com/Bijnagte/spock-genesis

  1. @Unroll
  2. def 'test reverse #string'() {
  3. when:
  4. def reversed = string.reverse()
  5. then:
  6. reversed.size() == string.size()
  7. if (string) {
  8. string.eachWithIndex { letter, i ->
  9. letter == reversed[-(i + 1)]
  10. }
  11. }
  12. reversed.reverse() == string
  13. where:
  14. string << Gen.these('', 'foo').then(Gen.string).take(10000)
  15. }
    Gen.type(Person,
        id: Gen.integer(200..10000),
        name: Gen.string(~/[A-Z][a-z]+( [A-Z][a-z]+)?/),
        birthDate: Gen.date(Date.parse('MM/dd/yyyy','01/01/1940'), new Date()),
        title: Gen.these('', null).then(Gen.any('Dr.', 'Mr.', 'Ms.', 'Mrs.')),
        gender: Gen.character('MFTU'))

Arquillian测试套件

https://github.com/arquillian/arquillian-testrunner-spock

 <dependency>
     <groupId>org.jboss.arquillian.spock</groupId>
     <!-- replace * with standalone or container, according to your needs -->
     <artifactId>arquillian-spock-*</artifactId>
     <version>${project.version}</version>
     <scope>test</scope>
 </dependency>

 <!-- External Projects -->
 <dependency>
     <groupId>org.spockframework</groupId>
     <artifactId>spock-core</artifactId>
     <version>${version.spock}</version>
     <scope>test</scope>
 </dependency>

 <dependency>
     <groupId>org.codehaus.groovy</groupId>
     <artifactId>groovy-all</artifactId>
     <version>${version.groovy}</version>
     <scope>test</scope>
 </dependency>
 @Deployment
 def static JavaArchive "create deployment"() {
     return ShrinkWrap.create(JavaArchive.class)
             .addClasses(AccountService.class, Account.class, SecureAccountService.class)
             .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
 }

 @Inject 
 AccountService service

 def "transferring between accounts should result in account withdrawal and deposit"() {
      when:
      service.transfer(from, to, amount)

      then:
      from.balance == fromBalance
      to.balance == toBalance

      where:
      from <<         [new Account(100),  new Account(10)]
      to <<           [new Account(50),   new Account(90)]
      amount <<       [50,                10]
      fromBalance <<  [50,                0]
      toBalance <<    [100,               100]
 }

PowerMock模拟静态类/方法

https://github.com/powermock/powermock

InjectMocks依赖注入

https://github.com/marcingrzejszczak/spock-subjects-collaborators-extension

Maven

<repositories>
    <repository>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <id>central</id>
        <name>bintray</name>
        <url>http://jcenter.bintray.com</url>
    </repository>
</repositories>
<dependency>
      <groupId>com.blogspot.toomuchcoding</groupId>
      <artifactId>spock-subjects-collaborators-extension</artifactId>
      <version>1.2.2</version>
      <scope>test</scope>
</dependency>

Gradle

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    testCompile 'com.blogspot.toomuchcoding:spock-subjects-collaborators-extension:1.2.2'
}
package com.blogspot.toomuchcoding.spock.subjcollabs

import spock.lang.Specification
import com.blogspot.toomuchcoding.spock.subjcollabs.Collaborator
import com.blogspot.toomuchcoding.spock.subjcollabs.Subject

class ConstructorInjectionSpec extends Specification {

    public static final String TEST_METHOD_1 = "Test method 1"

    SomeOtherClass someOtherClassNotToBeInjected = Mock()

    @Collaborator
    SomeOtherClass someOtherClass = Mock()

    @Subject
    SomeClass systemUnderTest

    def "should inject collaborator into subject"() {
        given:
        someOtherClass.someMethod() >> TEST_METHOD_1

        when:
        String firstResult = systemUnderTest.someOtherClass.someMethod()

        then:
        firstResult == TEST_METHOD_1
        systemUnderTest.someOtherClass == someOtherClass
    }


    class SomeClass {
        SomeOtherClass someOtherClass

        SomeClass(SomeOtherClass someOtherClass) {
            this.someOtherClass = someOtherClass
        }
    }

    class SomeOtherClass {
        String someMethod() {
            "Some other class"
        }
    }

}

Retry重试扩展

https://github.com/anotherchrisberry/spock-retry

class ExampleSpec extends Specification {

    @RetryOnFailure
    void 'does something'() {
        // will try to run twice before failing
    }
}

dbUnit数据库单元测试

https://github.com/janbols/spock-dbunit

class MyDbUnitTest extends Specification{

        DataSource dataSource

        @DbUnit
        def content =  {
            User(id: 1, name: 'jackdaniels', createdOn: '[NOW]')
        }
}

安卓扩展

https://github.com/AndrewReitz/android-spock

Gherkin支持

https://github.com/cucumber/common
http://pease.github.io/

Serenity支持

https://github.com/serenity-bdd

Allure支持

http://allure.qatools.ru/
https://github.com/allure-framework/allure-spock