Python:AssertionError在使用覆盖率运行nose测试时出错



我对python测试相当熟悉,所以这可能是我做错了。。

当我进行测试时,测试运行程序运行良好,覆盖率也很高。。但在这两者之间,我得到了一个断言错误:

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

为了让事情变得更加困难,我正在尝试测试一个命令行实用程序。这意味着我必须告知覆盖范围以覆盖子流程调用。

我想我已经完成了这一部分,因为报道现在报道了正在运行的脚本的%的报道。但是,由于我的覆盖率工作,我无法摆脱断言错误。

如果能帮助我们了解问题所在,我们将不胜感激。我所有的代码都可以在github:上找到

  • 回购
  • setup.py
  • 运行测试(_T)
  • 子流程调用

快速运行:

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

感谢

更新

我在另一台计算机上运行了测试,得到了相同的断言错误。。加上一个新的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
...

关于NoneType is not callable error,请在下面找到一些可能对您有所帮助的元素。

nose-1.1.2-py2.7.egg/nose/plugins/第174行的模块plugintest.py中,可以读取以下行:

from multiprocessing import Manager

这导致multiprocessing.util包被导入,并随之注册一个退出函数:

atexit.register(_exit_function)

问题似乎是加载在plugintest中的multiprocessing.util在调用_exit_function之前被卸载,顺便说一下它的函数定义。

因此,如果您在setup.py文件中导入它:

from multiprocessing import util

错误消失。

顺便说一句,我不得不评论测试中失败的部分,或者更改一些代码行:

  • CCD_ 9命令似乎是无效的
  • 我不得不将duke_conf.yml重命名为duke_conf.yml
  • 检查README.rstLICENSE文件是否存在的测试失败(没有时间检查原因)

希望有帮助,

最新更新