SlideShare ist ein Scribd-Unternehmen logo
1 von 90
Downloaden Sie, um offline zu lesen
Spock入門 
G* ワークショップ Z 札幌 2014 
2014/09/27
お前誰よ 
• 名前:杉浦孝博 
• twitter : @touchez_du_bois 
• 昼のお仕事: 
Grailsアプリ、C#アプリ、VB.NETアプリの保守 
とあるサイトの運用、保守 
時々開発
Today’s 
Goal. 
(本日の目標)
本日の目標 
• Spockってどんなもんか、 
「なんとなく」わかった気になる。 
• Spockを使ってみたくなる。
Today’s 
Contents 
(本日の内容)
本日の内容 
• 入門編 
• Spockとは 
• Spockの利点 
• 構造 
• Power Assert 
• データ駆動テスト 
• 相互作用中心のテスト
本日の内容 
• その他 
• Spockの拡張機能 
• Spockのモジュール 
• Spockと一緒に 
• まとめ
Introduction 
(入門)
What’s 
Spock? 
(Spockとは)
Spockとは 
• Java, Groovy向けの、テスト・仕様 
フレームワーク。 
• たいていのIDE、ビルドツール、CI 
サーバで使用可能。
Spockのバージョン 
• 安定バージョンは0.7。 
• スナップショットで1.0がある。 
• groovy 1.xと2.x用がある。
使い所 
• JavaやGroovyで作成したクラスの 
テストに。 
• TDD(Test Driven Development)のフ 
レームワークとして。 
• BDD(Behavior Driven Development) 
のフレームワークとして。
Advantages 
of Spock 
(Spockの利点)
Structure 
(構造)
構造 
• クラス内の構造が決まっている。 
• 役割ごとにメソッドが分かれている。 
• メソッドの中も役割ごとに分かれてい 
る。 
⇒ 読みやすい構造、書きやすい構造。
Spockの構成要素 
• Specification 
• Fields 
• Fixture Methods 
• Feature Methods 
• Blocks 
• Helper Methods
Specification 
• 対象クラスのテスト内容・仕様を記述。 
• spock.lang.Specificationクラスを継 
承。 
import spock.lang.* 
! 
class TargetClassSpec extends Specification { 
// Fields 
// Fixture Methods 
// Feature Methods 
// Helper Methods 
}
Fields 
• テストで使用するオブジェクトを宣言。 
• Featureメソッド実行ごとに初期化され 
るため、基本的に、インスタンス変数は 
Featureメソッド間で共有できない。 
• 共有したい場合、@Sharedを付ける。 
@Shared 
def stack = new Stack()
Fixture Methods 
• テストの準備(setup)、後始末(cleanup) 
を行う。 
def setup() {} // 各Featureメソッドの実行前に実行 
def cleanup() {} // 各Featureメソッドの実行後に実行 
def setupSpec() {} // 最初のFeatureメソッドの実行前に実行 
def cleanupSpec() {} // 最後のFeatureメソッドの実行後に実行
Feature Methods 
• テストの内容、仕様の内容を記述。 
• 4つのフェーズからなり、それぞれBlock 
を記述。 
• Setup(前処理、前提条件) 
• Stimulus(実行) 
• Response(検証) 
• Cleanup(後処理)
Block 
• フェーズに応じた、テスト、仕様のコー 
ドを記述。 
• setup: / given: 
• when: 
• then: 
• expect: 
• cleanup: 
• and: 
• where:
BlockとPhase 
Block Phase 
setup: / given: Setup 
when: Stimulus 
then: Response 
expect: Stimulus + Response 
cleanup: cleanup 
where: - 
and: -
when~thenの例 
def "push後のサイズは1"() { 
setup: 
def stack = new Stack<Integer>() 
when: 
stack.push(5) 
then: 
stack.size() == 1 
}
expectの例 
def "10と20で大きいのは20"() { 
expect: 
Math.max(10, 20) == 20 
}
Helper Methods 
• Featureメソッドが大きくなった場合 
に、意味がある内容をメソッド化する。 
• setupやcleanupも処理が大きくなった 
場合に、メソッド化する。
Advantages 
of Spock 
(Spockの利点)
Power 
Assert 
(ぱわーあさーと)
Power Assert 
• テスト・仕様の内容を満たさない場合、 
各部分式の値を表示する。 
• SpockからGroovy本体に取り込まれ 
た。 
⇒ どこが違うか、どこから違うか、 
  ということが、比較的わかりやすい。
