うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

Spockのテストレポートが想像以上に凄い件について

タイトルはホッテントリメーカーを使いました。http://pha22.net/hotentry/tb/r?word=Spock%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88&phrase=9

全国49万のSpockユーザのみなさま。SpockのMLを見ていると思うので、ご存知かもしれませんがSpockのテストレポートをご存知でない方もいると思うので紹介します。

Spockのテスト結果はだいたいみんなGradleで見ている

Spockは言わずと知れたUnitTestingFramework界最強といわれるテスティングフレームワークですが、これのテストレポートは通常はJUnitのテストレポートXMLであり、多くのSpockユーザはGradleでビルドをしてGradleが生成するテストレポートを見ている事かと思います。

ですが、私は常々困り果てていて、つまりSpockはBDDを強く支援するテスティングフレームワークであるのに、テストレポートには活かされていないということでした。(JUnitのテストレポートXMLがクソだから仕方ない。)

Spock-Reports

そこで私はいつもオリジナルテストランナーを書いて、状態遷移図やテストレポートを生成していたのですが、実は素晴らしいOSSがあったのです。

それはSpock-Reportsです。見たほうが早いでしょう。ということで、実行結果のスクリーンショットは次の通りです。

renatoathaydes/spock-reports · GitHub

サマリー画面

f:id:kyon_mm:20140806131536p:plain

テストクラス毎の詳細画面

f:id:kyon_mm:20140806131540p:plain

使い方

ビルドスクリプトから使うことを前提としてます。

Gradleならこんな感じです。

repositories {
    jcenter()
}

dependencies {
    compile "org.codehaus.groovy:groovy-all:2.3.+:indy"
    testCompile "org.spockframework:spock-core:0.7-groovy-2.0"
    testCompile "com.athaydes:spock-reports:1.2" // ←これを追加する感じ
}

Spock-ReportsはGroovy2.0以上、Spock0.7以上が必須です。

今回のテストコードはだいたいこんな感じです。(クソなコードだけど、出力用なのでゆるして。)

package org.kyonmm

import spock.lang.Specification

class WhenAddingProductBacklogItem extends Specification {
    def "All ProductBacklogItem should be sorted by Priority"() {
        given: "Product Backlog has 3 PBIs"
        when: "Product Owner add 1 PBI into Product Backlog"
        then: "All PBI is sorted by Priority "
        (PB + PBI).sort().last() == "c"
        where:
        PB              | PBI
        ["a", "b", "c"] | "bb"
        ["a", "b", "c"] | "cc"
    }
    def "High Priority ProductBacklogItems should be estimated"() {
        given: "Product Backlog has 3 PBIs"
        when: "Product Owner add 1 PBI into Product Backlog"
        then: "Half of All PBIs is estimated"
        where:
        PB              | PBI
        ["a":1, "b":null, "c":null] | ["ab":5]
        ["a":1, "b":null, "c":null] | ["ab":5]
    }
}

だいたいの説明

各画面を見るとわかると思いますが、言葉としては次のようなイメージです。(つまりこれはBDDを強く意識している)

  • 各テストクラス -> Specification
  • 各テストメソッド -> Feature
  • テストメソッド内テーブル -> examples

まとめ

BDDスタイルにSpockを使うことやレビューしやすさをあげるなら、Spock-Reportsを使わないと損です。

プログラミングGROOVY

プログラミングGROOVY

Bdd in Action: Behavior-driven Development for the Whole Software Lifecycle

Bdd in Action: Behavior-driven Development for the Whole Software Lifecycle

The RSpec Book (Professional Ruby Series)

The RSpec Book (Professional Ruby Series)