16

現在、私のコードは次のツリー構造で編成されています。

src/
    module1.py
    module2.py
    test_module1.py
    test_module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py
        test_moduleA.py
        test_moduleB.py

ファイルmodule*.pyにはソース コードがtest_module*.py含まTestCaseれ、関連するモジュールの が含まれます。

次のコマンドを使用すると、たとえば、単一のファイルに含まれるテストを実行できます。

$ cd src
$ nosetests test_filesystem.py
..................
----------------------------------------------------------------------
Ran 18 tests in 0.390s

OK

すべてのテストを実行するにはどうすればよいですか? で試しましnosetests -m 'test_.*'たが、うまくいきません。

$cd src
$ nosetests -m 'test_.*'

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

ありがとう

4

5 に答える 5

15

テストとモジュールを分離するか混合するかはおそらく好みの問題ですが、私はそれらを分離しておくことを強くお勧めします (セットアップの理由、コード統計など)。

ノーズテストを使用している場合は、テストを含むすべてのディレクトリが実際のパッケージであることを確認してください。

src/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py
tests/
    __init__.py
    test_module1.py
    test_module2.py
    subpackage1/
        __init__.py
        test_moduleA.py
        test_moduleB.py

nosetestsこのようにして、最上位ディレクトリで実行するだけで、すべてのテストが見つかります。src/が にあることを確認する必要がありますPYTHONPATH。そうしないと、インポートが見つからないためにすべてのテストが失敗します。

于 2008-12-14T18:41:31.313 に答える
8

それらがすべてで始まる場合は、testうまくnosetestいくはずです。Nose は「test」で始まるファイルを自動的に検索します。

于 2008-12-16T23:28:39.533 に答える
6

私はノーズテストについて知りませんが、標準の unittest モジュールでそれを達成できます。test_all.pyルート ディレクトリの下にファイルを作成し、すべてのテスト モジュールをインポートするだけです。あなたの場合:

import unittest
import test_module1
import test_module2
import subpackage1
if __name__ == "__main__":
    allsuites = unittest.TestSuite([test_module1.suite(), \
                                test_module2.suite(), \
                                subpackage1.test_moduleA.suite(), \
                                subpackage1.test_moduleB.suite()])

各モジュールは次の機能を提供する必要があります (2 つの単体テストを持つモジュールの例:Class1Class2):

def suite():
    """ This defines all the tests of a module"""
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Class1))
    suite.addTest(unittest.makeSuite(Class2))
    return suite
if __name__ == '__main__':
   unittest.TextTestRunner(verbosity=2).run(suite())
于 2008-12-15T08:15:09.767 に答える
2

これはおそらく激しく争われているトピックですが、テストをモジュールから分離することをお勧めします。このようなものを設定してください...

これらをシステム パスにインストールするために使用setup.pyします (または、環境変数を変更して、「インストール」手順が不要になる場合があります)。

foo/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py

これで、ローカル ディレクトリでのモジュールの検索に依存するのではなく、任意の場所にある任意の Python スクリプトでこれらのモジュールにアクセスできるようになりました。次のように、テストをすべて脇に置きます。

tests/
    test_module1.py
    test_module2.py
    test_subpackage1_moduleA,py
    test_subpackage2_moduleB.py

コマンドについてはわかりませんnosetestsが、テストがすべて同じディレクトリにあるため、他のすべてのテストを同じディレクトリにインポートするだけのラッパー スクリプトを作成するのがはるかに簡単になります。または、それが不可能な場合は、少なくともbash、テスト ファイルを 1 つずつ取得する単純なループで回避できます。

#!/bin/bash
cd tests/
for TEST_SCRIPT in test_*.py ; do
    nosetests -m $TEST_SCRIPT
done
于 2008-12-14T17:37:18.680 に答える
0

Testoob で回答します

単一のファイルでテストを実行するのは、Nose のようなものです。

testoob test_foo.py

多くのファイルでテストを実行するには、Testoob コレクターを使用してスイートを作成できます (各サブパッケージ内)。

# src/subpackage?/__init__.py
def suite():
  import testoob
  return testoob.collecting.collect_from_files("test_*.py")

# src/alltests.py
test_modules = [
    'subpackage1.suite',
    'subpackage2.suite',
]

def suite():
    import unittest
    return unittest.TestLoader().loadTestsFromNames(test_modules)

if __name__ == "__main__":
    import testoob
    testoob.main(defaultTest="suite")

私はあなたの特定のシナリオを試していません。

于 2008-12-14T18:32:47.073 に答える