2012-02-17 3 views
31

なぜそれがすべてのユニットテストフレームワーク(私の知っているが、:)平等テストで期待値が常に最初の引数であることを必要とすることである。ユニットテスト:平等テストで期待される引数が常に最初になるのはなぜですか?

Assert.AreEqual(42, Util.GetAnswerToLifeTheUniverseAndEverything()); 

assertEquals(42, Util.GetAnswerToLifeTheUniverseAndEverything()); 

など

私はかなりそれに慣れて現在、ユニットテストを教えようとしているすべてのコーダーは、私が完全に理解している議論を逆転させて間違えています。 Googleが助けてくれなかった、ハードコアのユニットテスターの1人が答えを知っていたのだろうか?

+0

テストが失敗したときに生成されるデフォルトのエラーメッセージを確認しましたか?それが理由です。または、メッセージがそのように書かれている理由を尋ねていますか? 'if(23 = a)'と 'if(a = 23)'を心配するCの "標準"について質問していますか?それはあなたが求めていることですか? –

+1

便宜上、アサーション式は比較的複雑なので、最初に期待される結果を置くと簡単に見つけることができます。 –

+0

@ S.Lott:なぜ私はそれらを順番に渡す必要があるのか​​知っています。なぜ、ほとんどの単体テストインターフェイスがそのように書かれているのかを知りたいのです。 –

答えて

7

私はそれが今、あなたはそれが「すべてのユニットテストフレームワーク(私の知っている)」で採用されて言ったように、単に慣例だと思います。フレームワークを使用している場合、逆の規則を使用する別のフレームワークに切り替えるのは面倒です。したがって、(たとえば、新しいユニットテストフレームワークを作成している場合)既存の規約に従うことが望ましいでしょう。 「=」の代わりに「==」のいずれかを書く、誤って、不要な割り当てを避けるために

if (4 == myVar) 

: 私は、これは、いくつかの開発者が平等のテストを書くことを好む道から来ていると信じています。この場合、コンパイラはこのエラーをキャッチし、奇妙なランタイムバグを修正しようとして多くの問題を回避します。

5

誰も知らず、決して終わりのない混乱の源です。しかし、すべてのフレームワークは(大きな混乱に)このパターンに従わない:

assertThat(Util.GetAnswerToLifeTheUniverseAndEverything()).isEqualTo(42); 
  • Hamcrest

    assertThat(Util.GetAnswerToLifeTheUniverseAndEverything(), equalTo(42)) 
    
  • ScalaTestにはない

    1. FEST-Assert通常順序を使用しています実際に区別してください:

      Util.GetAnswerToLifeTheUniverseAndEverything() should equal (42) 
      
  • 1

    私はよく分かりませんが、私は一般的に平等テストへの議論の順序についていくつかのアニメーション化された議論に参加してきました。

    if (42 == answer) { 
        doSomething(); 
    } 
    

    は、Cベースの言語で

    if (answer == 42) { 
        doSomething(); 
    } 
    

    に好適であると考え、多くの人々があります。

    if (42 = answer) { 
        doSomething(); 
    } 
    

    はあなたのコンパイラエラーになりますが、

    if (answer = 42) { 
        doSomething(); 
    } 
    

    はないかもしれない、と間違いなく難しいかもしれないバグを紹介します。この理由は、あなたが誤って入れた場合は、単一の等号ということです追跡する。ユニットテストフレームワークを設定した人/人は、このようにして平等テストを考えるのに慣れていたのでしょうか、すでにこのように設定されている他のユニットテストフレームワークをコピーしていたのかもしれません。

    1

    JUnitは、ほとんどの単体テストフレームワークの先駆けであった(最初の単体テストフレームワークではありませんでしたが、単体テストでは爆発しました)。 JUnitはこのようにして以来、後続のフレームワークはすべてこのフォームをコピーし、規約になりました。

    なぜJUnitはそうしましたか?私は知らない、ケントベックに尋ねる!

    21

    最も初期のフレームワークは、(いくつかの未知の理由で、しかし、サイコロロール多分?)実際の期待を使用しているようです。しかし、プログラミング言語の開発では、のコードの流暢が増加し、その順序が逆転した。ほとんどの流暢なインターフェイスは通常、の自然言語を模倣しようとし、ユニットテストフレームワークも変わりません。

    アサーションでは、のオブジェクトと一致するものがあることをに保証したいと考えています。これは、自然言語の形である、あなたのテストコードを説明していたかのように、あなたはおそらく

    言うだろう、「このテストでは、私は計算値が5に等しいことを確認してください」ではなく

    "このテストでは、5が計算値と等しいことを確認します"。

    違いはあまりないかもしれませんが、さらに進めてください。これを考慮してください:

    Assert.That(Roses, Are(Red)); 
    

    右の音。 Now:

    Assert.That(Red, Are(Roses)); 
    

    hm ..?もし誰かがのバラが赤であると言ったら、あまりにも驚くことはありません。。他の方法では、赤はバラです、疑わしい質問を提起します。 Yoda、誰ですか?

    That doesn't sound natural at all

    依田さんは、重要なポイントを作る - thinkするための力にあなたを逆転させました。

    Assert.That(Forest, Has.MoreThan(15, Trees)); 
    

    どのように1つを逆にします:あなたのアサーションは、より複雑であるとき

    それはさらに不自然を取得しますか? 15匹以上の木が森林で飼われています

    この主張(変更のための駆動要因として流暢)は何とかNUnitのを経験してきたことを変更に反映されている - もともと(Assert.AreEqual)それは期待実際前(古いスタイル)を使用しました。流暢な拡張子(またはNUnitの用語を使用するにはの制約に基づく - Assert.That)がその順序を逆転させました。

    0

    よく習慣を1つ選択しなければなりませんでした。それを逆にしたい場合は、Hamcrest matcherを試してみてください。読みやすくするためのものです。ここでは基本的なサンプルです:それは最初の既知の値だとして

    import org.junit.Test; 
    import static org.junit.Assert.assertThat; 
    import static org.hamcrest.core.Is.is; 
    
    public HamcrestTest{ 
        @Test 
        public void matcherShouldWork(){ 
         assertThat( Math.pow(2, 3), is(8) ); 
        } 
    } 
    
    +0

    py.testと同じように、 '' assert 8 == Math.pow(2、3) ''のように読みやすくする方法がわかりません! – Meitham

    +0

    1)あなたは、あなたがそれ 'assertThat作るために追加できるようにあなたがHamcrestために、より「動詞」を追加することができるようにマッチャーその拡張することができます2)実際の値に対する期待値が何であるかの順番を混同することはできません(Math.pow( 2、3)、is(relativePrimeTo(49))); ' – ArtB

    0

    は、確かにそれは、最初の期待値を置くために論理的な意味があります。

    手動テストのコンテキストで考えてみましょう。手動テストでは期待値が書き込まれ、その後に実際の値が記録されます。

    +0

    "論理意味"? 「私は質問に対する答えを期待しています」という言葉は、人生の意味は何ですか?論理的に論理的に構成され、論理的な意味をなす。 – Draghon

    +0

    はい、文が正しく配置されています。私は期待のコンセプトについてもっと話しています。論理的にはまず期待が来る。 Googleからの期待の定義を見てください: "何かが起こるか、そうであるという強い信念" *が実行されます。すなわち、期待値が設定された後に*起こります。 – amarsha4

    関連する問題