3

Pythonユニットテストコードを次のように編成しています。

Maindir
   |
   |--Dir1
   |  |
   |  |-- test_A.py
   |  |-- test_B.py
   |  |-- test_C.py
   |
   |--Dir2
       | ...

私はあなたが絵を手に入れると思います。各ディレクトリには、giveディレクトリのテストから一連のテストをまとめたDirxという名前のファイルがあります(特定のテストを選択したり、他のテストを省略したりできます)。suite.pyこれらのファイルは、たとえば次のようになります(すべてのテストを選択する場合は、テストのサブセットのみを選択することもあります)[テスト<->単体テストも検討してください]:

import test_A
import test_B
import test_C

suite1 = test.TestSuite()
suite1.addTests(test.TestLoader().loadTestsFromTestCase(test_A.MyTest))
suite1.addTests(test.TestLoader().loadTestsFromTestCase(test_B.MyTest))
suite1.addTests(test.TestLoader().loadTestsFromTestCase(test_C.MyTest))

execall.pyディレクトリ内のメインランナー、はMaindir次のようになります。

from Dir1.suite import suite1
from Dir2.suite import suite2

suite_all = test.TestSuite([
    suite1,
    suite2])

if __name__ == '__main__':
    test.main(defaultTest='suite_all')

今、私は次のことができます:

  • すべてのテストを実行します:'execall.py'(文書化されているように)
  • 特定のスイートを実行する:(execall.py suite1文書化されているように)

しかし、どうすれば特定の単一のテストのみを実行できますか?また、特定のファイルのすべてのテストを実行するにはどうすればよいですか?私は同じエラーで、成功せずに次のことを試みました:'TestSuite' object has no attribute 'xxx'

execall.py suite1.test_A
execall.py suite1.test_A.test1
execall.py test_A
execall.py test_A.test1

execall.py -h単一のテストまたはテストケースでのテストを実行する方法の非常に具体的なを示していますが、私の場合、これは機能しないようです。

4

1 に答える 1

1

これを行う 1 つの方法は、独自のテスト ローダーを作成することです。Flask の testsuite モジュールにあるメカニズムを採用することを強くお勧めします。

基本的な考え方は次のとおりです。

  1. unittest.TestSuite()必要なテストを含むすべての Python モジュールを含むオブジェクトを返すルーチンを実装します。これは、たとえば、ファイルのディレクトリをスキャンすることによって実行できます (単純に、regexp などでtest_XXX.pyチェックします)。startswith('test')

  2. ステップ 1 で生成されたテストスイートを使用するサブクラスunittest.TestLoaderとオーバーライド。loadTestsFromName(self, name, module)たとえば、フラスコでは次のようになります。

     for testcase, testname in find_all_tests(suite):
         if testname == name or \
             testname.endswith('.' + name) or \
             ('.' + name + '.') in testname or \
             testname.startswith(name + '.'):
             all_tests.append(testcase)
    

    これにより、Python モジュール名、テスト スイート (テスト クラス) 名、またはテスト ケース名だけでテストをロードできます。

于 2012-12-07T08:08:21.053 に答える