一時的に個々のPythonユニットテストを無効にする


128

unittestPythonでモジュールを使用するときに、個々の単体テストを一時的に無効にするにはどうすればよいですか?

回答:


229

個々のテストメソッドまたはクラスは、両方ともunittest.skipデコレータを使用して無効にできます。

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

その他のオプションについては、テストのスキップと予想される失敗のドキュメントをご覧ください。


9
Python 3では、以下のAkifの答えは@unittest.SkipTest機能しますが機能しません@unittest.skip
ライフバランス

7
私はPython 3.6.1を使用しており、@unittest.skip正常に動作します。
Pete

2
Python 3.4.0の@Pete @unittest.skipは機能しません。
ライフバランス2017

子クラスがスキップされるのを防ぐ方法は?
reubenjohn 2018年

アノテーションは単一のテストメソッドにのみ適用されます。テストメソッドを含む親クラスを作成し、一部の子クラスのみでメソッドを無効にする予定はありますか?親子クラスを適切に設計する必要があるかもしれませんが、それは可能だと思います。おもちゃの例で解決しようとしているシナリオを詳しく説明できますか?
yoni

26

デコレーターを使用して、関数をラップできるテストを無効にし、googletestまたはpythonユニットテストがテストケースを実行しないようにすることができます。

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

出力:

testFoo has been disabled

11

最新バージョン(2.7-未リリース)は、テストのスキップ/無効化をサポートしています。このモジュールを入手して、既存のPythonインストールで使用することができます。おそらく動作します。

これ以前は、スキップしたいテストの名前をからに変更していましxtest_testnametest_testname


これを行うための簡単なelispスクリプトを次に示します。私のelispは少し錆びているので、問題がある場合は事前に謝罪します。未テスト。

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1ですが、私が取り組んでいるプロジェクト全体で、誰もがpython v2.6.2を使用しており、これは変更されないと思います:/しかし、それは解決策です、ありがとう
coelhudo

エディターを少し調整して、テストケースを有効/無効にするマクロを提供することもできますが、私はEmacsユーザーとして話しています... :)
Noufal Ibrahim

私もEmacsユーザーですが、マクロを作成しましたか?
coelhudo

いいえ。失敗させるだけですが、それほど難しくありません。私は簡単に答えを更新しました。
Noufal Ibrahim、2010

この受け入れられた答えは答えではなく、単なるリンクです。本当の現在の答えもトップ投票ではありません。確かに、それは4歳です。無償のelispは単に難読化します。
jwd630 2014年

10

@unittest.SkipTestテストの上にデコレータを置くだけで十分です。


誰がやったかわかりません。しかし、私はドキュメントを読んでいて、SkipTestは例外であると述べています。いずれにしても、skipはテストを実行しない(無効にする)という意味でunittest.skipとは異なりますが、SkipTestの目的は、テストの実行中に予期しないことが発生した場合に発生します。私は正しいですか?面白いですね。
coelhudo 2017

unittest.skip(理由なし)Python 2ではエラーが発生しますが、Python 3ではエラーが発生しません
Akif

5

テストケースメソッドの名前をアンダースコアに変更するだけです。test_myfuncは_test_myfuncになります。



1

質問の「一時的に無効になっている」部分に焦点を当てると、最良の答えはユースケースによって多少異なります。ここで私を導いたユースケースは、関数のテスト駆動開発を行っていることです。このプロセスでは、連続してテストを記述し、デバッグのために関数のブレークポイントを使用することがよくあります。テストランナーを実行するたびにすべてのテストを実行すると、すでに機能しているテストのブレークポイントで停止してしまいます。「スキップ」を追加したり、テスト名などを変更したりすることは、関数の記述が完了したらすべてのテストを実行したいので、私が望むものではありません。「スキップ」を使用した場合は、戻って「スキップ」する必要があります。

私のユースケースでは、ソリューションはテストコードではなくテストランナーにあります。私はpytestを使います。pytestを使用すると、コマンドラインから単一のテストを簡単に指定できます。

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(キャップ​​を自分の値に置き換えます)。

その質問がpython-unitestに対するものであったことを理解しています。長い間使っていません。それがpytestに似ていても私は驚かないでしょう。そうでない場合は、簡単にpytestに切り替えることができます。コードを変更する必要はありません。インストールして、テストランナーコマンドを変更するだけです。

また、私はPyCharm Proを使用しています。テストコードを表示するページでは、各テストのdefの横に小さなアイコンがあります。そのアイコンをクリックして、テストを個別に実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.