0

私がやりたいことは次のとおりです。tests.ui、tests.text、tests.fileioなどのパッケージに編成されたテストスイートを構築したいです。これらのパッケージの各__init __.pyで、そのパッケージ内のすべてのモジュールのすべてのテストの。もちろん、すべてのテストを取得するには unittest.TestLoader を使用できますが、各モジュールを個別に追加する必要があるようです。したがって、test.ui にエディター_ウィンドウ_test.py とプレビュー_ウィンドウ_test.py があるとすると、__init __.py でこれら 2 つのファイルをインポートし、2 つのモジュール オブジェクトのリストを取得する必要があります。アイデアは、テスト スイートに何かを含めることを忘れないように、テスト スイートの作成を自動化したいということです。

これを行う最善の方法は何ですか?簡単にできるように思えますが、何も見つかりません。

私はPython 2.5 btwを使用しています。

4

3 に答える 3

2

私たちのdjangoプロジェクトからのまさにこの問題の解決策:

"""Test loader for all module tests
"""
import unittest
import re, os, imp, sys

def find_modules(package):
    files = [re.sub('\.py$', '', f) for f in os.listdir(os.path.dirname(package.__file__))
             if f.endswith(".py")]
    return [imp.load_module(file, *imp.find_module(file, package.__path__)) for file in files]

def suite(package=None):
    """Assemble test suite for Django default test loader"""
    if not package: package = myapp.tests # Default argument required for Django test runner
    return unittest.TestSuite([unittest.TestLoader().loadTestsFromModule(m)
                               for m in find_modules(package)])

if __name__ == '__main__':
    unittest.TextTestRunner().run(suite(myapp.tests))

編集:bialix のソリューションと比較した利点は、このローダーをプロジェクト ツリーのどこにでも配置できることです。すべてのテスト ディレクトリでinit .py を変更する必要はありません。

于 2009-02-17T06:37:56.083 に答える
2

ここに良い答えがありますが、最善の方法は、次のようなサードパーティのテスト検出とランナーを使用することです。

  • (私のお気に入り)
  • 試用版(特に非同期のものをテストする場合はかなりいい)
  • py.test (私の意見ではあまり良くありません)

それらはすべてプレーンな unittest.TestCase と互換性があり、テストを変更する必要はなく、高度な機能を使用する必要もありません。スイートの発見として使用してください。

これらのライブラリの厄介なものを再発明したい特定の理由はありますか?

于 2009-02-17T08:36:55.720 に答える
1

os.listdir を使用して、test.* ディレクトリ内のすべてのファイルを検索し、.py ファイルを除外できます。

# Place this code to your __init__.py in test.* directory
import os
modules = []
for name in os.listdir(os.path.dirname(os.path.abspath(__file__))):
    m, ext = os.path.splitext()
    if ext == '.py':
        modules.append(__import__(m))
__all__ = modules

マジック変数__file__には、現在のモジュールのファイルパスが含まれています。試す

print __file__

チェックする。

于 2009-02-17T06:20:25.830 に答える