SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
Spockの基礎
               @kiy0taka




13年3月9日土曜日
自己紹介

       •奥 清隆(おく きよたか)
       • @kiy0taka、id:kiy0taka
       •株式会社ニューキャスト所属
       •名古屋在住JGGUG関西支部長
       •仕事:Groovy/Grailsとか
13年3月9日土曜日
spock-shell

             • シェルスクリプトのテストをSpockで書
               くSpock拡張

             • http://git.io/spock-shell


13年3月9日土曜日
import org.kiy0taka.spock.shell.ShellSpec

             class GreetingSpec extends ShellSpec {

                 def "greet with custom message"() {
                     given:
                     export 'GREET', 'Goodbye'

                     when:
                     run 'greeting.sh', 'Spock'

                     then:
                     lines[0] == 'Goodbye Spock!'
                 }
             }




13年3月9日土曜日
dproofs




             http://xmldo.jp/dproofs
13年3月9日土曜日
Agenda


             • AST変換
             • Specification


13年3月9日土曜日
SpockTransform

             • SpockのAST変換はこっから始まる
      Spec spec = new SpecParser(errorReporter).build(clazz);
      spec.accept(new SpecRewriter(nodeCache, sourceLookup,
          errorReporter));
      spec.accept(new SpecAnnotator(nodeCache));




13年3月9日土曜日
SpecParser


             • テストクラスからSpecを組み立てる



13年3月9日土曜日
Spec
      public class Spec extends Node<Spec, ClassNode> {
          private final List<Field> fields
          private final List<Method> methods

             private FixtureMethod initializerMethod
             private FixtureMethod sharedInitializerMethod

             private   FixtureMethod   setupMethod
             private   FixtureMethod   cleanupMethod
             private   FixtureMethod   setupSpecMethod
             private   FixtureMethod   cleanupSpecMethod
      }




13年3月9日土曜日
SpecRewriter

             • テストクラスの原形がなくなるまで殴
              り続ける

             • 仲間を呼んでボコボコにする


13年3月9日土曜日
Rewriter連合

             • SpecRewriter
             • ConditionRewriter
             • DeepBlockRewriter
             • InteractionRewriter
             • WhenBlockRewriter

13年3月9日土曜日
AST変換前
      import spock.lang.*

      class HelloSpock extends spock.lang.Specification {

             def "length of Spock's and his friends' names"() {
                 expect:
                 name.size() == length

                 where:
                 name       |   length
                 "Spock"    |   5
                 "Kirk"     |   4
                 "Scotty"   |   6
             }
      }



13年3月9日土曜日
import spock.lang.*
                                AST変換後
             import org.spockframework.runtime.model.*

             @SpecMetadata(line = 5, filename = 'HelloSpock.groovy')
             public class HelloSpock extends spock.lang.Specification {

                 @FeatureMetadata(parameterNames = ['name', 'length'], ...)
                 public void $spock_feature_0_0(name, length) {
                     Object $spock_valueRecorder = new ValueRecorder()
                     SpockRuntime.verifyCondition(...)
                     this.getSpecificationContext().getMockController().leaveScope()
                 }

                 @DataProviderMetadata(line = -1, dataVariables = ['name'])
                 public java.lang.Object $spock_feature_0_0prov0() {
                     return ['Spock', 'Kirk', 'Scotty']
                 }

                 @DataProviderMetadata(line = -1, dataVariables = ['length'])
                 public java.lang.Object $spock_feature_0_0prov1() {
                     return [5, 4, 6]
                 }

                 public Object $spock_feature_0_0proc(Object $spock_p0, Object $spock_p1) {
                     Object name = $spock_p0
                     Object length = $spock_p1
                     return new Object[]
                 }

             }


13年3月9日土曜日
フィールド
             def date = new Date()




             @FieldMetadata(name = 'date', line = 8, ordinal = 0)
             private Object date

             private Object $spock_initializeFields() {
                 date = new Date()
             }




13年3月9日土曜日
@Sharedフィールド
             @Shared
             def date = new Date()



             @Shared
             @FieldMetadata(name = 'date', line = 8, ordinal = 0)
             protected volatile Object $spock_sharedField_date

             private Object $spock_initializeSharedFields() {
                 $spock_sharedField_date = new java.util.Date()
             }




