6

私はPythonのテストにかなり慣れているので、これは私が間違っていることかもしれません..

テストを実行すると、テストランナーは正常に動作し、カバレッジも..しかし、2つの間にアサーションエラーが発生します:

Traceback (most recent call last):
  File "/usr/local/bin/coverage", line 9, in <module>
    load_entry_point('coverage==3.5.1', 'console_scripts', 'coverage')()
  File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 657, in main
    status = CoverageScript().command_line(argv)
  File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 526, in command_line
    self.coverage.stop()
  File "/usr/local/lib/python2.7/dist-packages/coverage/control.py", line 389, in stop
    self.collector.stop()
  File "/usr/local/lib/python2.7/dist-packages/coverage/collector.py", line 262, in stop
    assert self._collectors[-1] is self
AssertionError

さらに難しくするために、コマンド ライン ユーティリティをテストしようとしています。つまり、サブプロセス呼び出しをカバーするようカバレッジに指示する必要がありました。

カバレッジが実行中のスクリプトのカバー率を報告するようになったので、この部分が機能したと思います。しかし、カバレッジが機能しているため、AssertionError を取り除くことはできません。

何が間違っているのかを理解するのに役立つ人もいます。私のコードはすべて github で入手できます。

クイックラン:

cd /tmp/ && git clone git://github.com/h3/django-duke-client.git 
cd django-duke-client && chmod a+x run_tests && ./run_tests

ありがとう

アップデート

別のコンピューターでテストを実行しましたが、同じ AssertionError .. と新しい TypeError が発生しました。繰り返しますが、テストは正しく実行され、カバレッジもこれらのエラーがあっても正しく機能しているようです..

...
Ran 9 tests in 1.324s

OK
Traceback (most recent call last):
  File "/usr/local/bin/coverage", line 9, in <module>
    load_entry_point('coverage==3.5.1', 'console_scripts', 'coverage')()
  File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 657, in main
    status = CoverageScript().command_line(argv)
  File "/usr/local/lib/python2.7/dist-packages/coverage/cmdline.py", line 526, in command_line
    self.coverage.stop()
  File "/usr/local/lib/python2.7/dist-packages/coverage/control.py", line 389, in stop
    self.collector.stop()
  File "/usr/local/lib/python2.7/dist-packages/coverage/collector.py", line 262, in stop
    assert self._collectors[-1] is self
AssertionError
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.7/multiprocessing/util.py", line 284, in _exit_function
    info('process shutting down')
TypeError: 'NoneType' object is not callable
Error in sys.exitfunc:
Traceback (most recent call last):
  File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.7/multiprocessing/util.py", line 284, in _exit_function
    info('process shutting down')
TypeError: 'NoneType' object is not callable

Name                               Stmts   Miss Branch BrPart  Cover   Missing
------------------------------------------------------------------------------
dukeclient/__init__                   53     53      2      0     4%   1-93
dukeclient/commands/__init__          41     33      6      2    26%   1-9, 12, 14-15, 17, 24-28, 34-43, 46-63
...
4

1 に答える 1

3

に関してはNoneType is not callable error、以下のいくつかの要素が役立つ可能性があります。

モジュールの 174 行目plugintest.pyからnose-1.1.2-py2.7.egg/nose/plugins/、次の行を読むことができます。

from multiprocessing import Manager

これにより、multiprocessing.utilパッケージがインポートされ、終了関数が登録されます。

atexit.register(_exit_function)

問題は、ロードされたものが呼び出される前にアンロードmultiprocessing.utilされることと、ちなみに関数定義であることです。plugintest_exit_function

setup.pyしたがって、ファイルにインポートすると:

from multiprocessing import util

エラーが消えます。

ところで、失敗したテストのいくつかの部分にコメントするか、コードのいくつかの行を変更する必要がありました。

  • コマンドが有効で-mはないようです。
  • 名前duke_conf.ymlduke_conf.yml;に変更する必要がありました。
  • README.rstファイルが存在するかどうかを確認するテストLICENSEが失敗しています (理由を確認する時間がありませんでした)。

それが役に立てば幸い、

于 2012-08-29T20:59:02.670 に答える