科学計算ライブラリの単体テスト
以前、ユニットテストの経験が少しありました。(軽jor的ではなく)古典的なソフトウェアエンジニアリングプロジェクト:MVC、ユーザーGUI、データベース、中間層のビジネスロジックなど。 m C#で科学計算ライブラリを作成する(そう、C#が遅すぎること、Cを使用すること、車輪を再発明しないことなど)私たちはそれを必要としています)。ソフトウェア開発業界の観点から見ると、これは小さなプロジェクトです。なぜなら、私はほとんど自分で、そして時々同僚の助けを借りて書いているからです。また、私はそれに支払われません、そして最も重要なのは、学術プロジェクトです。つまり、いつかプロ品質になると期待しています。なぜなら、私はオープンソースになることを計画しているからです。 とにかく、プロジェクトは大きくなり(18,000行程度のコードで、1人のプロジェクトにとっては大きいと思います)、手に負えなくなりました。私はgitをソース管理に使用していますが、大丈夫だと思いますが、古い学校のようにテストしています。つまり、主にシステムの大部分をテストする完全なコンソールアプリケーションを作成しています。このシナリオで単体テストを行うことはできますが、それが私がやるべきことだと思います。問題は、ライブラリの大部分がアルゴリズム(たとえば、グラフアルゴリズム、分類器、数値ソルバー、ランダム分布など)であるということです。これらのアルゴリズムのそれぞれに小さなテストケースを指定する方法がわかりません。確率論的正当性を検証する方法がわかりません。たとえば、分類の場合、精度や再現率などの指標がありますが、ただし、これらのメトリックは、単一のアルゴリズムを判断するよりも2つのアルゴリズムを比較する方が適切です。だから、ここで正確さを定義するにはどうすればよいですか? 最後に、パフォーマンスの問題もあります。まったく異なるテストセットを知っていますが、パフォーマンスは、ユーザーの満足度や他のソフトウェアエンジニアリングメトリックではなく、科学ツールの重要な機能の1つです。 私の最大の問題の1つは、データ構造にあります。kd-treeについて考えられる唯一のテストはストレステストです。大量のランダムベクトルを挿入してから、大量のランダムクエリを実行し、単純な線形検索と比較します。パフォーマンスについても同じです。数値オプティマイザーを使用すると、テストできるベンチマーク関数がありますが、これもストレステストです。これらのテストは単体テストとして分類できるとは思わず、最も重要なのは、それらのほとんどがかなり重いため、継続的に実行されることです。しかし、これらのテストを実行する必要があると思います。2つの要素を挿入してルートをポップすることはできません。はい、0-1-nの場合に機能します。 それで、もしあれば、この種のソフトウェアの(ユニット)テストアプローチは何ですか?そして、コードビルドビルドコミット統合サイクルの周りでユニットテストと重いテストをどのように整理しますか?