6

私は py.test を使用して、かなりの量の stdlib ロギングを含む私のモジュールをテストしています。もちろん、テストが失敗した場合に関連するすべてのログメッセージを取得できるように、ログが py.test によってキャプチャされる stdout にログを記録することを望みます。

これに関する問題は、このオブジェクトが py.test によって破棄された後、ロギング モジュールが py.test によって提供される「stdout」オブジェクトにメッセージを記録しようとすることです。つまり、次のようになります。

Traceback (most recent call last):
  File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.6/logging/__init__.py", line 1508, in shutdown
    h.flush()
  File "/usr/lib/python2.6/logging/__init__.py", line 754, in flush
    self.stream.flush()
ValueError: I/O operation on closed file

でキャプチャをオフ-sにしても問題はありませんが、もちろん、無関係なロギングでテスト出力が読めなくなります。

stdlib ロギングを py.test と統合する適切な方法を教えてもらえますか?

(これを見てみましが、問題なく動作するはずなので、あまり役に立ちませんでした)

4

3 に答える 3

6

ロギング/キャプチャーの相互作用は、次の 2.0.1 リリースでより適切に機能するようになっています。これは、次の方法で開発スナップショットとして既にインストールできます。

pip install -i http://pypi.testrun.org pytest 

後で「py.test --version」と入力すると、少なくとも「2.0.1.dev9」が表示されるはずです。そして、あなたが投稿した問題/エラーはなくなりました。

ちょっとした背景: logging パッケージは、使用するストリームを「所有」することを主張し、デフォルトでは sys.stderr を取得し、atexit モジュールを介して登録されたプロセス終了時にそれを閉じることを主張します。py.test は、出力のスナップショットを作成するために、sys.stdout を一時ファイルに置き換えます (サブプロセスの出力もキャッチするために、ファイル記述子レベルでの出力を含めます)。そのため、py.test は、ロギングの atexit-code が文句を言わないように、常に同じ一時ファイルを使用するように非常に注意するように進化しました。

[pytest-capturelog][1] プラグインをインストールすることもできます。これは、ログ出力の処理にさらに役立ちます。

[1] http://pypi.python.org/pypi/pytest-capturelog/0.7

于 2011-01-22T14:21:46.297 に答える
3

オブジェクトが py.test によって破棄された後にログがどこにも行かないことを気にしない場合は、モジュールまたはテストの早い段階でモジュール レベルの変数logging.raiseExceptionsを設定できます。False

これにより、ロギング モジュールは、ロギング サブシステムで発生する例外を飲み込みます。(また、システムをクラッシュさせるロギングでエラーが発生することを望まない実稼働システムの良い方法です)

logging.basicConfig()ログ出力を別のファイルに設定するために使用することもできます。しかし、これはおそらくあなたが望むものではありません。

于 2011-01-21T19:23:26.873 に答える
-1

-sオプションを py.test に渡すだけで、stdout がキャプチャされなくなります。

于 2011-01-18T13:36:08.773 に答える