3

BDD と RSpec にはかなり慣れていないので、RSpec のテスト/例を書くときに人々が通常何をするのか、特に同じことの肯定的テストと否定的テストに関連しているため、非常に興味があります。

たとえば、ユーザー名の検証と、有効なユーザー名には英数字のみが含まれるというルールを考えてみましょう。

肯定的/肯定的なテストは次のようになります。

it "should be valid if it contains alphanumeric characters"
  username = 'abc123'
  username.should be_valid
end

ネガティブテストは次のようになりますが:

it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid
end

1 つのテストを作成しますが、もう 1 つのテストは作成しませんか? 両方書きますか?それらを同じテストにまとめますか?人々が上記のいずれかを実行する例を見たので、ベストプラクティスがあるかどうか疑問に思っていました。もしそうなら、それは何ですか?

ポジティブ テストとネガティブ テストの両方を記述する例:

it "should be invalid if it contains non-alphanumeric characters"
  username = '%as.12-'
  username.should_not be_valid

  username = 'abc123'
  username.should be_valid
end

私はこの方法でそれを行っている人々の例を見てきましたが、正直なところ、私はこのアプローチのファンではありません. メソッドの書き方と同じように、私は 1 つの目的のために物事をクリーンで明確に保つ側で過ちを犯しがちです。それで、この種の何かを述べるベストプラクティスはありますか? その例では、すべての角度ではなく、1 つの角度から単一の機能/動作をテストする必要があります。

4

3 に答える 3

2

このような状況では、自分が行っていることが実際にはテストではないことを理解するのに役立ちます。クラスを使用する方法/理由の例と、その動作の説明を提供しています。価値のある行動を固定するために複数の例が必要な場合は、両方を含めても問題ないと思います。

したがって、たとえば、リストの動作を説明する場合、「リストが空かどうかをリストが教えてくれるはずだ」と説明する 2 つの例が必要になります。空の例も完全な例も、それ自体では価値がありません。

一方、何かが有効であるデフォルトの状況があり、その後にいくつかの例外的なケースが続く場合、その「有効な」状況は独立して価値があります。後で発見する他の状況があるかもしれません。例えば:

  • 英数字以外では無効にする必要があります
  • すでに使用されている名前については無効にする必要があります
  • 数字のみの場合は無効にする必要があります
  • アクセント付きの文字に有効であるべき

この場合、あなたの行動には、行動の価値ある側面の 2 つの側面を形成するというよりも、偶然に 2 つの例があります。有効な動作は、それ自体で価値があります。したがって、この場合、テストごとに 1 つの例を使用しますが、通常はテストごとに動作の 1 つの側面を使用します。

これは、他のブール値以外の動作にも適用できます。たとえば、私が ATM ソフトウェアを作成している場合、現金を提供し、口座から引き落とす必要があります。どちらの行動も、他方なしでは価値がありません。

「テストごとに 1 つのアサーション」は経験則です。使いすぎる可能性があり、代わりに「テストごとの動作の1つの側面」の場合があります。これはそのようなケースの 1 つではありませんが、とにかく言及する価値があると思いました。

于 2011-08-12T23:11:38.190 に答える
2

その特定のケースでは、ポジティブとネガティブの両方について書きます。これは、有効なユーザー名を持つユーザーがそのユーザー名を使用できるようにし、無効なユーザー名を使用しようとするユーザーがそれを実行できないようにする必要があるためです。

また、このようにして、有効であるべき/有効ではないユーザー名が本来あるべきものとは反対に通過した場合、それらのテストは既にあり、失敗したテストをテストの正しいカテゴリに追加するだけの簡単な問題です。テストが実際に失敗することを確認し、それを修正してから、テストが成功することを確認します。

はい、この場合は両方をテストしてください。どちらか一方だけではありません。

于 2011-08-11T06:22:06.867 に答える
1

このパターンは通常、「テストごとに 1 つのアサーション」として知られています。

于 2011-08-11T22:16:13.140 に答える