groovyでTestNGのテストコードを書いてみよう



 G* Advent Calendar 2011 : ATND の25日目の担当の@kimukou_26です。

 最初はMongoDBあたりやろうかな〜と思っていましたが、@mike_neck さんに取られてしまった感じでして(汗
しかもJunitのTestコード形式で書いているw

 むこうがJUnitならこっちはTestNGで書いてみるか〜と思って書き始めたのがはじめです。

 日本だとJUnitがやっと使い始める人が増えてきた感じなんですが<Androidで使っている人も多いのでJUnit3ベース
(でも現場ベースではほとんど使いこなしている人見なかったな(汗

 それ以外にも古くからのテストツールには「TestNG 」っていうのもあるよね〜という感じで、書いてみました

 ついでに id:irof さんが使われた GBench も併せて使ってみた感じです

なんてのもありましたが、今一流行らなかったorz

と言うのもありましたがmavenに登録されていないのが凄く残念><

 日本だとテストに興味ある人が少ないのかな〜(結構作りきりビジネスがどうも多い気がする

 古くからあるのにみんなに殆ど使われていないテストツールです
色々と面白いことが出来て触って見ると面白いんですけどね〜
<TDDに超詳しい id:kyon_mm さんですらあんまり知らんらしい

  • 実行コード

 元にしたコードは codehausここここ のコードをベースにしています
 その他に参照した所は、Gistの上部にリンクを記載しています

 動作確認には id:bluepapa32 さんの 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の方はちゃんと動かないみたいだった
  • GBenchに関して
    • インターフェースに付けるとエラーが出てしまう
    • テストコード側に付けてもどうも動いていないみたい(テスト関数自体の時間計測等には使えない?

使い方が間違っているよ〜という可能性もありますが(汗


 とりあえずこんな感じでOKでしょうか? id:orangeclover さん?
 
  中々良いですね〜。