8

重複の可能性:
スレッド化されたコードを単体テストするにはどうすればよいですか?
マルチスレッド コードをテストするためのガイドライン、またはコードがスレッド セーフであることを確認するためのガイドライン

単純なクラスがスレッドセーフかどうかを「単体テスト」することは可能ですか?

私の特定のケースは、ベクトルをサブセット化する単純なクラスです。保持するベクトル位置の「ホワイトリスト」と入力ベクトルが与えられると、ホワイトリスト内の位置の値のみを持つ出力ベクトルが生成されます。単体テストを作成して (可能であれば)、将来このクラスをリファクタリングする場合にスレッド セーフを維持することを確認したいと思います。クラスがスレッドセーフでなくなった場合、単体テストは失敗します。これはやや曖昧で定義が不十分であることを認識しています。

4

2 に答える 2

5

スレッドセーフは、クラスが持っている、または持っていないプロパティです。スレッドセーフとは、コンテキストに応じて、競合状態がないこと、特定の順序でコードを実行することなどを意味します。

テストではバグがないことを証明することはできず、バグを明らかにすることしかできません。マルチスレッドコードが正しいことを確認した私の(それほど広範ではない)経験では、おそらく最良のヒントは、コードをできるだけ単純で明確に保ち、​​検査によってバグを発見しようとすることです。テストを繰り返し実行しても、あまり役に立ちません。

于 2012-08-20T16:30:02.413 に答える
5

これはまさにJava Pathfinderの目的です。少し急な学習曲線がありますが、このツールを使用して徹底的な証明を構築することは実際に可能です。シナリオを作成して JPF で実行すると、JPF は考えられるすべてのスレッド順序を調査して、考えられるエラーを見つけます。JPF がチェックするアサーションをプログラムに組み込む必要があります。JPF は実行中に順次の一貫性を前提としていますが、Java Racefinder プラグインを使用してそれを証明することもできます。

確かに、適切な証明を作成するのは困難ですが、可能です。JPF を使用して、他の方法では見逃す可能性のある同時実行エラーを根絶することができます。

于 2012-08-20T16:42:17.230 に答える