2009-06-20 5 views
2

私はテストを書くのがやや新しいです。私は自分のセットアップをきれいに整え続けることに苦労しているのではなく、代わりにあまりにも多くのことを達成しようとしています。テストを書くときにsetUp()中毒をどう扱うか?

私の質問は、あなたのテストをどうやって分割するのですか?

テストには1〜2行の独立したステップコードが含まれていますか?

def test_public_items(): 
    item1 = PublicItem() 
    item2 = PublicItem() 
    assertEqual(public_items, [item1, item2]) 

あなたはそれを何に関係なくsetUpに入力しますか?

この場合、テストクラスの分離はどのように扱いますか?あるテストセットで異なるセットアップが必要な場合、別のテストが必要な場合に新しいクラスを作成しますか?

答えて

3

私はあなたがここにanti-patternsのカップル

  • 過度のセットアップ
  • 不適切共有フィクスチャを打ってきたと信じています。

特定のテストフィクスチャのすべてのテストでSetup()メソッドのコードが必要であることが経験則です。

現在存在するものより多少の設定を必要とするtest()を書くと、それが新しいテストフィクスチャに属するというヒントかもしれません。新しいテストフィクスチャを作成するための慣性は、セットアップコードをスノーボールの1つの大きなボールに入れて、すべてのテストですべてを実行しようとするものです。かなりの読みやすさを傷つけます。セットアップコードの中でテストを見ることはできません。そのほとんどは、あなたが見ているテストと関連性がないかもしれません。

これは、一般的な設定よりもテストに適切なセットアップ指示があることを確認しても問題ありません。 (アレンジ・アクト・アサート・トライアドの最初のものです)。あなたが複数のテストにおけるこれらの命令の重複を持っている場合は - あなたはおそらくその

setup_of_new_fixture = old_setup + recurring_arrange_instruction 
+0

私はあなたが灯台でクラスをはっきりと識別したので、あなたの答えを受け入れています。これは多くを明確にします。 – Soviut

1

はい、(クラスで具体化)テキスト・フィクスチャを正確に設定する必要があり、新たなテスト・フィクスチャに出すべてのそれらのテストを取る必要がありますセットアップと分解の共通のニーズを共有するテストの

理想的には、単体テストはtestThisConditionHoldsとします。 public_itemsは「条件」ではありません。信じられないほど、黒魔術public_itemsは私から来ることになっているどこのようなテストを書くことがしたい:

def testNoPublicItemsRecordedIfNoneDefined(self): 
    assertEqual([], public_items) 

def testOnePublicItemsIsRecordedRight(self): 
    item = PublicItem() 
    assertEqual([item], public_items) 

def testTwoPublicItemsAreRecordedRight(self): 
    item1 = PublicItem() 
    item2 = PublicItem() 
    assertEqual([item1, item2], public_items) 

public_itemsが魔法の魔法の機能PublicItemを呼び出しの副作用として取り込まれることになって魔法のリストがある場合は、後者をsetUpで呼び出すと、実際にはこれらの単純なケースを正しくテストする能力が失われてしまうので、私はそれをしません!

+0

私の例では、テスト自体の中で「追加作業」が行われていることを示しています。私はこれが受け入れられると考えられていたのだろうかと思いました。 – Soviut

関連する問題