TestNGでマルチスレッドテストを試してみた


この前m2eclipseを使ってみたのも、TestNGを試してみるためでした。
TestNGのマルチスレッドなテストを試してみたかったんです。

ちなみにJunitはずっと使ってるけど、3.x系列しか使った事がなかったので、アノテーションベースのテストクラスも初体験でした。
アノテーションに関してはJunit4.x系列なら扱えるんですけどね。

さてさて、マルチスレッドなテストを試すため、下記のようなスレッドアンセーフティーな実装をしてみました。
 package test;
 public class UnSafety {
 private static StringBuffer sb;

     public static String unsync() {
         sb = new StringBuffer();
         sb.append(“松”);
         sb.append(“竹”);
         sb.append(“梅”);
         return sb.toString();
     }
 }
TestNGでマルチスレッドなテストをするためには、アノテーションのパラメータにスレッドの数(threadPoolSize)と実行回数(invocationCount)を指定します。
下記の例ではスレッド数3で、実行回数を10回としています。
 package test;

 import org.testng.annotations.Test;
 import static org.testng.Assert.;

 public class TestUnSafe {
     @Test(threadPoolSize=3, invocationCount=10)
     public void testUnSafety() {
         assertEquals(UnSafety.unsync(), “松竹梅”);
         }
     }
 }
実行結果はこんな感じ。ばっちりテストできてるみたいです。
 PASSED: testUnSafety
 PASSED: testUnSafety
 PASSED: testUnSafety
 PASSED: testUnSafety
 PASSED: testUnSafety
 PASSED: testUnSafety
 PASSED: testUnSafety
 FAILED: testUnSafety
 java.lang.AssertionError: expected:<松竹梅> but was:<松竹梅梅梅>
 at test.TestUnSafe.testUnSafety(TestUnSafe.java:9)
 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
 at java.lang.Thread.run(Thread.java:595)
 ... Removed 16 stack frames
 FAILED: testUnSafety
 java.lang.AssertionError: expected:<松竹梅> but was:<松竹梅梅>
 at test.TestUnSafe.testUnSafety(TestUnSafe.java:9)
 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
 at java.lang.Thread.run(Thread.java:595)
 ... Removed 16 stack frames
 FAILED: testUnSafety
 java.lang.AssertionError: expected:<松竹梅> but was:<松竹梅梅>
 at test.TestUnSafe.testUnSafety(TestUnSafe.java:9)
 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
 at java.lang.Thread.run(Thread.java:595)
 ... Removed 16 stack frames* 
マルチスレッドとは関係ないのですが、TestNGではexpected(予想値)とactual(実行値)の引数の順番が、Junitと逆なんですね。
エラーメッセージを見て戸惑いました。

Comment