4

私は一般的に、いくつかの合理的に小さく明確に定義された入力を考えれば、正しい動作を簡単に定義したコードに対して単体テストを使用しようとします。これはバグを捕捉するのには非常に効果的ですが、私は個人的な汎用ライブラリのライブラリで常にそれを行います。正しさが不適切に定義されているかどうかのテスト?

しかし、私が書くコードの多くは、基本的に大きなデータセットで重要なパターンを探すデータマイニングコードです。この場合の正しい動作はよく定義されていないことが多く、人間が予測するのが容易ではない方法で多くの異なる入力に依存します(つまり、数学は手作業で合理的に行うことができません。最初に問題を解決するためのコンピュータ)。これらの入力は非常に複雑で、合理的なテストケースを思い付くことは不可能に近いところまであります。テストに値するエッジケースを特定することは非常に困難です。アルゴリズムが決定的でない場合もあります。

通常、私は正気チェックのためのアサーションを使用し、既知のパターンの小さなおもちゃのテストケースを作成し、必ずしも客観的に正しいものではなく、少なくとも「合理的に見える」かどうかを非公式に見て行うことができます。このようなケースをテストするためのよりよい方法はありますか?

答えて

-2

最終的には、プログラムが何をしているのかを決定し、それをテストする必要があります。

+0

-1彼はテストする方法を尋ね、あなたはテストするように彼に言った。おそらく、あなたは精緻化することができます。 – DevinB

3

私はあなたのコードがあなたがしたいことを正確に行っていることを確認する小さなデータセットに基づいて単体テストを書く必要があると思います。これにより合理的なデータマイニングアルゴリズムが提供される場合、別の問題であり、単体テストで解決することはできないと思います。あなたのコードの正しさの二つの「レベルが」あります

  1. あなたのコードが正しくあなたが実装データマイニングアルゴリズムは、「正しい」で与えられたデータマイニングアルゴリズム(あなたがすべきこの事単体テスト)
  2. を実施しています - ビジネス上の問題を解決します。これは非常に未解決の問題です。おそらく、アルゴリズムのいくつかのパラメータと実際のデータの両方に依存しています(異なるアルゴリズムはさまざまな種類のデータに対して機能します)。
1

さて、いくつかの回答があります。 まず、あなたが言及したように、小規模なケーススタディを取って、数学を手作業で行います。あなたがアルゴリズムを書いたので、それが何をすべきかを知っているので、限られたケースでそれを行うことができます。

もう1つは、プログラムのすべてのコンポーネントをテスト可能な部分に分割することです。 AコールBがCコールを呼び出すと、A、B、C、Dがすべて正しい答えを得て、A-> B、B-> C、およびC-> Dをテストすると、 A→Dが正しい応答を与えていることを合理的に確信してください。

また、探していることを行う他のプログラムがある場合は、そのデータセットを取得してください。あるいは、テストデータを利用できるオープンソースプロジェクトで、アプリケーションが似たような結果を出しているかどうかを確認してください。

データマイニングコードをテストするもう1つの方法は、テストセットを取得して、探しているタイプのパターンを導入してから、もう一度テストして、新しいパターンと古いパターンを切り離すかどうかを確認することです。

そして、試してみると、あなた自身のコードを手作業で歩き、コードがあなたがするべきことをしているかどうかを確認してください。

3

このような対面のケースでは、現実のデータの適切な基本的な複雑さを反映する1つ以上のスタブデータセットを構築する傾向があります。私はしばしば顧客と一緒にこれを行い、複雑さの本質を捉えるようにします。

次に、非常に特殊な単体テストを行うための基礎として使用できる1つ以上のデータセットにこれらをコーディングすることができます(スタブデータとの統合テストによく似ていますが、それは重要な区別ではありません)。だから、あなたのアルゴリズムは、 "一般的な"データセットの "あいまいな"結果を持っているかもしれませんが、これらのアルゴリズムは、ほとんどの場合、特定のデータセットに対する正しい答えがほとんど常にあります。

0

あなたのアプリケーションは、ファジィで非決定的な種類のタスクをスマートな方法で実行することを目的としているため、達成することを望む目標は、アプリケーションが人間よりも優れているということです。これらのパターンを見つける。それは偉大で強力で涼しいですが、もしそれを取り除くと、人間は「この場合、答えはXでなければなりません」と言うのは非常に難しくなります。

実際、理想的には、コンピュータは、「実際ではありません。私はあなたがそれを考える理由は理解していますが、ここではこれらの4.2テラバイトの情報を考慮してください」と述べています。 Zでなければなりません。

最終的な目標に本当に成功した場合、最終的なユーザーは「Zowie、あなたが正しい」と言われるかもしれませんが、これはより良い答えです。私たちのお金、または何でも)。

このようなことは起こり得ない場合は、まず、コンピュータにこれらの種類のパターンを検出するように依頼していますか?

私が考えることができる最も良いことは、現実の生活がテストシナリオのリストを構築するのを助けることです。過去に発見された貴重なパターンがあった場合は、同様のデータが与えられたときにシステムがそれを検出するかどうかを確認する「ユニットテスト」を行います。私は単体テストのようなものかもしれないので、 "単体テスト"と言っていますが、NUnitやVS.Net、RSpec、あるいはあなたが使っている単体テストツールを使用することもできます。

これらのテストの中には、4.2テラバイトのデータを "模擬"しようとしているかもしれません(実際にはデータを模擬しませんが、あるレベルではそのデータから得られた結論の一部)。他の人のために、おそらく、あなたは、パターンのセットが検出されることを期待するいくつかのデータを持つ "テストデータベース"を持っています。

また、もしあなたがそれを行うことができれば、システムが検出したパターンの後ろにその推論を「記述する」ことができればそれは素晴らしいことでしょう。これにより、ビジネスユーザーは、アプリケーションが正当なものかどうかの問題について審議することができます。

0

これは扱いにくいです。これは、テキスト検索エンジンのテストを書くのと同じように聞こえます。あなたが苦労し続ける場合は、あなたが何かを把握う:簡略化され、小さいながらも合理的に代表的なデータサンプルと

  • スタートをし、やって基本的な動作をテストこの
  • よりもむしろ出力が正確にいくつかの答えであることを主張し、時にはそれについて重要なことを理解する方が良い場合もあります。たとえば、私たちの検索エンジンでは、3つの主要なものが結果の最初のページにある限り、ドキュメントがリストされた正確な順序にはあまり気にしませんでした。
  • 少しずつ変更を加えていくうちに、その本質を突き止め、そのテストを書く。全体的な計算には多くの入力が必要ですが、コードベースへの個々の変更は分離可能でなければなりません。たとえば、一部のキーワードにハイフンが含まれているため、特定の文書が表示されていないことが判明しました。私たちは、これが私たちの期待通りに動作していることをテストするテストを作成しました。
  • Fitnessのようなツールを見てください。このツールを使用すると、コードの一部に多数のデータセットをスローし、結果に関するものをアサートすることができます。これは、より伝統的な単体テストよりも理解しやすくなります。
  • 私は製品の所有者に戻って、「これがどのように機能するのか理解できません。どうすれば正しいのか分かりますか?おそらく、彼はぼんやりと定義された問題の本質を明確に表現することができます。これは私にとって何度ものようによくの仕事をしてきました。
  • 創造的!
関連する問題