35

ソフトウェアテストは、特に科学において非常に重要であると私は確信しています。ただし、過去6年間、定期的なテストが行​​われている科学ソフトウェアプロジェクトに出くわしたことはありません(ほとんどのプロジェクトはバージョン管理されていませんでした)。

今、私はあなたが科学的コード(数値計算)のためのソフトウェアテストをどのように扱うのか疑問に思っています。

私の見解では、正確な結果がないため、標準の単体テストではポイントを見逃すことがよくあります。そのためassert(a == b)、「通常の」数値エラーのために使用が少し難しい場合があります。

だから私はこれについてのあなたの考えを読むのを楽しみにしています。

4

4 に答える 4

12

同様の問題(グーグル:「科学ソフトウェアのテスト」)を調べていて、興味があるかもしれないいくつかの論文を思いついた。これらは、ありふれたコーディングエラーと、結果が正しいかどうかを知るというより大きな問題(地球のマントルの深さ?)の両方をカバーしています。

http://http.icsi.berkeley.edu/ftp/pub/speech/papers/wikipapers/cox_harris_testing_numerical_software.pdf

http://www.cs.ua.edu/~SECSE09/Presentations/09_Hook.pdf(壊れたリンク。新しいリンクはhttp://www.se4science.org/workshops/secse09/Presentations/09_Hook.pdfです)

http://www.associationforsoftwaretesting.org/?dl_name=DianeKellyRebeccaSanders_TheChallengeOfTestingScientificSoftware_paper.pdf

09_Hook.pdf(matmute.sourceforge.netも参照)で説明されているミューテーションテストのアイデアは、私たち全員が犯す単純な間違いを模倣しているため、特に興味深いと思いました。最も難しい部分は、シングルパスコードレビュー(人または機械)ではなく、信頼水準の統計分析の使用方法を学ぶことです。

問題は新しいものではありません。「科学ソフトウェアはどれくらい正確ですか?」のオリジナルコピーを持っていると確信しています。Hatton et al 1994年10月によると、それでも、同じ理論の異なる実装が(アルゴリズムとして)かなり急速に分岐したことを示しています(Kelly&Sandersの論文の参照8でもあります)

---(2019年10月)最近の科学ソフトウェアのテスト:系統的文献レビュー

于 2012-04-23T10:32:12.340 に答える
11

私も学界にいて、クラスターで実行する量子力学シミュレーションプログラムを作成しました。テストやバージョン管理についても同じことを観察しました。さらに悪いことに、私の場合、シミュレーションにC ++ライブラリを使用していて、他の人から取得したコードは純粋なスパゲッティコードであり、継承も関数もありませんでした。

私はそれを書き直し、いくつかのユニットテストも実装しました。数値の精度を処理する必要があるのは正しいです。数値の精度は、実行しているアーキテクチャによって異なる場合があります。それでも、これらの数値の丸め誤差を考慮に入れている限り、単体テストは可能です。結果は数値の丸めに依存しないようにする必要があります。そうしないと、アルゴリズムの堅牢性に関して別の問題が発生します。

したがって、結論として、私は自分の科学プログラムに単体テストを使用します。これにより、特に最終的にデータを公開することに関して、結果についてもう1つ自信が持てるようになります。

于 2010-08-06T06:53:25.490 に答える
8

また、cpptestを使用していTEST_ASSERT_DELTAます。私は計算電磁気学で高性能の数値プログラムを書いていて、C++プログラムでそれを楽しく使っています。

私は通常、他の種類のコードと同じ方法で科学コードをテストしますが、いくつかの修正を加えるだけです。

  • 私は常に、物理的に意味のないケースについて数値コードをテストし、結果を生成する前に計算が実際に停止することを確認します。私はこれを難しい方法で学びました。いくつかの周波数応答を計算する関数があり、それらを使用して作成された行列を引数として別の関数に提供し、最終的にその答えに単一のベクトルを与えました。マトリックスは、信号が適用された端子の数に応じて任意のサイズにすることができましたが、私の関数は、マトリックスのサイズが端子の数と一致しているかどうかをチェックしていませんでした(2つの端子は2 x 2 xnマトリックスを意味するはずです)。ただし、コード自体はそれに依存しないようにラップされており、行列に対していくつかの基本的な行列演算を実行する必要があるため、行列のサイズは関係ありませんでした。最終的に、結果は完全にもっともらしいものであり、期待される範囲内であり、実際、部分的に正しい-解ベクトルの半分だけが文字化けしていた。理解するのに少し時間がかかりました。データが正しく見える場合、データは有効なデータ構造に組み立てられており、数値は良好です(たとえば、NaNがない、または粒子の数が負である)が、物理的に意味がない場合、関数は正常に失敗する必要があります。

  • I / Oルーチンは、テストファイルからコンマ区切りの数値を読み取っているだけの場合でも、常にテストします。ねじれた数学を行うコードを書いているときは、記号を理解するためだけにカフェインの衝撃が必要になるほど数学が重いコードの部分のデバッグに飛びつきたくなることが常にあります。\n数日後、ポイントのリストにのASCII値も追加していることに気付きます。

  • 数学的な関係をテストするとき、私は常に「本によって」それをテストします、そして私はまたこれを例によって学びました。2つのベクトルを比較することになっているが、要素の同等性のみをチェックし、長さの同等性をチェックしなかったコードを見ました。

于 2010-08-08T01:09:15.170 に答える
2

SOの質問に対する回答をご覧ください。TDDを正しく使用して数値的方法を実装するにはどうすればよいですか。

于 2010-08-06T06:37:27.063 に答える