Power Assert 
def "maximum of two numbers"() { 
setup: 
def a = 2 
def b = 1 
def c = 1 
expect: 
Math.max(a, b) == c 
}
Power Assert 
Math.max(a, b) == c 
| | | | | 
2 2 1 | 1 
false
Power Assert 
@Unroll 
def "str1 == str2"() { 
setup: 
def str1 = "abcdefghijklmnopqrstuvwxyz" 
def str2 = "abcdefghijk1mnopqrstuvwxyz" 
expect: 
str1 == str2 
}
Power Assert 
str1 == str2 
| | | 
| | abcdefghijk1mnopqrstuvwxyz 
| false 
| 1 difference (96% similarity) 
| abcdefghijk(l)mnopqrstuvwxyz 
| abcdefghijk(1)mnopqrstuvwxyz 
abcdefghijklmnopqrstuvwxyz
Advantages 
of Spock 
(Spockの利点)
Data Driven 
Testing 
(データ駆動テスト)
データ駆動テスト 
• 入力値と期待する結果の組み合わせを検 
証するために、同じテスト・仕様のコー 
ドを複数回実行したい場合に効果的。 
• コードとデータを分離。 
• コードを安易に複製しないで済む。 
• データを自動生成したり、外部リソース 
から読み込んだりできる。
よくある例 
• 入力値と期待値が異なるがコードは同じ。 
def "maximum of two numbers"() { 
expect: 
Math.max(1, 3) == 3 
Math.max(7, 4) == 4 
Math.max(0, 0) == 0 
}
データテーブル 
• コードとデータを分離。 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
a | b | c // データ変数 
1 | 3 | 3 // データ行 
7 | 4 | 7 // 〃 
0 | 0 | 0 // 〃 
} 
// Math.max(1, 3) == 3 
// Math.max(7, 4) == 7 
// Math.max(0, 0) == 0 
// の3イテレーション実施。
データテーブル 
• 入力値と期待値を(多少)わかりやすく。 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
a | b || c // データ変数 
1 | 3 || 3 // データ行 
7 | 4 || 7 // 〃 
0 | 0 || 0 // 〃 
}
どこが失敗? 
• 何回目のイテレーションで失敗したか 
わからない。 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
a | b || c 
1 | 3 || 3 
7 | 4 || 4 
0 | 0 || 0 
} 
maximum of two numbers FAILED 
! 
Condition not satisfied: 
! 
Math.max(a, b) == c 
| | | | | 
7 7 4 | 4 
false
@Unroll 
• @Unrollを付けたメソッドまたはクラス 
は、イテレーション毎にレポートされる。 
@Unroll 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
a | b || c 
1 | 3 || 3 
7 | 4 || 4 
0 | 0 || 0 
} 
maximum of two numbers[0] PASSED 
maximum of two numbers[1] FAILED 
! 
Math.max(a, b) == c 
| | | | | 
7 7 4 | 4 
false 
! 
maximum of two numbers[2] FAILED
もう少しわかりやすく 
• メソッド名にプレースホルダを使うこと 
で、レポート結果がわかりやすく。 
@Unroll 
def "maximum of #a and #b is #c"() { 
expect: 
Math.max(a, b) == c 
where: 
a | b || c 
1 | 3 || 3 
7 | 4 || 4 
0 | 0 || 0 
} 
maximum of 1 and 3 is 3 PASSED 
maximum of 7 and 4 is 4 FAILED 
! 
Math.max(a, b) == c 
| | | | | 
7 7 4 | 4 
false 
! 
maximum of 0 and 0 is 0 FAILED
データパイプ 
• データ変数ごとにデータプロバイダを用 
意し、<<演算子で接続する。 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
a << [ 1, 7, 0 ] 
b << [ 3, 4, 0 ] 
c << [ 3, 7, 0 ] 
} 
// Collectionだけでなく、テキストファイルやデータベースなど、 
// 外部リソースから取得することも可能。
データパイプで複数の値 
• データプロバイダが複数の値を返す場合、 
複数のデータ変数に同時に接続可能。 
@Shared sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver") 
! 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
[a, b, c] << sql.rows("select a, b, c from maxdata") 
}
データ変数へ代入 
• データ変数に直接値を代入することも可 
能。 
def "maximum of two numbers"() { 
expect: 
Math.max(a, b) == c 
where: 
a = 3 
b = Math.random() * 100 
c = a > b ? a : b 
}
Advantages 
of Spock 
(Spockの利点)
Interaction 
Based Testing 
(相互作用中心のテスト)
相互作用中心のテスト 
• Publish - Subscribeのように、 
オブジェクト同士の振る舞いをテスト・ 
仕様化したい場合。 
• 相互作用相手について、 
本物のオブジェクトを使うこともあるが、 
モックオブジェクトを使うこともある。
モックフレームワークの提供 
• 簡単に相互作用中心のテストを書けるよ 
うに、Spock独自のモックフレームワー 
クを提供。 
• JMock, EasyMock, Mockitoといった既 
存のモックフレームワークと一緒に使う 
ことも可能。
Spockでは 
• Spockでは、次の3つの方法を用意。 
• モック(Mock) 
• スタブ(Stub) 
• スパイ(Spy)
プログラム例 
class Publisher { 
List<Subscriber> subscribers = [] 
void send(String message) { 
subscribers.each { 
it.receive(message) 
} 
} 
void send(Event event) { 
subscribers.each { 
it.receive(event) 
} 
} 
} 
! 
interface Subscriber { 
void receive(String message) 
void receive(Event event) 
}
モックオブジェクトの作成 
• Mockメソッドで作成 
// モックオブジェクトのインタフェース(クラス)を指定して作成 
def subscriber = Mock(Subscriber) 
! 
// 変数の型からモックオブジェクトのインタフェース(クラス)の 
// 型を推論 
Subscriber subscriber = Mock()
モックオブジェクトの準備 
• 例えば、こんな感じで。 
class PublisherSpec extends Specification { 
Publisher publisher = new Publisher() 
Subscriber subscriber1 = Mock() 
Subscriber subscriber2 = Mock() 
! 
def setup() { 
publisher.subscribers << subscriber1 
publisher.subscribers << subscriber2 
} 
}
モッキング 
• テスト/仕様対象のオブジェクトと、相互 
作用するオブジェクトの間の、インタラ 
クション(相互作用)を宣言すること。 
def "should send messages to all subscribers"() { 
when: 
publisher.send("hello") 
! 
then: 
1 * subscriber1.receive("hello") 
1 * subscriber2.receive("hello") 
}
インタラクション 
• 多重度(cardinality)、対象制約(target 
constraint)、メソッド制約(method 
constraint)、引数制約(argument 
constraint)からなる。 
1 * subscriber.receive("hello") 
| | | | 
| | | argument constraint 
| | method constraint 
| target constraint 
cardinality
多重度 
• 何回メソッド呼び出しが行われるかを指 
定する。 
• 固定の数値や範囲を指定可能。 
1 * subscriber.receive("hello") // 1回 
0 * subscriber.receive("hello") // 0回 
(1..3) * subscriber.receive("hello") // 1〜~3回 
(1.._) * subscriber.receive("hello") // 1回以上 
(_..3) * subscriber.receive("hello") // 3回以下 
_ * subscriber.receive("hello") // 0回以上
対象制約 
• どのオブジェクト(モックオブジェクト) 
を対象にするかを指定する。 
1 * subscriber1.receive("hello") // subscriber1に対して 
1 * _.receive("hello") // 任意のモックオブジェクト
メソッド制約 
• どのメソッド呼び出しを対象にするかを 
指定する。 
1 * subscriber.receive("hello") // receiveメソッド 
1 * subscriber._("hello") // 任意のメソッド 
1 * subscriber./r.*e/("hello") // rで始まりeで終わるメソッド
引数制約 
• どんな引数を期待するかを指定する。 
// 引数が"hello"という文字列 
1 * subscriber.receive("hello") 
// 引数が"hello"という文字列ではない 
1 * subscriber.receive(!"hello") 
// 引数なし 
1 * subscriber.receive() 
// 1引数(nullも含む) 
1 * subscriber.receive(_) 
// 任意の引数 
1 * subscriber.receive(*_) 
// nullではない 
1 * subscriber.receive(!null) 
// String型の引数(nullは含まれない) 
1 * subscriber.receive(_ as String) 
// 指定された条件を満たす引数 
1 * subscriber.receive({ it.size() > 3 })
スタビング 
• 特定のメソッド呼び出しに対する応答を 
宣言すること。 
• 何回呼ばれても、特定の値を返したり、 
何らかの副作用が働くようにする。
スタビング 
• モッキングに比べ、多重度の指定がない 
代わりに、レスポンスジェネレータ 
(Response Generator)を指定する。 
subscriber1.receive(_) >> "ok" 
| | | | 
| | | response generator 
| | argument constraint 
| method constraint 
target constraint
スタビングの例 
interface Subscriber { 
def setup() { 
publisher.subscribers << subscriber1 
publisher.subscribers << subscriber2 
! 
// receiveメソッドの戻り値は常に"ok"とする 
subscriber1.receive(_) >> "ok" 
subscriber2.receive(_) >> "ok" 
} 
// String型の値を返すように変更 
String receive(String message) 
String receive(Event message) 
}
一連の値を返す 
• >>>演算子の後に、リストなどイテレー 
ティブな値を指定する。 
// 1回目: "ok" 
// 2回目: "error" 
// 3回目: "error" 
// 4回目以降: "ok" 
subscriber1.receive(_) >>> ["ok", "error", "error", "ok"]
動的に値を返す 
• >>演算子の後に、動的な値を返すクロー 
ジャを指定する。 
subscriber1.receive(_) >> { String message -> 
message.size() > 3 ? "ok" : "fail" 
}
副作用の実行 
• >>演算子の後のクロージャ中に、副作用 
としての処理を記述する。 
subscriber1.receive(_) >> { String message -> 
println message 
throw new InvalidArgumentException() 
}
組み合わせ 
• モッキングとスタビングを組み合わせて 
使うことも可能。 
1 * subscriber1.receive("message1") >> "ok" 
1 * subscriber2.receive("message2") >> "fail"
スタブオブジェクトの作成 
• Stubメソッドで作成する。 
• Mockメソッドで作成した場合、モッキ 
ングもスタビングもできるが、Stubメ 
ソッドで作成した場合はスタビングのみ。 
// スタブオブジェクトのインタフェース(クラス)を指定して作成 
def subscriber = Stub(Subscriber) 
! 
// 変数の型からスタブオブジェクトのインタフェース(クラス)の 
// 型を推論 
Subscriber subscriber = Stub()
スパイ 
• 本物のオブジェクトを監視して、モッキ 
ングやスタビングを行う。 
• メソッド呼び出しは、本物のメソッド呼 
び出しに移譲され、その際の戻り値がス 
パイを経由して返される。
スパイオブジェクトの作成 
• Spyメソッドで作成 
// スパイ対象のクラスを指定して作成 
def subscriber = 
Spy(SubscriberImpl, constructorArgs: ["Fred"])
スパイでのスタビング 
• スパイで普通にスタビングを行うと、本 
物のメソッドが呼ばれなくなる。 
// スパイ対象のクラスを指定して作成 
def subscriber = 
Spy(SubscriberImpl, constructorArgs: ["Fred"]) 
! 
// スタビング。本物のreceiveメソッドは呼ばれない。 
subscriber.receive(_) >> "ok"
スタビング+本物のメソッド 
• callRealMethodメソッド、あるいは 
callRealMethodWithArgsメソッドを使 
うことで、任意のコードの実行と、本物 
のメソッドへの委譲が行われる。 
// 本物のreceiveメソッドが呼ばれた後、 
// 戻り値を動的に変更 
subscriber.receive(_) >> { String message -> 
callRealMethod() 
message.size() > 3 ? "ok" : "fail" 
}
スタビング+本物のメソッド 
• callRealMethodメソッドと 
callRealMethodWithArgsメソッドの違 
いは、後者は呼び出し時の引数を差し替 
えたい場合に使用する。 
// 本物のreceiveメソッドを、違う引数で実行し、 
// 戻り値を動的に変更 
subscriber.receive(_) >> { String message -> 
callRealMethodWithArgs("Changed message") 
message.size() > 3 ? "ok" : "fail" 
}
et cetera 
(その他)
Spock 
Extensions 
(Spock拡張機能)
Spockの拡張機能 
• Spockの動作を拡張したり変更した 
りすることができる。 
• 仕組みとして、ビルトイン機能拡張 
と、カスタム機能拡張がある。
ビルトイン拡張機能 
• ビルトイン拡張機能のほとんどは、 
アノテーションを通して使用する。 
• @Unrollもその一例。 
• 他にも、@Ignor, @IgnorRest, 
@IgnorIf, @Requiresなどがある。 
• 自作も可能。
カスタム拡張機能 
※詳細不明のため省略
Spock 
Modules 
(Spockモジュール)
Spockのモジュール 
• Spockの動作を拡張したり変更した 
りすることができる。 
• githubで、SpockのCore以外にもい 
くつかモジュールを提供している。
純正なもの 
• spock-unitils 
• Unitilsというテスト用ユーティリ 
ティをSpockと統合したもの。 
• spock-spring, spock-boot 
• それぞれ、Spring TestContext 
やSpring Bootと統合したもの。
純正でないもの 
• Spock Report Extension 
• 実行結果のレポートを作成するた 
めのグローバル拡張機能。 
• https://github.com/ 
renatoathaydes/spock-reports
With Spock 
(Spockと一緒に)
Spockと組み合わせる 
• テスティングフレームワークの中に 
は、Spockをサポートしていたり、 
Spockと組み合わせて使ったりする 
ものがある。
Geb + Spock 
• Gebとは、Webブラウザを使うWeb 
アプリケーションの操作を自動化・ 
自動実行するためのソフトウェア。 
• Geb用のSpecificationクラスを提供。
Arquillian + Spock 
• Arquillianとは、自動テストでJavaEE 
コンテナを利用可能にするためのソ 
フトウェア。 
• ArquillianをSpockと組み合わせて使 
えるように、アノテーションなど機 
能拡張を提供。
Robospock 
• Robospockとは、Spockを使って 
Androidアプリケーションをテストする 
ためのソフトウェア。 
• Android用のユニットテストフレームワー 
クであるRobolectricとSpockを組み合 
わせ、Specificationクラスを提供。
To wrap up 
(まとめ)
まとめ 
• Spockは、テスト・仕様が書きやす 
く読みやすいフレームワークです。 
• JUnitの代わりにユニットテストで使 
う等、導入しやすい所から初めてみ 
るのはいかがでしょうか。 
!
参考URL 
• 本家 
• https://code.google.com/p/spock/ 
• ソースコード 
• https://github.com/spockframework/spock 
• リファレンスドキュメント(英語版) 
• http://spock-framework.readthedocs.org/en/latest/ 
• リファレンスドキュメント(日本語版) 
• http://spock-framework-reference-documentation-ja.readthedocs.org/ja/latest/ 
• G*ワークショップZ May 2013 - Spockハンズオンの資料 
• https://github.com/spockframework/spock
参考URL 
• Geb 
• http://www.gebish.org/ 
• Arquillian 
• http://arquillian.org/ 
• Arquillian TestRunner Spock 
• http://arquillian.org/modules/spock-test-runner/ 
• RoboSpock 
• http://robospock.org/
ご清聴 
ありがとう 
ございました