13年3月9日土曜日
フィーチャー
                      def 'test something'() {
                          expect:
                          1 == 1
                      }


 @FeatureMetadata(parameterNames = [], name = 'test something', ...)
 public void $spock_feature_0_0() {
     Object $spock_valueRecorder = new ValueRecorder()
     SpockRuntime.verifyCondition(...)
     this.getSpecificationContext().getMockController().leaveScope()
 }




13年3月9日土曜日
PowerAssert
             SpockRuntime.verifyCondition(
               $spock_valueRecorder.reset(),
               'name.size() == length',
               9, 9, null,
               $spock_valueRecorder.record(
                 5,
                 $spock_valueRecorder.record(
                    3,
                    $spock_valueRecorder.record(0, name)
                       .$spock_valueRecorder.record(1, 'size')()
                 ) == $spock_valueRecorder.record(4, length)
               )
             )


                 ※ GroovyのPowerAssertとは別実装
13年3月9日土曜日
thrown()
                        when:
                        def expected = new Calc().add(1, 1)
                        then:
                        thrown(Exception)



             @FeatureMetadata(parameterNames = [], name = 'test something', ...)
             public void $spock_feature_0_0() {
                 Object expected =
                   this.getSpecificationContext().setThrownException(null)
                 try {
                     expected = new Calc().add(1, 1)
                 } catch (Throwable $spock_ex) {
                     this.getSpecificationContext().setThrownException($spock_ex)
                 } finally { }
                 this.thrownImpl(null, null, Exception)
                 this.getSpecificationContext().getMockController().leaveScope()
             }



13年3月9日土曜日
where:
                        expect:
                        expected    == actual
                        where:
                        actual |    expected
                        1       |   1
                        "a"     |   "a"

             @FeatureMetadata(parameterNames = ['actual', 'expected'], ...)
             public void $spock_feature_0_0(Object actual, Object expected) {
               ...
             }

             @DataProviderMetadata(line = -1, dataVariables = ['actual'])
             public Object $spock_feature_0_0prov0() {
                 return [1, 'a']
             }

             @DataProviderMetadata(line = -1, dataVariables = ['expected'])
             public Object $spock_feature_0_0prov1() {
                 return [1, 'a']
             }

13年3月9日土曜日
Mock()
                    given:
                    def foo = Mock(Foo)
                    when:
                    foo.add(1, 2)
                    then:
                    1 * foo.add(_, _)


        Object foo = this.MockImpl('foo', null, Foo)
        this.getSpecificationContext().getMockController().enterScope()
        this.getSpecificationContext().getMockController().addInteraction(
            new InteractionBuilder(16, 9, '1 * foo.add(_, _)')
              .setFixedCount(1)
              .addEqualTarget(foo)
              .addEqualMethodName('add')
              .setArgListKind(true)
              .addEqualArg(_)
              .addEqualArg(_)
              .build())
        foo.add(1, 2)
        this.getSpecificationContext().getMockController().leaveScope()
        this.getSpecificationContext().getMockController().leaveScope()

13年3月9日土曜日
あとは各自
             見ておくように!


13年3月9日土曜日
AST変換の確認方法
                 ⌘T




13年3月9日土曜日
Specification



13年3月9日土曜日
Specification


     @RunWith(Sputnik.class)
     public abstract class Specification extends MockingApi {
       ...
     }




13年3月9日土曜日
Sputnik

             • org.junit.runner.Runnerの実装
             • SpecInfoBuilder使ってSpecInfoを構築
             • ExtensionRunner/
              ParameterizedSpecRunnerを使ってテスト
              実行



13年3月9日土曜日
SpecInfo
 public class SpecInfo extends ... {
   List<FieldInfo> fields
   List<IMethodInterceptor> setupInterceptors
   List<IMethodInterceptor> cleanupInterceptors
   List<IMethodInterceptor> setupSpecInterceptors
   List<IMethodInterceptor> cleanupSpecInterceptors
   List<IMethodInterceptor> sharedInitializerInterceptors
   List<IMethodInterceptor> initializerInterceptors

     List<IRunListener> listeners

     MethodInfo initializerMethod
     MethodInfo sharedInitializerMethod
     List<MethodInfo> setupMethods
     List<MethodInfo> cleanupMethods
     List<MethodInfo> setupSpecMethods
     List<MethodInfo> cleanupSpecMethods

     List<FeatureInfo> features
 }
