2013-01-18 6 views
12

私はX11にアクセスする必要のあるPythonパッケージを持っています。私は実際のX11をビルドマシンにインストールする必要がないようにXvfbを使いたいと思っています - この場合はHudsonです。ですから、py.testの起動時にXvfbサーバーを起動し、そのサーバーをすべてのテストに使用してから閉じてください。py.test全テストスイート用のSetUp/TearDown

どうすればいいですか?


:私は、各テストクラスにセットアップ(解体)に(停止)Xvfbのサーバを起動することができますが、それは2つの問題がある:第一に、それは無駄です。私はサーバーを正しく終了するか、または死んでいないXvfbプロセスをハングアップする場合、2番目の、それは奇妙なFatal IO error 0 (Success) on X serverのために動作しません。これは誰でも興味があればxvfbwrapperを使用しています。

+0

すべてのクラスが同じファイルにありますか?次に、setUpModuleとtearDownModuleを使用してモジュールごとに1回だけこれを実行できます。 – Dhara

+0

@Dhara:いいえ、テストクラスはサブモジュールに分割されます。 – Sardathrion

+0

まあ、適切なsetUpModule呼び出しを使用して1つのファイルにすべてのテストをインポートし、そこからテストを実行することもできます。 – Dhara

答えて

15

pytest-xvfbの代わりに、これを使いこなすことができます。これは簡単です。


実際はかなり簡単です。これが含まれているプロジェクトのルートにconftest.pyと呼ばれるファイルを作成します。今

import pytest 
import os 
import subprocess 
import tempfile 

@pytest.fixture(scope="session", autouse=True) 
def start_xvfb_server (request): 
    tempdir = tempfile.mkdtemp() 
    xvfb_cmd = ['Xvfb', 
       ':1022', 
       '-screen', '0', '800x600x24', 
       '-fbdir', tempdir, 
       '-noreset' 
    ] 
    xvfb_proc = subprocess.Popen(xvfb_cmd, 
      stdout=open(os.devnull), 
      stderr=open(os.devnull), 
      shell=False 
    ) 
    request.addfinalizer(xvfb_proc.kill) 

を、あなたがしなければならないすべてを行うのは自明である1022年にDISPLAYを設定するには、各テストを設定することです。 unittestモジュールのドキュメントに記載され

+3

ポート番号を返すこともできるので、他のフィクスチャは引数として "start_xvfb_server" 。また、 "autouse = True"を使わずに、代わりに@ pytest.mark.usefixtures( "start_xvfb_server")をクラスなどに置くこともできます。この方法では、必要のないテストのためのプロセスをセットアップしません。 – hpk42

+0

@ hpk42:それは確かに良い機能です。しかし、私はそれらを実装する方法がわかりません。私はドキュメンテーションと実験の時間に苦労しています。私のコードを編集したり、自分の答えを作成しても構いません。ありがとう。 – Sardathrion

+1

tmpfile.mkdtempを使用するのではなく、start_xvfb_serverでtmpdir fixtureを使用することをお勧めします。そうすれば、py.testはあなたのディレクトリを厳密に管理しますので、ある時点でmkdtempによって作成されたディレクトリを削除しなければなりません。 – flub

関連する問題