groovyでTestNGのテストコードを書いてみよう
G* Advent Calendar 2011 : ATND の25日目の担当の@kimukou_26です。
最初はMongoDBあたりやろうかな〜と思っていましたが、@mike_neck さんに取られてしまった感じでして(汗
しかもJunitのTestコード形式で書いているw
むこうがJUnitならこっちはTestNGで書いてみるか〜と思って書き始めたのがはじめです。
日本だとJUnitがやっと使い始める人が増えてきた感じなんですが<Androidで使っている人も多いのでJUnit3ベース
(でも現場ベースではほとんど使いこなしている人見なかったな(汗
それ以外にも古くからのテストツールには「TestNG 」っていうのもあるよね〜という感じで、書いてみました
ついでに さんが使われた GBench も併せて使ってみた感じです
- TestNGがどんな物か解らない人は
- JUnit 4 Vs TestNG – Comparison の対応表をみるとイメージ沸きやすいかも
- 公式サイト
- javadoc な感じ
- 過去の日本の記載記事
なんてのもありましたが、今一流行らなかったorz
と言うのもありましたがmavenに登録されていないのが凄く残念><
日本だとテストに興味ある人が少ないのかな〜(結構作りきりビジネスがどうも多い気がする
古くからあるのにみんなに殆ど使われていないテストツールです
色々と面白いことが出来て触って見ると面白いんですけどね〜
<TDDに超詳しい さんですらあんまり知らんらしい
- 実行コード
元にしたコードは codehausのここ と ここ のコードをベースにしています
その他に参照した所は、Gistの上部にリンクを記載しています
動作確認には さんの Java Web Start版 Groovy Console をちょっとだけ変えてみた その3 - bluepapa32’s Java Blog を使いました。
JREをインストール済みであれば、右下の「GroovyConsole」から起動=>コード貼り付け で試せます.
(groovyのインストールは要りません)
- 出力結果
[TestNG] Running: Command line suite GroovyReverser void <clinit>() user:46875000 system:109375000 cpu:156250000 real:159351817 == method1 start == This is method 1 == method1 end == == shouldPersistAndReverseLists2([2, 4],[4, 2]) start == [func]checkPersistAndReverse([2, 4],[4, 2]) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:160635 == shouldPersistAndReverseLists2([2, 4],[4, 2]) end == StorerIntegrationTest void shouldPersistAndReverseLists2(java.util.List, java.util.List) user:0 system:0 cpu:0 real:7687011 == shouldPersistAndReverseLists2([4, 2],[2, 4]) start == [func]checkPersistAndReverse([4, 2],[2, 4]) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:33524 == shouldPersistAndReverseLists2([4, 2],[2, 4]) end == StorerIntegrationTest void shouldPersistAndReverseLists2(java.util.List, java.util.List) user:0 system:0 cpu:0 real:2526579 == shouldPersistAndReverseNumbers start == [func]checkPersistAndReverse(123.456,-123.456) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:97219 == shouldPersistAndReverseNumbers end == == shouldPersistAndReverseNumbersError start == [func]checkPersistAndReverse(123.456,-125.456) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:26260 == infinity start == == shouldPersistAndReverseStrings start == [func]checkPersistAndReverse(hello,olleh) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:546438 == shouldPersistAndReverseStrings end == == shouldPersistAndReverseLists start == [func]checkPersistAndReverse([1, 3, 5],[5, 3, 1]) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:90235 == shouldPersistAndReverseLists end == == shouldPersistAndReverseParameterNone(1942,2491) start == [func]checkPersistAndReverse(1942,2491) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:87162 == shouldPersistAndReverseParameterNone(1942,2491) end == == shouldPersistAndReverseParameter(-9876,9876) start == [func]checkPersistAndReverse(-9876,9876) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:48889 == shouldPersistAndReverseParameter(-9876,9876) end == == method2 start == This is method 2 == method2 end == ==[func] DeptIteratorData start == ==[func] hasNext<0> start == ==[func] next<0> start == data=<Dept@1343f3b val_a=100 val_b=-100> == shouldPersistAndReverseIterator(<Dept@1343f3b val_a=100 val_b=-100>) start == [func]checkPersistAndReverse(100,-100) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:39111 == shouldPersistAndReverseIterator(<Dept@1343f3b val_a=100 val_b=-100>) end == ==[func] hasNext<1> start == ==[func] next<1> start == data=<Dept@15f2afe val_a=50 val_b=-50> == shouldPersistAndReverseIterator(<Dept@15f2afe val_a=50 val_b=-50>) start == [func]checkPersistAndReverse(50,-50) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:276013 == shouldPersistAndReverseIterator(<Dept@15f2afe val_a=50 val_b=-50>) end == ==[func] hasNext<2> start == ==[func] next<2> start == data=<Dept@1ae3e2d val_a=xyz val_b=zyx> == shouldPersistAndReverseIterator(<Dept@1ae3e2d val_a=xyz val_b=zyx>) start == [func]checkPersistAndReverse(xyz,zyx) GroovyReverser java.lang.Object reverse(java.lang.Object) user:0 system:0 cpu:0 real:281600 == shouldPersistAndReverseIterator(<Dept@1ae3e2d val_a=xyz val_b=zyx>) end == ==[func] hasNext<3> start == =============================================== Default Suite Total tests run: 14, Failures: 0, Skips: 0 =============================================== PassedTests: [[TestResult: method1 STATUS:SUCCESS METHOD:StorerIntegrationTest.method1()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseLists2 STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseLists2(java.util.List, java.util.List)[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseLists2 STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseLists2(java.util.List, java.util.List)[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseNumbers STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseNumbers()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseNumbersError STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseNumbersError()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: infinity STATUS:SUCCESS METHOD:StorerIntegrationTest.infinity()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseStrings STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseStrings()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseLists STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseLists()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseParameterNone STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseParameterNone(java.lang.String, java.lang.String)[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseParameter STATUS:SUCCESS METHOD:StorerIntegrationTest.shouldPersistAndReverseParameter(java.lang.String, java.lang.String)[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: method2 STATUS:SUCCESS METHOD:StorerIntegrationTest.method2()[pri:0, instance:StorerIntegrationTest@9999f1]] , [TestResult: shouldPersistAndReverseIterator STATUS:SUCCESS METHOD:StorerIntegrationTest2.shouldPersistAndReverseIterator(Dept)[pri:0, instance:StorerIntegrationTest2@193ba0]] , [TestResult: shouldPersistAndReverseIterator STATUS:SUCCESS METHOD:StorerIntegrationTest2.shouldPersistAndReverseIterator(Dept)[pri:0, instance:StorerIntegrationTest2@193ba0]] , [TestResult: shouldPersistAndReverseIterator STATUS:SUCCESS METHOD:StorerIntegrationTest2.shouldPersistAndReverseIterator(Dept)[pri:0, instance:StorerIntegrationTest2@193ba0]] ] FailedTests: [] SkippedTests: []
- グループ実行
- testng.setExcludedGroups("G1")
あたりのコメントを外すとG2のグループのみテストが実行される形になります(反対の場合は逆
- 書いてて嵌った処
- TestCaseのクラスの中にクラスを書くとエラーは出ないんだけど動かない
- これってGroovyだと当たり前の話でしたっけ?
- 最初は StorerIntegrationTest2 の中に Deptクラスとか定義していた感じ
- setGroupsの方はちゃんと動かないみたいだった
- TestCaseのクラスの中にクラスを書くとエラーは出ないんだけど動かない
- GBenchに関して
- インターフェースに付けるとエラーが出てしまう
- テストコード側に付けてもどうも動いていないみたい(テスト関数自体の時間計測等には使えない?
使い方が間違っているよ〜という可能性もありますが(汗