SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
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日土曜日

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介: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
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
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
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
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
 
論文紹介: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
 
論文紹介: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
 

Kürzlich hochgeladen (10)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介: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...
 
【早稲田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
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
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」の紹介
 
論文紹介: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
 
論文紹介: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
 

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日土曜日