C ++の数値アプリケーションのテストスイートですか?


13

最近、私は自分のグループにコードを書く際により多くのテストを含めるよう促しています。適切なテスト体制が整っていなかったため、おそらく話すのに必要な時間よりもはるかに長い時間がかかる、いくつかの大きなバグがありました。

ただし、プロセスを自動化(または合理化)するための適切なツールがあれば、きっと役に立つと思います。一方、C ++テストスイートのさまざまなオプションがわからず、それらをどのように決定するのですか?

何を探すべきかについてのガイドラインはありますか?また、数値アプリケーションに特化したものはありますか?

回答:


11

数値コードのテストに関する問題は、(i)正確な出力を常に知っているとは限らず、計算結果を保存して後で比較することしかできない、つまり回帰テストを行うことができること、および(ii)その結果は、丸めが異なるため、マシンごとにわずかに異なる場合があります。

deal.IIの仕組みについては、http://www.dealii.org/developer/development/testsuite.html#regression_testsを ご覧ください。


単体テストの制限に関する良い点。回帰テストは良いことです(出力が不明であるため、まったくテストしないよりは確かに優れています。バグに関する警告サインを与えることができます)。マシンの丸めの問題に関しては、それを緩和することは試行錯誤によって適切な許容範囲を選択することになりますか?
ジェフオックスベリー

2
それは絶え間ない痛みです。10年以上のテストの中で、私たちはそれに対処するための本当に良い戦略を思いつきませんでした。diffの代わりにnumdiffを使用すると役立ちますが、最終的には、正しい数値が0.39875のときに、「0.3988」ではなく「0.3987」を保存するマシンを指定する必要があります。しきい値をどこに設定しても、常に間違った場所で別の番号を切り捨てます。
ヴォルフガングバンガース

@WolfgangBangerth。浮動小数点の動作をより決定的にする特定のコンパイラ固有のフラグがあります。たとえば、/ fp:strict | preciseおよび/ Qimf-arch-consistency:true(Intelコンパイラー)または-fnounsafe-math-optimizations、-ffloat-store(GCC)は、パフォーマンスを犠牲にして、プラットフォーム間でコードの一貫性と再現性を高めることができます。 。微調整を行うことで、これは特別な「再現可能な」ビルドを提供します。これはテスト専用に使用できます。
アンドレ

@Andre-そうそう、これらすべてを試しました。まだ難しいです:
ヴォルフガングバンガース

10

私は最近、私が取り組んでいるいくつかの数値ライブラリをテストするためにgoogletestを使用しており、非常に満足しています。非常に簡単なテストを非常に迅速に記述することも、データの初期化などを必要とする複雑なテストを記述することもできます。また、ビット単位ではなく浮動小数点比較を簡単に行う方法も提供します(他の多くの人がそうしているようです)。


googletestの良い点は、アプリケーションにソースコードを簡単に含めることができるため、依存関係にする必要がないことです。
ジェフオックスベリー

4

CMakeを使用してコードを構築している場合、ctestメカニズムは当然の選択です。コマンドを使用してコードを手動でテストすることができctestCDashを介した広範な夜間テストもサポートします。


1

計算生物学C ++ライブラリ(Chaste)には、http://cxxtest.com/を使用します。これは非常に使いやすく、うまく機能し、assert()スタイルステートメントでテストするためのいくつかのマクロを提供します。科学計算では、これらは一般に単純な直接比較TS_ASSERT_EQUALS(a,b)または数値比較TS_ASSERT_DELTA(a,b,tolerance)です。

これらの基本的なマクロを使用して追加のマクロを簡単に記述し、独自のベクター/マトリックスを選択して比較することもできます。また、コードが特定の状況で適切な警告とエラーメッセージをスローすることを確認することもできます。testソースコードのフォルダーでいくつかの例を参照できます:https : //chaste.cs.ox.ac.uk/trac/browser/trunk

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.