2013-06-12 10 views
7

私はこの質問をするのは少し恥ずかしいと感じますが、私は不思議です。私は最近、ストアのログファイルを読み込んでデータベースに情報を保存するスクリプトを(モジュールでコードを整理することなく)書きました。このスクリプトはscript.plと呼ばれ、Perl:テストの定義は何ですか?

while (<$infile>) { 
    if (/item_id:(\d+)\s*,\s*sold/) { 
     my $item_id = $1; 
     $item_id_sold_times{$item_id}++; 
    } 
} 
my @matched_items_ids = keys %item_id_sold_times; 
my $owner_ids = 
    Store::Model::Map::ItemOwnerMap->fetch_by_keys(\@matched_item_ids) 
    ->entry(); 
for my $owner_id (@$owner_ids) { 
    $item_id_owner_map{$owner_id}++; 
} 

セイ:たとえば

は、私は(リチャードHuxtonを経由して)このようなものを書きました。ファイルをテストするとき、私はファイルscript.tを作り、script.tの中のscript.plのいくつかのブロックを繰り返さなければなりませんでした。

is($item_id_sold_times{1}, 1, "Number of sold items of item 1"); 
is($item_id_owner_map{3}, 8, "Number of sold items for owner 3"); 

などなどなど:コピーは、関連するコードセクションを貼り付けた後、私のような確認を行います。

しかし、私が書いたことはテストではないことを指摘している人もいます。これは確認スクリプトです。良いテストは、モジュールでコードを記述し、モジュール内のメソッドを起動するスクリプトを作成し、モジュールのテストを書くことです。

これは、ソフトウェアエンジニアリングで最も広く使用されているテストの定義が何であるかを考えさせてくれました。おそらくPerlのコア関数をテストしたことのある人でさえ、私に手を差し伸べることができます。スクリプト(モジュール化されていない)を適切にテストすることはできませんか?妥当性に対する検証に得ることなく

よろしく

+1

私はそれを私の仲間に伝え、彼らが物事を尋ね続けるならば、私はBrian d foyを引用しています。これはあなたの本からここで学んだ通りに働くはずです:) – ado

+0

テストは、利害関係者に貴重な情報を提供するものです。まったく異なる質問は、perlスクリプトの単体テストを書くべき方法です。 :-) – Edu

答えて

10

重要な違いは、誰かがあなたの 'script.pl'ファイルを編集(バグ修正や新機能)した場合、あなたの 'script.t'ファイルを現在の状態で実行すると、新しい 'script.pl'?この場合には、抜粋を選択的にコピー/貼り付けるのではなく、.plファイルincludeまたはuseにする必要があります。

ソフトウェアをモジュール式に設計し、テストを行うことをお勧めします。事実の後にモノリシックなスクリプトをテストしたい場合は、exit()の後にメインプログラムincludeがあり、少なくともテストするサブルーチンがあるテストスクリプトを書くことができます。

2

など、テストは、行動が要件に合致し、特定の望ましくない行動が発生しないことをことを、何か他のその動作を確認し任意の活動です。テストの範囲は限られていても(必要な動作のうちのいくつかを検証するだけである)、包括的(必要または望ましい動作のほとんどまたはすべてを検証する)である可能性があります。 。私の考えでは、あなたの文脈における「確認」という言葉は、「限られた範囲のテスト」という別の方法です。確かに、それはあなたのテストの動作を完全には検証しませんが、何かをします。手元にある質問への直接的な答え:あなたが「確認」をしたことをセマンティクスの問題と呼んでいると思います。

4

プログラムmodulinoとして設定すると、モジュールのようになります。私は全面的にこれについて書いてきましたが、最も顕著なものはMastering Perlです。私は公衆の第2版で作業しているので、今すぐread Chapter 18 for online for freeすることができます。 :)

関連する問題