7

ファイルを開き、コンテンツを読み取り、いくつかの操作と計算を実行して、それらをセットと辞書に格納するスクリプトを作成しました。

そのようなものの単体テストをどのように書くのでしょうか?私の質問は具体的には:

  1. ファイルが開いたことをテストしますか?
  2. ファイルは巨大です(それはunix辞書ファイルです)。計算をユニットテストするにはどうすればよいですか?文字通りすべてを手動で計算し、結果が正しいことをテストする必要がありますか?これはユニットテストの目的全体を打ち負かすような気がします。stdinを介して入力を受け取っていません。
4

3 に答える 3

16

それはユニットテストの目的ではありません!

  1. あなたのファイルはUNITを表していないので、ファイルをテストしたり、ファイルを使用したりしないでください。
  2. 単体テストでは、a)ファイル処理b)計算を処理する関数/メソッドのすべてのメソッドをテストする必要があります
  3. ユニットテストがテスト対象のユニットのコード行を超えることはめったにありません。

ユニットテストとは、(完全ではなく、本による定義でもない)ことを意味します。

  • ミニマル/アトミック-ユニットを可能な限り最も基本的/シンプルなユニットに分割します。ユニットは通常、呼び出し可能です(メソッド、関数、呼び出し可能オブジェクト)
  • 関心の分離-すべてのテストで1つだけをテストします。単一のユニットのさまざまな条件をテストする場合は、さまざまなテストを作成します
  • 決定論-ユニットに処理するものを与え、その結果がどうなるかを事前に知っておく必要があります
  • テスト対象のユニットに特定の環境が必要な場合は、フィクスチャ/テストセットアップ/モックアップを作成します
  • ユニットテストは(経験則として)非常に高速です!遅い場合は上から別のポイントに違反していないか確認してください
  • 上から何かに違反する何かをテストする必要がある場合は、統合テストに向けてテストの次のステップを実行した可能性があります
  • ユニットテストではなくユニットテストフレームワークを使用できますが、unittest-frameworkを使用しているという理由だけでユニットテストとは呼ばないでください。

この男(Gary Bernhardt)は、テストと単体テストの意味について、興味深い実用的な例をいくつか持っています。

いくつかの説明のための更新

「1.ファイルが開いたことをテストしますか?」

それはできますが、そのための「ユニット」は何でしょうか。テストには、合格と不合格の2つの解決策しかないことに注意してください。テストが失敗した場合、その理由は1つだけである必要があります(理想的にはそうする必要があります)。ユニット(=関数)は最悪です。ただし、この場合、次の理由でテストが失敗する可能性があります。*ファイルが存在しない*ロックされている*破損している*ファイルハンドルが残っていない*記憶から外れている(大きなファイル)*月の満ち欠けなど。

では、失敗した(または合格した)「ユニット」テストは、あなたのユニットについて何と言いますか?ユニットを単独でテストするのではなく、周囲の環境全体をテストします。それはもっとシステムテストです!それでもファイルを開くことができるかどうかをテストしたい場合は、少なくともファイルをモックする必要があります。

「2...計算をユニットテストするにはどうすればよいですか?文字通りすべてを手動で計算して、結果が正しいことをテストする必要がありますか?」

いいえ。コーナーケースと通常のケースのテストを作成し、処理された結果に対して期待される結果を確認します。必要なテストの量は、計算の複雑さとルールの例外によって異なります。

例えば:

def test_negative_factor(self):
   assert result 

def test_discontinuity(self):
   assert raise exception if x == undefined_value

私は自分自身をより明確にしたことを願っています!

于 2012-11-22T21:48:07.240 に答える
6

ユニットテスト可能になるようにコードをリファクタリングする必要があります。それは、私の頭の上に、次のように言うでしょう:

  1. ファイルを開く機能を別のユニットに取り込みます。その新しいユニットにファイル名を受信させ、コンテンツのストリームを返します。
  2. ファイルを開いて読み取るのではなく、ユニットにストリームを受信させて読み取らせます。
  3. メイン(計算)ユニットの単体テストを作成します。たとえば辞書からのストリームをモックする必要があります。ユニットに異なるストリームを提供するたびに、いくつかのテストケースを作成し、ユニットが各入力に対して正しいデータを計算することを確認します。
  4. コードカバレッジを可能な限り100%に近づけます。カバレッジにはノーズテストを使用します。
  5. 最後に、「ストリームプロバイダー」のテストを作成します。いくつかのファイルをフィードし(テストフォルダーに保存します)、ストリームプロバイダーがそれらを正しく読み取ることを確認します。
  6. 可能な限り100%に近い2番目の単体テストカバレッジを取得します。
  7. 今、そして今だけ、あなたのコードをコミットしてください。
于 2013-02-06T16:07:30.213 に答える
0

あなたは計算が何であるかを説明していませんが、あなたのプログラムは大きなファイルのサブセットでも動作できるはずだと思います。この場合は、小さなファイルを開き、計算を実行して結果を生成する単体テストを作成します。これにより、正しいことを確認できます。

于 2012-11-22T21:39:12.937 に答える