我有一个几乎完成单元测试覆盖范围的项目。只有一条声明没有涵盖,我想不出一个很好的方法。假设这个项目名为foo,我有foo/commands.py:
#!/usr/bin/python
[...]
def main(argv):
[...]
if __name__ == '__main__':
return main(sys.argv) # This line allegedly not covered by tests我确实有个测试!foo/test/test_Commands.py:
import unittest
class CommandsTest(unittest.TestCase):
def test_direct_call(self):
proc = subprocess.Popen(['python', 'foo/commands.py', 'help'], stdout=PIPE)
stdout, stderr = proc.communicate()
self.assertTrue(stdout.startswith('usage:'))
self.assertEquals(0, proc.returncode)(这不是我的实际测试,但也是这样。)
我用鼻子做我的测试跑步者:
nosetests --cover-erase --cover-tests --with-coverage --cover-package=foo -vs foo问题是这个特定的语句没有被认为是“覆盖的”,因为我使用普通的python而不是coverage.py (或者像它在Ubuntu上调用的那样使用python)。我可以将其更改为python覆盖率,但我并不真的想这样做:
现在,我有一个可怕的黑客要做:
interpreter = 'coverage' in sys.modules ['python-coverage', 'run'] or ['python']并不是最易读的代码,但是想象一下使用更易读的方法的讽刺性:
if 'coverage' in sys.modules:
interpreter = ['python-coverage', 'run']
else:
interpreter = ['python']...only意识到,当覆盖率启用时,分支最终不会被调用,所以我只有另一行代码没有被单元测试执行。
我的目标是如果没有100%的覆盖率,测试套件就会失败。我“需要”foo/commands.py中的语句,因为它是在开发过程中测试事物的一种非常方便的方法(在实际安装中,它将使用distutils console_scripts魔术来调用该文件)。
想法?现有的技术?什么都行?
注: 100%的保险不能保证一切都很好。不到100%是一个保证,虽然,有一些东西,你没有测试。我可以很容易地核实100%的覆盖率,所以我没有理由不这样做。
发布于 2011-05-10 21:36:34
最简单的选择是将行标记为覆盖测试忽略的行。您知道的比coverage.py知道的更多,您可以从测量数据中原谅这一行:
if __name__ == '__main__': # pragma: no cover
return main(sys.argv) 您还可以使用coverage.py的一些技巧将其传递到启动子进程中的度量代码。这听起来像是你真正想要的东西。
发布于 2011-05-03 20:56:09
从.py文件中删除未发现的行并使用
python -c "import foo; foo.main(args);"您可以用别名或bash函数包装它。
发布于 2019-03-15 22:45:23
将以下代码添加到测试运行程序中:
import coverage
coverage.process_startup()有关完整的图片,请参阅此示例runtests.py文件(这是运行测试的入口点)。
#!/usr/bin/env python
import os
import sys
import pytest
import coverage
def main():
coverage.process_startup()
sys.path.insert(0, os.path.abspath('src'))
return pytest.main()
if __name__ == '__main__':
sys.exit(main())在项目的根目录中添加一个名为.pth的文件,其内容如下:
import coverage; coverage.process_startup()在项目的根目录中添加一个名为sitecustomize.py的文件,其内容如下:
import coverage
coverage.process_startup()https://sqa.stackexchange.com/questions/32
复制相似问题