私の計算科学プログラミングの多くに、標準のテストフレームワークではカバーされないテスト要件があることがわかりました。
計算時間テスト
- アルゴリズムが遅くならないようにするため。私は次のようなことをすることができます
assureSmallerEqual(RuntimeWrapper(algorithm),53)
が、アルゴリズムに取り組んでいるときに53秒のしきい値を継続的に減らしたい、つまりassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- アルゴリズムが遅くならないようにするため。私は次のようなことをすることができます
性能試験
- 以前に分析解の良い近似を見つけたアルゴリズムが、少なくとも同じかそれ以上の解を見つけることを確認するため。繰り返しになりますが、これは標準の統合テストでエミュレートできますが、アルゴリズムが次第に良くなるにつれて、許容範囲を継続的に縮小したいと思います。交換
assureAlmostEqual(foo(),1,places=3)
することを考えるassureAlmostEqual(foo(),1,places='previousbest')
- 以前に分析解の良い近似を見つけたアルゴリズムが、少なくとも同じかそれ以上の解を見つけることを確認するため。繰り返しになりますが、これは標準の統合テストでエミュレートできますが、アルゴリズムが次第に良くなるにつれて、許容範囲を継続的に縮小したいと思います。交換
物理的要件のテスト
- アルゴリズムが突然より多くのメモリ/ハードディスク領域を必要としないことを確認するため。1に非常に似ています。
抽象要件テスト
- 二次近似でうまくいったアルゴリズムが突然3次近似を必要としないこと、またはタイムステップ0.1でうまく行ったアルゴリズムが安定性のために突然0.01を必要としないことを確認するため。繰り返しになりますが、これらは標準の統合テストでエミュレートできますが、目標は、特定の目標を達成した最小要件パラメーターを覚えておくことです。そのため、これには多くの手動更新が必要になります。たとえば、
foo(10)
以前に例外がスローされなかった場合は、フレームワークがfoo(10)
引き続き機能することを確認し、現在機能するかどうかを試しfoo(9)
ます(この場合、今後のすべてのテストで機能することを確認しfoo(9)
ます)。
- 二次近似でうまくいったアルゴリズムが突然3次近似を必要としないこと、またはタイムステップ0.1でうまく行ったアルゴリズムが安定性のために突然0.01を必要としないことを確認するため。繰り返しになりますが、これらは標準の統合テストでエミュレートできますが、目標は、特定の目標を達成した最小要件パラメーターを覚えておくことです。そのため、これには多くの手動更新が必要になります。たとえば、
たとえば、ランタイムの増加は他の改善の見返りとして受け入れられる可能性があるため、私が求めているのはユニット/統合テストの意味でのテストについて記述していないと主張することができます。
ただし、実際には、上記のテスト機能があれば、導入したバグのために要件とパフォーマンスが95%失敗したため、デバッグ時間を大幅に節約できたと思います。実際、外部の数値ソフトウェアライブラリを使用して(多くの時間を自分のコードのチェックに費やした後で)見つけた多くのバグは、上記のテストを厳密に適用すれば、簡単に回避できたという事実を知っています。
PS
同様の名前の質問/programming/34982863/framework-for-regression-testing-of-numerical-codeは、標準の回帰テストフレームワークでより簡単に達成できる機能を説明しているため、重複していません。
質問ユニットテストとテスト駆動開発のための戦略、それらを実装する(とその答えで提供され、それは/を要求戦略が、私は私の意見では、ここで説明するものとは異なっている)ことができますフレームワークとは対照的に、戦略を要求します。