2017-02-17 8 views
3

ティアダウンコードのない(デフォルトの)機能スコープフィクスチャの利点は何ですか?テスト開始時に関数を呼び出さないのはなぜですか?例えばファンクションスコープとティアダウンコードのないフィクスチャのメリットは何ですか?

、書き込みの利益の何:

@pytest.fixture 
def smtp(): 
    return smtplib.SMTP("smtp.gmail.com") 

def test_ehlo(smtp): 
    response, msg = smtp.ehlo() 
    # ... 

の代わりに、単に:

def create_smtp(): 
    return smtplib.SMTP("smtp.gmail.com") 

def test_ehlo(): 
    smtp = create_smtp() 
    response, msg = smtp.ehlo() 
    # ... 

備品が有用である理由私たちはティアダウンコードを必要とするとき、私は理解しています。関数以外のスコープを持つフィクスチャがなぜ有用であるのかも理解しています。複数のテストで同じ「外部」オブジェクトを再利用したい場合があります(作成にかかる時間を節約するため、これは別々のテストの間に見えにくい結合を作り出すので、かなり危険です)。

答えて

1

テイクダウンコードのない(デフォルトの)機能スコープフィクスチャの利点は何ですか?なぜ、 テストの初めに機能を呼び出すだけではないのですか?

縦スペースを節約します。私たちはこのあなたの方法を行うとしたら

import pytest 


@pytest.fixture 
def value1(): 
    return 1 

@pytest.fixture 
def value2(): 
    return 2 

@pytest.fixture 
def value3(): 
    return 3 


def test_values(value1, value2, value3): 
    assert value1 == 1 
    assert value2 == 2 
    assert value3 == 3 

def test_values(): 
    v1 = value1() 
    v2 = value2() 
    v3 = value3() 

    assert v1 == 1 
    assert v2 == 2 
    assert v3 == 3 

コードの3つの余分なラインだ

は、テストごとに複数の治具を持っている。このような何かを、考えてみましょう。大したことではありませんが、必要なテストが10個ある場合はvalue1value2value3となりますか?基本的に理由がないので、今度は30行余分な垂直スペースがあります。

明らかに、両方の例はあまり単純化されています(電話とassertをインラインで実行している可能性があります)が、実際のコードにどのような影響があるかを確認するのは簡単です。

+0

これは理にかなっていますが、治具を必要とするテストの半分以下は、これらのものが2つ以上必要だと思います。 – max

1

私がそれを使い始めたとき、私は同様の質問をしました。ここに私の経験があります:

  • フィクスチャをautouse = Trueに設定することができます。つまり、インラインコールでは可能でない可能性があります。これは場合によっては有益です。
  • フィクスチャは、少なくとも私にとっては可読性を追加します。テストの署名を見ると、与えられたテストの前提条件である初期化がどのようになっているかを知ることができます。その意味では、テストを維持するのにも役立ち、初期化は分離されています。
+0

はい、私はすべての "外部"オブジェクトをテストの署名に入れることは、一種のドキュメントとして役立つと思います。 – max

0

私は機能スコープの備品の最も重要な利点の1つが一貫性であると信じています。すべてのフィクスチャ(スコープや分解コードに関係なく)がまったく同じ方法で使用されていると、はるかに読みやすく論理的です。

将来的にこのフィクスチャの範囲を変更したり、いくつかのティアダウンコードを追加することに決めたら、テストケースを変更する必要はなく、フィクスチャのコードだけを変更してください。

関連する問題