2

https://bitbucket.org/petar/beam_integralsを使用してテストすると、 96%のカバレッジpython setup.py nosetestsが得られます。

----------------------------------------------------------------------
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. Ubuntu10.04サーバー32ビットを実行している継続的インテグレーションサーバー
  2. 次の設定でUbuntu12.04サーバー64ビットを実行する新しく作成されたRackspaceクラウドサーバー:

    $ 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

ネッドの答えを完成させるために、ファイル内のバージョンを複製せずに問題を回避するための2つの解決策を知っています。

  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 に答える