Index: [Article Count Order] [Thread]

Date:  Sat, 30 Sep 2000 15:21:10 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:00989] Re: ファイルロックユーティリティ
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B5FBB479.3C08%khosokawa@....com>
In-Reply-To:  <97BA340C0480D411BDA800062939A1890607B6@....jp>
Posted:  Sat, 30 Sep 2000 15:18:32 +0900
X-Mail-Count: 00989

ホソカワです。

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