13年3月9日土曜日
SpecInfoBuilder#doBuild()
        private SpecInfo doBuild() {
          buildSuperSpec();
          buildSpec();
          buildFields();
          buildFeatures();
          buildInitializerMethods();
          buildFixtureMethods();
          return spec;
        }

        private void buildSuperSpec() {
          ...
          SpecInfo superSpec =
            new SpecInfoBuilder(superClass, clazz).doBuild();
          ...
        }


13年3月9日土曜日
super.setup()しない
                class SubSpec extends BaseSpec {
                  def setup() {
                    super.setup()
                    ...
                  }
                }


   SubSpec.groovy: 9: A base class fixture method should not
   be called explicitly because it is always invoked
   automatically by the framework @ line 9, column 9.
              super.setup()
              ^

   1 error


13年3月9日土曜日
ExtensionRunner

             • org.junit.runner.Runnerの実装ではない
             • フィーチャーメソッドの前に
              Extension(Global/AnnotationDriven)を実行




13年3月9日土曜日
JUnit互換?

             • @Rule/@ClassRuleはRuleExtensionによ
               って実行される

             • @Before/@Afterとかフィクスチャーメ
               ソッドとして扱われる



13年3月9日土曜日
ParameterizedSpecRunner

             • パラメータごとにフィーチャーメソッ
              ドを実行

             • パラメータライズじゃないフィーチャ
              ーメソッドもこれで実行



13年3月9日土曜日
まとめ



13年3月9日土曜日
何得?

             • AST変換の勉強にはなる
             • Extensionを作るときに知ってるといい?
              • 他のExtension実装を見たほうがはやい


13年3月9日土曜日

Más contenido relacionado

La actualidad más candente

BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)Ryuma Tsukano
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programmingtakesako
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersShota TAMURA
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~JustSystems Corporation
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」technocat
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Clooaokomoriuta
 
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編まべ☆てっく運営
 
Parse introduction
Parse introductionParse introduction
Parse introductionTamura Koya
 
Serviceability Toolsの裏側
Serviceability Toolsの裏側Serviceability Toolsの裏側
Serviceability Toolsの裏側Yasumasa Suenaga
 
jqで極めるシェル芸の話
jqで極めるシェル芸の話jqで極めるシェル芸の話
jqで極めるシェル芸の話Yoichi Toyota
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にYoshifumi Kawai
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
Objective-C atomicity #idevjp
Objective-C atomicity #idevjpObjective-C atomicity #idevjp
Objective-C atomicity #idevjpTomohiro Kumagai
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道なおき きしだ
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考えるchonaso
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 

La actualidad más candente (20)

BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Cloo
 
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編
 
Parse introduction
Parse introductionParse introduction
Parse introduction
 
fluentd
fluentdfluentd
fluentd
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 
Serviceability Toolsの裏側
Serviceability Toolsの裏側Serviceability Toolsの裏側
Serviceability Toolsの裏側
 
jqで極めるシェル芸の話
jqで極めるシェル芸の話jqで極めるシェル芸の話
jqで極めるシェル芸の話
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
Objective-C atomicity #idevjp
Objective-C atomicity #idevjpObjective-C atomicity #idevjp
Objective-C atomicity #idevjp
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 

Similar a Spockの基礎

大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発についてYuki Tanaka
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Cocoa勉強会#43-Blocksを使う
Cocoa勉強会#43-Blocksを使うCocoa勉強会#43-Blocksを使う
Cocoa勉強会#43-Blocksを使うMasayuki Nii
 
New Generation Build System "Fly"
New Generation Build System "Fly"New Generation Build System "Fly"
New Generation Build System "Fly"deepblue will
 
I phoneアプリ入門 第5回
I phoneアプリ入門 第5回I phoneアプリ入門 第5回
I phoneアプリ入門 第5回Sachiko Kajishima
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentationJason Namkung
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfKosuke Saigusa
 
2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会Takatoshi Murakami
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-uedayou
 
現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)Hiroshi Nakamura
 
Jenkins plugin memo
Jenkins plugin memoJenkins plugin memo
Jenkins plugin memoKiyotaka Oku
 

Similar a Spockの基礎 (20)

大(中)規模Java script開発について
大(中)規模Java script開発について大(中)規模Java script開発について
大(中)規模Java script開発について
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
What's Cuckoo?
What's Cuckoo?What's Cuckoo?
What's Cuckoo?
 
Cocoa勉強会#43-Blocksを使う
Cocoa勉強会#43-Blocksを使うCocoa勉強会#43-Blocksを使う
Cocoa勉強会#43-Blocksを使う
 
