NoseがUbuntu9.04でテストを見つけられない理由はありますか?
私はPython2.5.4でnose0.11.1を使用しています。
ファイル名を明示的に指定した場合にのみ、テストを実行できます。ファイル名を指定しないと、0がテストされます。
同じプロジェクトが私のMacでテストを正常に実行するので、私はかなり困惑しています!
いつも私を悩ませているもう1つのことnose
は、実行可能ファイルでテストを実行しないことです。なぜそれがMac/Ubuntu全体で違いを生むのか正確にはわかりませんが、一見の価値があります。
スクリプトがMacでどういうわけか取得されていないことを確認してくださいchmod +x
…そして、取得した場合は、で修正してchmod -x $(find tests/ -name '*.py')
ください。
この動作は、ファイルがnoseのテストマッチング動作に従って名前が付けられていないため、ほぼ確実です。鼻のドキュメントから:
noseは、作業ディレクトリ(デフォルトでは現在の作業ディレクトリ)にあるPythonソースファイル、ディレクトリ、およびパッケージからテストを自動的に収集します。testMatch正規表現(デフォルト:(?:^ | [b _.-])[Tt] est)に一致するPythonソースファイル、ディレクトリ、またはパッケージはすべて、テスト(またはテストコレクションのソース)として収集されます。
強調は私のものでした。
一致する名前の例:
一致するように見えますが、実際には一致しない名前:
ファイルの名前を変更するだけの場合は、問題ありません。
__init__.py
ファイルがない可能性がありますか?
...「テスト」ディレクトリが実際にモジュールであることを確認してください(空の
__init__.py
ファイルがあります)。
私も同じ問題を抱えていました。私のテストはWindowsでは問題なく実行されましたが、Ubuntuでは実行されませんでした。
Ubuntuで実行する場合:
nosetests -vv --collect-only
実行可能ファイルであるため、テストファイルをスキップしていることがわかります。_Tools/ LintControlFiles/test_HgLint.pyは実行可能ファイルです。スキップしました
実行可能ファイルを検討するために、次のように実行します。
nosetests --exe
@ david-woleverが言ったように、Ubuntuでは実行できないことを確認できます。走る
nosetests -vv --collect-only
調べたファイルの詳細を確認します。
ディレクトリからテストを実行している場合、いくつかの関連性があります。
nosetests ... tests/
ここで、testsは私のテストを含むフォルダーの名前であり、.pyモジュールの1つに個別のPythonテスト関数があります...実行するテストとして認識するには、関数はnosetestsの「test」で始まる必要があります。
例えば:
def test_something():
...
nosetestsは、このディレクトリで実行されると、この関数を実行します。
def somethin_to_test():
...
しません。
を使用する-all-modules
と、すべてのテストが見つかります。
nosetests --all-modules ./tests
鼻のソース、特にselector.pyファイルを調べた後、何が起こっているかを見ると、
https://github.com/nose-devs/nose/blob/master/nose/selector.py#L129
が呼び出されたかどうかを確認するとwantFile
、self.matches
が呼び出されます。これは、として渡されたものである、regex
に対して検索を実行します。match
testMatch
この問題は、後で(そしてそのファイル全体で)チェックするときに発生します。
https://github.com/nose-devs/nose/blob/master/nose/selector.py#L152
に対して、まったく同じタイプのチェックを再度実行しwantFunction
ます。
つまり、パッケージ、コンテナpyfile、および実際のテストクラス/関数に異なる構造がある場合は、すべての段階でそれに一致するように、クレイジーで複雑な正規表現を作成する必要があります。
私にとって、これを学んだとき、パッケージ、コンテナー、およびテスト関数の前に共通のビットを付けることにしました。
setests
├── __init__.py
├── setest_area1.py
└──── def setest_someblock(): ...
そして、私のnose
コマンドは次のように機能します。
nose --testMatch="setest"
これにより、期待どおりに機能するようにフィルタリングされます。