2

当我测试https://bitbucket.org/petar/beam_integrals时,python setup.py nosetests我得到了96% 的覆盖率

----------------------------------------------------------------------
XML: nosetests.xml
Name                                             Stmts   Miss  Cover   Missing
------------------------------------------------------------------------------
beam_integrals                                       7      7     0%   1-24
beam_integrals.beam_types                           79      0   100%
beam_integrals.characteristic_equation_solvers      65      0   100%
beam_integrals.exceptions                            6      0   100%
beam_integrals.utils                                14      0   100%
------------------------------------------------------------------------------
TOTAL                                              171      7    96%
----------------------------------------------------------------------
Ran 634 tests in 178.245s

OK (SKIP=3)

但是,如果我测试相同的代码,nosetests我会得到完全覆盖

----------------------------------------------------------------------
XML: nosetests.xml
Name                                             Stmts   Miss  Cover   Missing
------------------------------------------------------------------------------
beam_integrals                                       7      0   100%
beam_integrals.beam_types                           79      0   100%
beam_integrals.characteristic_equation_solvers      65      0   100%
beam_integrals.exceptions                            6      0   100%
beam_integrals.utils                                14      0   100%
------------------------------------------------------------------------------
TOTAL                                              171      0   100%
----------------------------------------------------------------------
Ran 634 tests in 179.226s

OK (SKIP=3)

似乎python setup.py nosetests没有正确报告beam_integrals模块的测试覆盖率。

此问题已在以下位置得到验证:

  1. 我们的持续集成服务器运行 Ubuntu 10.04 Server 32bit
  2. 新创建的 Rackspace 云服务器,运行 Ubuntu 12.04 Server 64 位,设置如下:

    $ sudo aptitude update
    $ sudo aptitude upgrade
    $ sudo reboot
    
    $ sudo aptitude install python-pip mercurial git-core python-gmpy python-dev
    $ hg clone https://bitbucket.org/petar/beam_integrals
    $ sudo pip install -r beam_integrals/requirements.txt
    $ sudo pip install -r beam_integrals/requirements-test.txt
    
    $ cd beam_integrals
    $ python setup.py nosetests
    $ nosetests
    
4

2 回答 2

4

python setup.py nosetests在开始覆盖测试之前导入 beam_integrals,因此在进行覆盖测量时它已经被导入。这是因为您的 setup.py 直接导入了 beam_integrals。这不是一件坏事,很多 Python 项目这样做是为了从代码本身获取版本信息,而不是在 setup.py 中复制它。

当您使用nosetests时,它知道在导入任何内容之前开始覆盖测量。实际上,它可能会导入东西,取消导入它们,开始覆盖,然后运行代码,再次导入东西。

nosetests除了用来运行测试之外,我不确定你能做些什么。

于 2012-07-01T12:51:03.070 回答
1

为了完成 Ned 的回答,我知道有两种解决方案可以在不复制文件中的版本的情况下规避该问题。

  1. 导入模块后从 sys.modules 中删除模块

    import beam_integrals
    for mod in [m for m in sys.modules.keys() if m.startswith('beam_integrals')]:
        del sys.modules[mod]
    

    覆盖率报告现在将包括所有文件。
    但是,在您的情况下,它仍然需要sympy安装。
    这就是我转向下一个解决方案的原因。

  2. 读取模块版本而不导入它:

    def get_version():
        with open('beam_integrals/__init__.py') as f:
            for line in f:
                if line.startswith('__version__'):
                    return eval(line.split('=')[-1])
    
    setup(
        name='beam_integrals',
        version=get_version(),
    

    我在这里看到了这个:https ://github.com/PyCQA/pycodestyle/blob/2.3.1/setup.py

于 2014-10-15T11:58:44.717 回答