New Generation Build System "Fly"
New Generation Build System "Fly"New Generation Build System "Fly"
New Generation Build System "Fly"
 
I phoneアプリ入門 第5回
I phoneアプリ入門 第5回I phoneアプリ入門 第5回
I phoneアプリ入門 第5回
 
Junit4
Junit4Junit4
Junit4
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
About Jobs
About JobsAbout Jobs
About Jobs
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdf
 
2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会2013-12-08 西区プログラム勉強会
2013-12-08 西区プログラム勉強会
 
Testman
TestmanTestman
Testman
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
 
現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)現実世界のJRuby(ショートバージョン)
現実世界のJRuby(ショートバージョン)
 
現実世界のJRuby
現実世界のJRuby現実世界のJRuby
現実世界のJRuby
 
Jenkins plugin memo
Jenkins plugin memoJenkins plugin memo
Jenkins plugin memo
 

Más de Kiyotaka Oku

Osaka Venture Meetup #3
Osaka Venture Meetup #3Osaka Venture Meetup #3
Osaka Venture Meetup #3Kiyotaka Oku
 
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱Kiyotaka Oku
 
BaseScriptについて
BaseScriptについてBaseScriptについて
BaseScriptについてKiyotaka Oku
 
ミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考えるミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考えるKiyotaka Oku
 
GDK48総選挙の裏側
GDK48総選挙の裏側GDK48総選挙の裏側
GDK48総選挙の裏側Kiyotaka Oku
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Kiyotaka Oku
 
Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜Kiyotaka Oku
 
日本Grails/Groovyユーザーグループ
日本Grails/Groovyユーザーグループ日本Grails/Groovyユーザーグループ
日本Grails/GroovyユーザーグループKiyotaka Oku
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 SpringKiyotaka Oku
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Kiyotaka Oku
 
Jenkins and Groovy
Jenkins and GroovyJenkins and Groovy
Jenkins and GroovyKiyotaka Oku
 
とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語Kiyotaka Oku
 
Groovy and-hudson2
Groovy and-hudson2Groovy and-hudson2
Groovy and-hudson2Kiyotaka Oku
 

Más de Kiyotaka Oku (20)

Osaka Venture Meetup #3
Osaka Venture Meetup #3Osaka Venture Meetup #3
Osaka Venture Meetup #3
 
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
巨大不明ビルドの継続的統合を目的とするビルドパイプラインを主軸とした作戦要綱
 
BaseScriptについて
BaseScriptについてBaseScriptについて
BaseScriptについて
 
javafx-mini4wd
javafx-mini4wdjavafx-mini4wd
javafx-mini4wd
 
ミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考えるミニ四駆ジャパンカップで勝つ方法を考える
ミニ四駆ジャパンカップで勝つ方法を考える
 
JUC2012
JUC2012JUC2012
JUC2012
 
GDK48総選挙の裏側
GDK48総選挙の裏側GDK48総選挙の裏側
GDK48総選挙の裏側
 
Jenkins入門
Jenkins入門Jenkins入門
Jenkins入門
 
Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介Grails/Groovyによる開発事例紹介
Grails/Groovyによる開発事例紹介
 
Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜Griffon不定期便〜G*ワークショップ編〜
Griffon不定期便〜G*ワークショップ編〜
 
日本Grails/Groovyユーザーグループ
日本Grails/Groovyユーザーグループ日本Grails/Groovyユーザーグループ
日本Grails/Groovyユーザーグループ
 
GroovyConsole2
GroovyConsole2GroovyConsole2
GroovyConsole2
 
GroovyConsole
GroovyConsoleGroovyConsole
GroovyConsole
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方
 
Devsumi Openjam
Devsumi OpenjamDevsumi Openjam
Devsumi Openjam
 
Jenkins and Groovy
Jenkins and GroovyJenkins and Groovy
Jenkins and Groovy
 
とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語
 
Mote Hudson
Mote HudsonMote Hudson
Mote Hudson
 
Groovy and-hudson2
Groovy and-hudson2Groovy and-hudson2
Groovy and-hudson2
 

