2013-07-23 5 views
13

私はセレンテストを書いています。セレンテストは、クラスごとにいくつかのテストが含まれています。 Firefoxのが閉じられた後に、しようとしているので、... すべてのクラスのすべてのテストの前にメソッドを実行するにはどうすればよいですか?

  • クラッシュをFirefoxが長いクラスでテストを実行するよりも時間がかかり開く、

    • は超スロー:各クラスには、現在開いて、その後、2つの結果を持っているのFirefoxを閉じ、セレンからすばやく再開するには、「エラー54」が返されます

    おそらく、睡眠を追加することでエラー54を解決できましたが、まだまだ遅いです。

    私がしたいのは、同じFirefoxインスタンスをすべてテストクラスに再利用することです。つまり、すべてのテストクラスの前にメソッドを実行し、すべてのテストクラスの後にメソッドを実行する必要があります。したがって、 'setup_class'と 'teardown_class'は十分ではありません。

  • +0

    /pytest.org/latest/fixture.html#working-with-a-module-shared-fixture) 'module'は十分ではありませんか? – Bakuriu

    +0

    Webブラウザをシャットダウンするために、最後に一度だけ実行する関数が必要です。私は各クラス/モジュールの後にWebブラウザをシャットダウンしたくない。私は決してそれが決して止まらないことを望んでいません。 –

    +0

    それから、かなり簡単です:['atexit'](http://docs.python.org/2/library/atexit.html)を使って、インタプリタが終了する直前に実行されるfirefoxを閉じる関数を登録してください。 – Bakuriu

    答えて

    24

    あなたは、セッションスコープの「autouse」フィクスチャを使用する場合があります。これは、先にすべてのテストの実行されます

    # content of conftest.py or a tests file (e.g. in your tests or root directory) 
    
    @pytest.fixture(scope="session", autouse=True) 
    def do_something(request): 
        # prepare something ahead of all tests 
        request.addfinalizer(finalizer_function) 
    

    を。ファイナライザは、最後のテストが終了した後に呼び出されます。

    14

    hpk42で提案されているようにセッションフィクスチャを使用することは多くの場合有効ですが、フィクスチャはすべてのテストが収集された後にのみ実行されます。あなたがテストコレクションの前にコードを実行する場合は、使用が不十分pytest_configureまたはpytest_sessionstartを文書化:

    # content of conftest.py 
    
    def pytest_sessionstart(session): 
        """ before session.main() is called. """ 
        pass 
    
    def pytest_sessionfinish(session, exitstatus): 
        """ whole test run finishes. """ 
        pass 
    
    5

    は、フィクスチャを取り壊すだけでなく、その範囲を定義するためにクリーンな方法があり、バージョン2.10からスタート。 documentationから :autouseパラメータ

    @pytest.fixture(scope="module", autouse=True) 
    def my_fixture(): 
        print ('INITIALIZATION') 
        yield param 
        print ('TEAR DOWN') 
    

    :だから、この構文を使用することができ

    • autouse器具は従う:

      ここ備品autouse他のスコープ内でどのように機能するかでありますscope = keyword-argument:オートセットアップのフィクスチャがscope = 'session'を持つ場合、それはどこにあっても一度だけ実行されます 定義されています。 scope = 'class'は、クラスごとに1回実行されることを意味します。

    • テストモジュールでautouse fixtureが定義されている場合、すべてのテスト関数が自動的にそれを使用します。

    • autouse fixtureがconftest.pyファイルで定義されている場合、そのディレクトリの下にあるすべてのテストモジュールのすべてのテストがフィクスチャを呼び出します。

      ...

    「要求」パラメータ: 注意あなたが他の目的のためにそれを使用することがありますが、「リクエスト」パラメータは、あなたの目的のために必要ではないこと。documentationから:/ [ `scope`](HTTP設定

    要求 "フィクス機能 イントロスペクトする要求オブジェクトを受け入れることができる 『』テスト機能、クラスまたはモジュールコンテキストを.."

    +0

    これは最新のものであり、upvotedする必要があります。 – gbonetti

    関連する問題