9

...そしてポニー!いいえ、真剣に。「うまくいく」テストを整理する方法を探しています。ほとんどのことは機能しますが、すべての要素がうまく適合するとは限りません。だからここに私が欲しいものがあります:

  • テストを自動的に検出する。これには、doctest が含まれます。doctests の合計が単一のテストとして表示されてはならないことに注意してください。(つまり、 py.test --doctest-modules が行うことではありません)
  • テストを並行して実行できること。(xdist の py.test -n のようなもの)
  • カバレッジ レポートの生成。
  • 動作させるpython setup.py testだけです。

私の現在のアプローチには、testsディレクトリとload_tests プロトコルが含まれます。含まれるすべてのファイルは、のように名前が付けられますtest_*.py。次の内容python -m unittest discoverのファイルを作成すると、これでうまくいきます。test_doctests.py

import doctest
import mymodule1, mymodule2
def load_tests(loader, tests, ignore):
    tests.addTests(doctest.DocTestSuite(mymodule1))
    tests.addTests(doctest.DocTestSuite(mymodule2))
    return tests

このアプローチには、 setuptools と supply を使用できるという利点もありますsetup(test_suite="unittest2.collector")

ただし、このアプローチにはいくつかの問題があります。

  • coverage.py は、スクリプトの実行を想定しています。したがって、ここでは unittest2 ディスカバリーを使用できません。
  • py.test は load_tests 関数を実行しないため、doctests が見つからず、--doctest-modulesオプションはがらくたです。
  • nodestests はload_tests関数を実行しますが、パラメーターは提供しません。これは、鼻の側面が完全に壊れているように見えます。

これよりもうまく機能させるにはどうすればよいですか、または上記の問題のいくつかを修正するにはどうすればよいですか?

4

2 に答える 2

2

これは古い質問ですが、一部の人にとってはまだ問題が解決していません! 私はちょうどそれに取り組んでいて、kaapstorm のものに似た解決策を見つけましたが、より良い出力が得られました。私はpy.testそれを実行していましたが、テストランナー間で互換性があるはずだと思います:

import doctest
from mypackage import mymodule

def test_doctest():
    results = doctest.testmod(mymodule)
    if results.failed:
        raise Exception(results)

失敗した場合に最終的に得られるのは、手動で doctest を実行した場合に出力される stdout 出力ですが、次のような追加の例外があります。

Exception: TestResults(failed=1, attempted=21)

kaapstrom が述べたように、(失敗がない限り) テストを適切にカウントしませんが、カバレッジ数が高く戻ってきた場合、それほど価値がないことがわかりました:)

于 2015-12-16T03:11:47.457 に答える
1

私は鼻を使っていますが、同じ問題を経験したときにあなたの質問を見つけました。

私が最終的に行ったことはきれいではありませんが、テストを実行します。

import doctest
import mymodule1, mymodule2

def test_mymodule1():
    assert doctest.testmod(mymodule1, raise_on_error=True)

def test_mymodule2():
    assert doctest.testmod(mymodule2, raise_on_error=True)

残念ながら、モジュール内のすべての doctest を単一のテストとして実行します。しかし、うまくいかない場合は、少なくともどこから調べればよいかはわかっています。失敗すると、有用なメッセージとともに DocTestFailure が発生します。

DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)>
于 2013-12-10T13:30:51.993 に答える