Último

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Último (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Spockの基礎

  • 1. Spockの基礎 @kiy0taka 13年3月9日土曜日
  • 2. 自己紹介 •奥 清隆(おく きよたか) • @kiy0taka、id:kiy0taka •株式会社ニューキャスト所属 •名古屋在住JGGUG関西支部長 •仕事:Groovy/Grailsとか 13年3月9日土曜日
  • 3. spock-shell • シェルスクリプトのテストをSpockで書 くSpock拡張 • http://git.io/spock-shell 13年3月9日土曜日
  • 4. import org.kiy0taka.spock.shell.ShellSpec class GreetingSpec extends ShellSpec { def "greet with custom message"() { given: export 'GREET', 'Goodbye' when: run 'greeting.sh', 'Spock' then: lines[0] == 'Goodbye Spock!' } } 13年3月9日土曜日
  • 5. dproofs http://xmldo.jp/dproofs 13年3月9日土曜日
  • 6. Agenda • AST変換 • Specification 13年3月9日土曜日
  • 7. SpockTransform • SpockのAST変換はこっから始まる Spec spec = new SpecParser(errorReporter).build(clazz); spec.accept(new SpecRewriter(nodeCache, sourceLookup, errorReporter)); spec.accept(new SpecAnnotator(nodeCache)); 13年3月9日土曜日
  • 8. SpecParser • テストクラスからSpecを組み立てる 13年3月9日土曜日
  • 9. Spec public class Spec extends Node<Spec, ClassNode> { private final List<Field> fields private final List<Method> methods private FixtureMethod initializerMethod private FixtureMethod sharedInitializerMethod private FixtureMethod setupMethod private FixtureMethod cleanupMethod private FixtureMethod setupSpecMethod private FixtureMethod cleanupSpecMethod } 13年3月9日土曜日
  • 10. SpecRewriter • テストクラスの原形がなくなるまで殴 り続ける • 仲間を呼んでボコボコにする 13年3月9日土曜日
  • 11. Rewriter連合 • SpecRewriter • ConditionRewriter • DeepBlockRewriter • InteractionRewriter • WhenBlockRewriter 13年3月9日土曜日
  • 12. AST変換前 import spock.lang.* class HelloSpock extends spock.lang.Specification { def "length of Spock's and his friends' names"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 } } 13年3月9日土曜日
  • 13. import spock.lang.* AST変換後 import org.spockframework.runtime.model.* @SpecMetadata(line = 5, filename = 'HelloSpock.groovy') public class HelloSpock extends spock.lang.Specification { @FeatureMetadata(parameterNames = ['name', 'length'], ...) public void $spock_feature_0_0(name, length) { Object $spock_valueRecorder = new ValueRecorder() SpockRuntime.verifyCondition(...) this.getSpecificationContext().getMockController().leaveScope() } @DataProviderMetadata(line = -1, dataVariables = ['name']) public java.lang.Object $spock_feature_0_0prov0() { return ['Spock', 'Kirk', 'Scotty'] } @DataProviderMetadata(line = -1, dataVariables = ['length']) public java.lang.Object $spock_feature_0_0prov1() { return [5, 4, 6] } public Object $spock_feature_0_0proc(Object $spock_p0, Object $spock_p1) { Object name = $spock_p0 Object length = $spock_p1 return new Object[] } } 13年3月9日土曜日
  • 14. フィールド def date = new Date() @FieldMetadata(name = 'date', line = 8, ordinal = 0) private Object date private Object $spock_initializeFields() { date = new Date() } 13年3月9日土曜日
  • 15. @Sharedフィールド @Shared def date = new Date() @Shared @FieldMetadata(name = 'date', line = 8, ordinal = 0) protected volatile Object $spock_sharedField_date private Object $spock_initializeSharedFields() { $spock_sharedField_date = new java.util.Date() } 13年3月9日土曜日
  • 16. フィーチャー def 'test something'() { expect: 1 == 1 } @FeatureMetadata(parameterNames = [], name = 'test something', ...) public void $spock_feature_0_0() { Object $spock_valueRecorder = new ValueRecorder() SpockRuntime.verifyCondition(...) this.getSpecificationContext().getMockController().leaveScope() } 13年3月9日土曜日
  • 17. PowerAssert SpockRuntime.verifyCondition( $spock_valueRecorder.reset(), 'name.size() == length', 9, 9, null, $spock_valueRecorder.record( 5, $spock_valueRecorder.record( 3, $spock_valueRecorder.record(0, name) .$spock_valueRecorder.record(1, 'size')() ) == $spock_valueRecorder.record(4, length) ) ) ※ GroovyのPowerAssertとは別実装 13年3月9日土曜日
  • 18. thrown() when: def expected = new Calc().add(1, 1) then: thrown(Exception) @FeatureMetadata(parameterNames = [], name = 'test something', ...) public void $spock_feature_0_0() { Object expected = this.getSpecificationContext().setThrownException(null) try { expected = new Calc().add(1, 1) } catch (Throwable $spock_ex) { this.getSpecificationContext().setThrownException($spock_ex) } finally { } this.thrownImpl(null, null, Exception) this.getSpecificationContext().getMockController().leaveScope() } 13年3月9日土曜日
  • 19. where: expect: expected == actual where: actual | expected 1 | 1 "a" | "a" @FeatureMetadata(parameterNames = ['actual', 'expected'], ...) public void $spock_feature_0_0(Object actual, Object expected) { ... } @DataProviderMetadata(line = -1, dataVariables = ['actual']) public Object $spock_feature_0_0prov0() { return [1, 'a'] } @DataProviderMetadata(line = -1, dataVariables = ['expected']) public Object $spock_feature_0_0prov1() { return [1, 'a'] } 13年3月9日土曜日
  • 20. Mock() given: def foo = Mock(Foo) when: foo.add(1, 2) then: 1 * foo.add(_, _) Object foo = this.MockImpl('foo', null, Foo) this.getSpecificationContext().getMockController().enterScope() this.getSpecificationContext().getMockController().addInteraction( new InteractionBuilder(16, 9, '1 * foo.add(_, _)') .setFixedCount(1) .addEqualTarget(foo) .addEqualMethodName('add') .setArgListKind(true) .addEqualArg(_) .addEqualArg(_) .build()) foo.add(1, 2) this.getSpecificationContext().getMockController().leaveScope() this.getSpecificationContext().getMockController().leaveScope() 13年3月9日土曜日
  • 21. あとは各自 見ておくように! 13年3月9日土曜日
  • 22. AST変換の確認方法 ⌘T 13年3月9日土曜日
  • 24. Specification @RunWith(Sputnik.class) public abstract class Specification extends MockingApi { ... } 13年3月9日土曜日
  • 25. Sputnik • org.junit.runner.Runnerの実装 • SpecInfoBuilder使ってSpecInfoを構築 • ExtensionRunner/ ParameterizedSpecRunnerを使ってテスト 実行 13年3月9日土曜日
  • 26. SpecInfo public class SpecInfo extends ... { List<FieldInfo> fields List<IMethodInterceptor> setupInterceptors List<IMethodInterceptor> cleanupInterceptors List<IMethodInterceptor> setupSpecInterceptors List<IMethodInterceptor> cleanupSpecInterceptors List<IMethodInterceptor> sharedInitializerInterceptors List<IMethodInterceptor> initializerInterceptors List<IRunListener> listeners MethodInfo initializerMethod MethodInfo sharedInitializerMethod List<MethodInfo> setupMethods List<MethodInfo> cleanupMethods List<MethodInfo> setupSpecMethods List<MethodInfo> cleanupSpecMethods List<FeatureInfo> features } 13年3月9日土曜日
  • 27. SpecInfoBuilder#doBuild() private SpecInfo doBuild() { buildSuperSpec(); buildSpec(); buildFields(); buildFeatures(); buildInitializerMethods(); buildFixtureMethods(); return spec; } private void buildSuperSpec() { ... SpecInfo superSpec = new SpecInfoBuilder(superClass, clazz).doBuild(); ... } 13年3月9日土曜日
  • 28. super.setup()しない class SubSpec extends BaseSpec { def setup() { super.setup() ... } } SubSpec.groovy: 9: A base class fixture method should not be called explicitly because it is always invoked automatically by the framework @ line 9, column 9. super.setup() ^ 1 error 13年3月9日土曜日
  • 29. ExtensionRunner • org.junit.runner.Runnerの実装ではない • フィーチャーメソッドの前に Extension(Global/AnnotationDriven)を実行 13年3月9日土曜日
  • 30. JUnit互換? • @Rule/@ClassRuleはRuleExtensionによ って実行される • @Before/@Afterとかフィクスチャーメ ソッドとして扱われる 13年3月9日土曜日
  • 31. ParameterizedSpecRunner • パラメータごとにフィーチャーメソッ ドを実行 • パラメータライズじゃないフィーチャ ーメソッドもこれで実行 13年3月9日土曜日
  • 33. 何得? • AST変換の勉強にはなる • Extensionを作るときに知ってるといい? • 他のExtension実装を見たほうがはやい 13年3月9日土曜日