ホソカワです。
on 00.9.27 8:06 PM, tetsuya@....jp at tetsuya@....jp wrote:
> 栗原です。
>
> 自分で、ファイルのロックが必要と懸念点をあげているならば、
> その懸念を払拭してから進むべきですよね。
> # 不明点を明らかにしないとタスクを見積もれませんから。
>
> で、並行処理時のファイルロックユーティリティを作ってみました。
…
> で、肝心のテストケースですが、自分なりにテストして、正しく動作しそ
> うだ、というのは確認しているのですが、JUnitなどでどのようにテスト
> していいのかが検討つきません。
> 並行処理のテストの良いアイデアは何かありませんでしょうか?
> アドバイスお願いします、識者の方々。
JUnit でどのように並列処理テストを書くのか私も分かりませんが、ユニットテスト
をいくつか考えてみました。
1.定番の「生成できますか?」テスト
public void testCreateOneMutex() {
try {
Mutex aMutex = new Mutex("LockFile");
assertNotNull(aMutex);
} catch (Exception e) {
fail();
}
}
2.「同じロックファイルを指定してMutex を作っていいのでしょうか?」テスト
public void testCreateMutexUsingSameFile() {
try {
String lockFileName = "LockFile";
Mutex firstMutex = new Mutex(lockFileName);
Mutex secondMutex = new Mutex(lockFileName);
fail();
} catch (MutexException e) {
assert(true);
}
}
3.「タイムアウトしないでロックをとれますか?」テスト
public void testAttempt() {
try {
Mutex aMutex = new Mutex("LockFile");
aMutex.attempt(10000);
assert(true);
} catch (AttemptTimeOutException e) {
fail();
}
}
4.「複数スレッドからロック取得できるの?」テスト
public void testConcurrentAttempt() {
try {
Mutex aMutex = new Mutex("LockFile");
for (int i = 0; i < 100; i++) {
Worker worker = new Worker(aMutex);
worker.start();
}
} catch (MutexException e) {
fail();
}
}
public class Worker extends Thread {
private Mutex aMutex;
public Worker(Mutex aMutex) {
this.aMutex = aMutex;
}
public void run() {
while (true) {
try {
aMutex.attempt(10000);
break;
} catch (AttemptTimeOutException e) {
Thread.sleep(10000);
}
}
aMutex.release();
}
}
#このテスト、記述が不十分です。すべてのスレッドが正しく終了したかどうかチェッ
クされていません。
このほかに、リアルタイム性が重要であれば、「タイムアウト時間は正確ですか?」
テストなどあると思います。
--
Kaoru Hosokawa
khosokawa@....com