2

大規模なPythonプロジェクトの多数の単体テストをキュレートしています。テストの検出と実行にはnoseを使用します。特定の条件で実行すべきではないテストファイルがいくつかあります。たとえば、Windows(MacとLinuxのみ)で実行してはならないテストモジュールがあるかもしれません。

これが私が使用したいくつかの解決策です:

  1. Noseの優れた属性プラグインを使用して、テストメソッドまたはクラスに条件をマークします。
  2. テストメソッドまたはクラスでunittest.skipIf()を使用します
  3. たとえば、名前に含まれるファイルをスキップするには、 noseのパターン除外を使用します。windows

1と2についての私の不満は、これらがモジュールのインポートを強制することです。これは少なくとも時間の無駄であり、プラットフォームに依存するインポートがある場合はエラーを引き起こす可能性があります。#3はもろく、テストケースを読んだときにスキップされることがわかりにくいので、私は好きではありません。3つともテストとテストランナーの相互作用に過度に依存しているようです。テスト中のものが欲しいのですが。

テストモジュールの上部で次のようなことをしたいと思います。

"""This module should not be run on Windows"""
import platform
if platform.system() == 'Windows':
    <stop reading this module.  nothing to see here>

# do the tests.

PythonまたはNoseにモジュールの読み取りを停止するように指示するにはどうすればよいですか?ただし、エラーはありませんか?早期返品に相当する輸入品を探していると思います。

4

3 に答える 3

2

モジュールの実行から早期に戻る機能は以前に提案されていましたが、いくつかの反対票を獲得し、機能は言語に追加されませんでした。

メーリングリストのスレッドを読むことはできますが、一般に、モジュールの大部分を余分なレベルでインデントしなければならないという問題は、この「戻る」機能を追加する十分な理由ではないと感じられました。モジュール内のほとんどすべてのコードは、とにかく関数とクラス内にあるべきであり、この問題の対象となるモジュールレベルのコードはほとんど残らないと言う人もいます。

于 2013-02-23T01:42:40.740 に答える
2

Nose と unittest では、SkipTest 例外は特別に扱われます - これは失敗ではありません。したがって、次のコードは実行を停止し、ユニットテスト ランナーにエラーは報告されません。

import unittest
import platform
if platform.system() == 'Windows':
  raise unittest.case.SkipTest("The rest of this code will not be run on Windows.")
于 2013-03-06T01:28:24.780 に答える
1

ImportErrorそのメッセージでそこに上げることができます。呼び出し元は、そのエラーを示すことを説明するキャッチされない例外で終了する可能性がありますが、ImportError必要に応じてキャッチできます。

于 2013-02-23T02:50:14.873 に答える