Weitere ähnliche Inhalte

Was ist angesagt?

Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 
5分で解るセキュアコーディング
5分で解るセキュアコーディング5分で解るセキュアコーディング
5分で解るセキュアコーディングYasuo Ohgaki
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
 
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーククラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-RetryフレームワークY Watanabe
 
AWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメするAWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメするTaichi Inaba
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05都元ダイスケ Miyamoto
 
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Akito Tsukahara
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Shinsuke Sugaya
 
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザNoritaka Sekiyama
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo!デベロッパーネットワーク
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本Takahiro YAMADA
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみた元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみたKumano Ryo
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)NTT DATA Technology & Innovation
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜aha_oretama
 
OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...
OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...
OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...NTT DATA Technology & Innovation
 

Was ist angesagt? (20)

Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
5分で解るセキュアコーディング
5分で解るセキュアコーディング5分で解るセキュアコーディング
5分で解るセキュアコーディング
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
クラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーククラウド時代だからSpring-Retryフレームワーク
クラウド時代だからSpring-Retryフレームワーク
 
AWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメするAWS CDKに魅入られた PHPer がオススメする
AWS CDKに魅入られた PHPer がオススメする
 
Maven基礎
Maven基礎Maven基礎
Maven基礎
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
 
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
Web api開発をするなら ドキュメントは自動生成にしておこう__ph_per_kaigi2021_
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザ
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみた元OracleMasterPlatinumがCloudSpanner触ってみた
元OracleMasterPlatinumがCloudSpanner触ってみた
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...
OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...
OSSプロジェクトへのコントリビューション はじめの一歩を踏み出そう!(Open Source Conference 2022 Online/Spring...
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 

Andere mochten auch

Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりTakahiro Sugiura
 
Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are realTakahiro Sugiura
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GParsTakahiro Sugiura
 

Andere mochten auch (7)

Groovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したりGroovyしたり RPしなかったり あとは時々布教活動したり
Groovyしたり RPしなかったり あとは時々布教活動したり
 
Goos 001
Goos 001Goos 001
Goos 001
 
GroovyからAnime
GroovyからAnimeGroovyからAnime
GroovyからAnime
 
Closures and methodMissing are real
Closures and methodMissing are realClosures and methodMissing are real
Closures and methodMissing are real
 
GContractsの基礎
GContractsの基礎GContractsの基礎
GContractsの基礎
 
Vert.x.tari.tari
Vert.x.tari.tariVert.x.tari.tari
Vert.x.tari.tari
 
ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
 

Ähnlich wie Introduction to Spock

JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
mxnetで頑張る深層学習
mxnetで頑張る深層学習mxnetで頑張る深層学習
mxnetで頑張る深層学習Takashi Kitano
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)信之 岩永
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイドTakahiro Itagaki
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unithigaki
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画keki3
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareerKyosuke MOROHASHI
 

Ähnlich wie Introduction to Spock (20)

Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
mxnetで頑張る深層学習
mxnetで頑張る深層学習mxnetで頑張る深層学習
mxnetで頑張る深層学習
 
Spock's world
Spock's worldSpock's world
Spock's world
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
Project lambda
Project lambdaProject lambda
Project lambda
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイド
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画2019年度 若手技術者向け講座 実行計画
2019年度 若手技術者向け講座 実行計画
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareer
 

Kürzlich hochgeladen

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Kürzlich hochgeladen (9)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

Introduction to Spock