私はしばしば、コードの一部がスレッドセーフであることを証明する単体テストを書いています。通常、私は生産時に見つかったバグに対応してこれらのテストを書いています。この場合、テストの目的は、バグが複製されていること(テストが失敗している)、新しいコードがスレッドの問題を修正したこと(テストパス)を示し、その後のリリースの回帰テストとして機能することを示します。
私が書いたテストのほとんどはスレッドの競合状態をテストしていますが、スレッドのデッドロックもテストしています。
コードが積極的にユニットテストされているのは、スレッドセーフです。少し難解です。単体テストは書くのが難しいわけではありませんが、スレッドが安全でない可能性のあるものを判断するためには、しっかりとした分析が必要です。分析が正しい場合は、コードスレッドを安全にするまで失敗するテストを書くことができます。
スレッド競合状態のためにテストする場合は、私のテストはほとんど常に同じパターンに従って
:(これは擬似コードです)
boolean failed = false;
int iterations = 100;
// threads interact with some object - either
Thread thread1 = new Thread(new ThreadStart(delegate() {
for (int i=0; i<iterations; i++) {
doSomething(); // call unsafe code
// check that object is not out of synch due to other thread
if (bad()) {
failed = true;
}
}
});
Thread thread2 = new Thread(new ThreadStart(delegate() {
for (int i=0; i<iterations; i++) {
doSomething(); // call unsafe code
// check that object is not out of synch due to other thread
if (bad()) {
failed = true;
}
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
Assert.IsFalse(failed, "code was thread safe");
を余裕があると同じくらいの品質です
**そのコードはスレッドセーフかどうか、スレッドセーフのいずれかです。 –
@DavidHeffernanうーん.....助けて! – Jon
ほとんどの場合、コードについて推論することで、この種の検証を行う必要があります。Marcが説明しているテストの種類は非常に便利で、多くのメリットがあります。しかし、彼らは何かを証明するのには不十分です。 –