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と逆なんですね。
エラーメッセージを見て戸惑いました。