81

かなりの時間がかかるテストを含むテストファイルがあります(テストはクラスターに計算を送信し、結果を待ちます)。これらはすべて特定のTestCaseクラスにあります。

時間はかかり、さらに壊れにくいので、このテストのサブセットを実行するか実行しないかを選択できるようにしたいと思います(最良の方法は、コマンドライン引数、つまり「./tests.py --offline」などを使用することです。そのように)、時間があるときに、ほとんどのテストを頻繁かつ迅速に実行し、セット全体をたまに実行することができました。

今のところ、私unittest.main()はテストを開始するために使用します。

4

16 に答える 16

91

単一の特定のテストのみを実行するには、次を使用できます。

python -m unittest test_module.TestClass.test_method

詳細はこちら

于 2013-07-23T17:48:07.207 に答える
53

デフォルトでunittest.main()は、デフォルトのテストローダーを使用して、mainが実行されているモジュールからTestSuiteを作成します。

このデフォルトの動作を使用する必要はありません。

たとえば、3つのunittest.TestSuiteインスタンスを作成できます。

  1. 「高速」サブセット。

    fast = TestSuite()
    fast.addTests(TestFastThis)
    fast.addTests(TestFastThat)
    
  2. 「遅い」サブセット。

    slow = TestSuite()
    slow.addTests(TestSlowAnother)
    slow.addTests(TestSlowSomeMore)
    
  3. 「全体」セット。

    alltests = unittest.TestSuite([fast, slow])
    

TestCaseの名前を調整して、高速と低速を示していることに注意してください。unittest.TestLoaderをサブクラス化して、クラスの名前を解析し、複数のローダーを作成できます。

次に、メインプログラムは、optparseまたはargparse(2.7または3.2以降で使用可能)を使用してコマンドライン引数を解析し、実行するスイートを高速、低速、またはすべて選択できます。

sys.argv[1]または、それが3つの値のいずれかであると信頼し、これと同じくらい単純なものを使用することができます

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)
于 2009-07-01T10:23:27.817 に答える
13

実際には、テスト ケースの名前を sys.argv として渡すことができ、それらのケースのみがテストされます。

たとえば、あなたが持っているとします

class TestAccount(unittest.TestCase):
    ...

class TestCustomer(unittest.TestCase):
    ...

class TestShipping(unittest.TestCase):
    ...

account = TestAccount
customer = TestCustomer
shipping = TestShipping

あなたは呼び出すことができます

python test.py account

アカウントテストのみ、または

$ python test.py account customer

両方のケースをテストする

于 2012-10-02T18:28:18.757 に答える
11

基本的には、次の 2 つの方法があります。

  1. クラスの独自のテスト スイートを定義する
  2. 実際のデータを返すクラスター接続のモック クラスを作成します。

私は彼の 2 番目のアプローチの強力な支持者です。単体テストでは、複雑なシステム (データベースやクラスターなど) ではなく、コードのごく一部のみをテストする必要があります。しかし、それが常に可能であるとは限らないことを理解しています。モックアップの作成にコストがかかりすぎる場合や、テストの目的が実際には複雑なシステムにある場合があります。

オプション (1) に戻ると、次の方法で進めることができます。

suite = unittest.TestSuite()
suite.addTest(MyUnitTestClass('quickRunningTest'))
suite.addTest(MyUnitTestClass('otherTest'))

そしてスイートをテストランナーに渡します:

unittest.TextTestRunner().run(suite)

Python ドキュメントの詳細: http://docs.python.org/library/unittest.html#testsuite-objects

于 2009-07-01T10:12:52.893 に答える
3

テストを遅いテストとしてマークし、環境変数を使用してそれらをスキップできるデコレータを作成しました

from unittest import skip
import os

def slow_test(func):
    return skipIf('SKIP_SLOW_TESTS' in os.environ, 'Skipping slow test')(func)

これで、次のようにテストを遅いとマークできます。

@slow_test
def test_my_funky_thing():
    perform_test()

SKIP_SLOW_TESTS環境変数を設定して、遅いテストをスキップします。

SKIP_SLOW_TESTS=1 python -m unittest
于 2019-02-13T15:12:09.047 に答える
1

py.testNose、場合によってはzope.testingなどの専用のテストランナーの使用を検討してください。それらにはすべて、テストを選択するためのコマンドライン オプションがあります。

たとえば、Noseを見てください。

于 2009-07-01T09:51:09.410 に答える
1

私はS.Lottの答えを試しました:

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)

しかし、それは私に次のエラーを与えました:

Traceback (most recent call last):
  File "functional_tests.py", line 178, in <module>
    unittest.TextTestRunner().run(suite)
  File "/usr/lib/python2.7/unittest/runner.py", line 151, in run
    test(result)
  File "/usr/lib/python2.7/unittest/case.py", line 188, in __init__
    testMethod = getattr(self, methodName)
TypeError: getattr(): attribute name must be string

以下は私のために働いた:

if __name__ == "__main__":
    test_class = eval(sys.argv[1])
    suite = unittest.TestLoader().loadTestsFromTestCase(test_class)
    unittest.TextTestRunner().run(suite)
于 2015-12-08T02:04:02.180 に答える