2011-01-18 7 views
3

古い手書きのプログラマー、テストケースを書くことに新しい(私が知っている私には恥)。入出力を直接マッピングするテストを記述するか、結果を動的に生成する必要がありますか?

テストケースを書くには二つの方法があるように私には思える:

  1. 地図固定入力が固定出力に、彼らは彼らのダイナミックな出力に
  2. 生成された地図または固定入力と一致していることを主張することを主張試合

# Static testing: 
assert_equal "test".upcase, "TEST" 

# Dynamic testing: 
assert_equal person.full_name, "#{person.title} #{person.first_name} #{person.last_name}" 

もちろん、それぞれのアプローチに長所と短所があります。実装の詳細を複製するのは間違っていますが、サンプルデータを生成してテストを実行することができます。ハードコーディング値は正しい出力を非常に明示的にしますが、コードを再利用するためにはそれを自分自身に貸し出すようには見えません。

前者はテストを書く従来の方法ですか?あなたはアプローチを組み合わせてマッチしますか?後者の方法は、私が考えなかった正当な理由で避けられますか?

答えて

1

checkまたはquickcheckのようなツールを使用して第二のアプローチ、が...

複製実装の詳細 は間違っ

を感じています。あなたのコードでは、タスクが何であるか、タスクがどのように正確に実行されるかを記述します。テストでは、結果についていくつかの不変条件を与えます。最も一般化と同様に既知解テスト(KATS)

EDIT

ノート、これが適用されない状況があります。 KATがランダムテストベクトルよりも優勢である大きな領域の1つは、ほとんどの型システム(ブロックサイズなど)の外に多くの目に見える不変量が存在しないため、暗号(ブロック暗号など)です。確認するプロパティはdecrypt(key,encrypt(key,msg)) == msgです。

単純なジオメトリは、不変量のセットが本当に良いチェックではないという点で幾分異なる問題があります。0 < area(triangle) < triangle.width * triangle.heightと言うこともできますが、これは悪いことです。私がここで得ているのは、わずかに高いレベルのコードのテストを書く必要があるということです。実際には、変更する可能性があり、誤って誤っているという複雑なものです。クイックチェックのプロパティのための良い場所を示すコードの一部のプロパティは

  1. 決定論
  2. 非自明
  3. 明確な不変量

が含まランダムテストベクトル については

状況連結を使った簡単な例(二つのリストを直列に組み合わせて一つの新しいリストを作る):

私には機能があります。concat(xs,ys) = xs ++ ys私は何を確認できますか?私は本当であると思う何でも!長さ?はい!要素?はい!

prop_len(xs,ys) = len(xs) + len(ys) = len(concat(xs,ys)) 
prop_elem(xs,ys) = 
    let cs = concat(xs,ys) 
    elem(head xs, cs) && elem(head ys, cs) && prop_elem(tail xs,ys) && prop_elem(xs,tail ys) 
// Yes, I left out the error checking for empty list, sue me. 

ドリフトを取得しますか?

+0

私の動的テストの例は、メソッドの組み合わせに直接依存していました。たとえば、あるメソッドが三角形の面積を正しく計算しているかどうかをテストする場合はどうなりますか?私は固定入力と出力を使うべきですか、またはテスト中の領域を計算するために重複したコードを実装する必要がありますか?これはあなたが「間違っている」ことを意味しているのですか?これらの種類のテストケースで値を厳密にコードする必要がありますか? – nfm

+0

ありがとう、すばらしい説明 – nfm

1

私はいつか変更したいかもしれないアサーションの上に宣言された一連の変数を持っているので、一般的に2番目のアプローチを使用します。

私は、どのようにしてメソッド呼び出しを実装するのがより明確になるか自問自答しなければならないと思います。私にとっては簡単に2番目のアプローチです。ユニットテストの場合、これは通常意味があります。

アクセプタンステストでは、最初のアプローチがより頻繁に使用されるようです。最近では、APIコールから戻ってくるイメージが正しいことを確認しなければなりませんでした。私は私に与えられた入力に基づいて画像を構築しようとすることができました、または私は参照画像を持つことができました。これは、コードの前に受け入れテストが完了していないことを意味し、開発作業が終了するまで画像を手動でチェックしなければなりません。しかし、いったんイメージが「正しい」とすれば、私はまだ回帰を止める何かを持っています。

一般的に、あなたが書いているテストにどのアプローチがうまくいくかを決めることはあなた次第です。あなたの複製は、その後、あなたはそれが間違ってやっている場合は

関連する問題