2016-07-04 16 views
4

を発見した後:フィルターテスト私は現在、このように私のテストを実行している

tests = unittest.TestLoader().discover('tests') 
unittest.TextTestRunner().run(tests) 

今私は(test_valid_userのように)彼の名前を知っている特定のテストを実行したいが、彼のクラスを知りません。そのような名前のテストが複数ある場合は、そのようなテストをすべて実行したいと考えています。 discoverの後にテストをフィルタリングする方法はありますか?

また、この問題を解決する他の方法があります(コマンドラインからは実行しないでください)。

答えて

2

あなたはunittest.loader.TestLoader.testMethodPrefixを使用することができます異なるpにしたがってテストメソッドのフィルタを変更するインスタンス変数"テスト"よりもリフィックス。

あなたはユニットテストのこの王とtestsディレクトリがあるとしましょう:

import unittest 


class MyTest(unittest.TestCase): 
    def test_suite_1(self): 
     self.assertFalse("test_suite_1") 

    def test_suite_2(self): 
     self.assertFalse("test_suite_2") 

    def test_other(self): 
     self.assertFalse("test_other") 

あなたは、例えば、「test_suite_」で始まる唯一のテスト関数を検出するために、独自のdiscover関数を記述することができます

import unittest 


def run_suite(): 
    loader = unittest.TestLoader() 
    loader.testMethodPrefix = "test_suite_" 
    suite = loader.discover("tests") 
    result = unittest.TestResult() 
    suite.run(result) 
    for test, info in result.failures: 
     print(info) 


if __name__ == '__main__': 
    run_suite() 

discoverの引数 "tests"はディレクトリパスであるため、フルパスを記述する必要があります。

その結果、あなたが買ってあげる:

Traceback (most recent call last): 
    File "/path/to/tests/test_my_module.py", line 8, in test_suite_1 
    self.assertFalse("test_suite_1") 
AssertionError: 'test_suite_1' is not false 

Traceback (most recent call last): 
    File "/path/to/tests/test_my_module.py", line 11, in test_suite_2 
    self.assertFalse("test_suite_2") 
AssertionError: 'test_suite_2' is not false 
0

単一のテストメソッドを実行するには2つの方法があります。

コマンドライン:Pythonスクリプトを使用して

$ python -m unittest test_module.TestClass.test_method 

import unittest 

class TestMyCode(unittest.TestCase): 

    def setUp(self): 
     pass 

    def test_1(self): 
     self.assertTrue(True) 

    def test_2(self): 
     self.assertTrue(True) 

if __name__ == '__main__': 
    testSuite = unittest.TestSuite() 
    testSuite.addTest(TestMyCode('test_1')) 
    runner=unittest.TextTestRunner() 
    runner.run(testSuite) 

が出力:

------------------------------------------------ ------------

蘭1つのテストは0.000s

OK

1

もう一つの簡単な方法で、テストを行い-kオプションでpy.testを使用することです名前のキーワードスキャン。名前がキーワード式と一致するテストが実行されます。

これは望ましくないコマンドラインを使用していますが、subprocess.callを使用してコードからコマンドラインを呼び出して、必要な引数を動的に渡すことはできません。

例:あなたは次のテストを持っていると仮定すると:

def test_user_gets_saved(self): pass 
def test_user_gets_deleted(self): pass 
def test_user_can_cancel(self): pass 

あなたは、CLIからpy.testを呼び出すことができます。

$ py.test -k "test_user" 

またはコードから:

return_code = subprocess.call('py.test -k "test_user"', shell=True) 
関連する問題