1

たとえば、名前が文字のみで、4 ~ 14 文字の長さであることを検証したいと思います。モデルに次のコードがあります。

    validates: name, :format => { :with => /^[a-zA-Z]+$/,
                                  :message => 'Name should be letters only. },
                     :length => { :minimum => 4, :maximum => 14 }

だから、明らかに私がやりたいことをやらせてくれます。
しかし、単体テストに関しては、私は少し完璧主義すぎるので、次のように設定します

invalid_names = ['1234',
                 'qwe',
                 '1%#$#$',
                 'Sam1',
                 '%',
                 random_string(15)] #I also have a test method to create random string with parametrized length

valid_names = %w['test',
                 'Travis',
                 'John',
                 random_string(5),
                 random_string(14),
                 random_string(4)]

次のように、アサートを使用してループでそれぞれをテストします

invalid_names.each do |name|
    user = User.new(:name => name)
    user.save
    assert user.errors[:name].any?, "#{name} is valid."
end

だから、それは間違いなくうまく機能します。しかし、それは冗長すぎます。また、期待どおりに機能することは間違いありませんが、テストが実際にすべてのシンボルとその組み合わせ、すべての長さなどを実際にテストするかどうかはわかりません。
では、完璧主義になりすぎずに、ロジックの大部分をテストしたままにして、検証をテストするための受け入れ可能な方法は何ですか?
完璧なコードを書くためだけに完璧なコードを書こうとして、主な最終目標である実用的な製品を忘れるというマインドトリックに陥っているだけですか?

4

2 に答える 2

2

私はこのように考えています: 何をテストしようとしていますか? 正規表現についてどの程度確信がありますか (この場合は非常に単純です)。

ランダム文字列テストは意味がなく、IMO であり、読者にとって意味がありません。生成関数の名前が不十分であり、正規表現に一致する名前のみを生成することを示していないためです。これはコンテキストから収集できますが、それでも仮定

TDD の人々は私の顔を殴りますが、最初の開発が永続的な価値を持つようになった後、これらのテストに参加することを私は確信していません。ロジックは些細なものであり、検証よりもRailsのテストに重点を置いているように見えるため、これをテストすることに価値があるとは確信していません。

文字列生成方法に関する私のコメントをデルタしますが、表示されたテストに問題はありません。テストがある場合、これはそれらを作成するための合理的な方法であり、どちらにもユースケースを追加するのは簡単であり、テスト時間のわずかな増加を除いて、害はありません.

于 2013-03-12T11:37:43.350 に答える
1

どれだけテストしても、プログラムがもう少し複雑になると、パス カバレッジに到達することはありません。したがって、特定の組み合わせをテストしようとするのではなく、既に試したものとは構造的に異なるすべての組み合わせをテストしてみてください。したがって、たとえば、3 つの int を取り、その int を辺の長さとして三角形を構築するアルゴリズムを取得した場合、可能な解決策を 1 つだけ試しますが、解決策が間違っている可能性があるすべての理由で不可能な解決策を試してください。非数値入力だけでなく、ピタゴラスの定理を満たさない三角形も含まれます。したがって、あなたの例では、ランダムな文字列をテストするのではなく、null、オーバーフロー、特殊文字などをテストしてください。

于 2013-03-12T11:40:39.157 に答える