2016-01-19 78 views
1

我試圖實現100%的覆蓋率。pytest-cov缺少類聲明的測試覆蓋率

我有文件(應用程序/ ifaces.py):

import netifaces 

class NoIPException(Exception): 
    pass 

def get_local_ips(): 
    ...(code here) 

和我有測試:

import pytest 
import mock 
import netifaces 

from app import ifaces 

def test_get_local_ips_normal_case(): 
.... 

當我運行手動測試:

py.test -v - -cov app --cov-report term-missing

它報告100%的代碼覆蓋率: app/ifaces 16 0 100%

,但是當我將其添加爲「自運行」的測試,它報告說,前六行不包括:

if __name__ == "__main__": 
    import sys 
    pytest.main("-v %s --cov app/ifaces.py --cov-report term-missing" % sys.argv[0]) 

報告:

Name   Stmts Miss Cover Missing 
-------------------------------------------- 
app/ifaces  16  4 75% 1-6 

我怎樣才能添加自運行測試以獲得與手動py.test執行相同的結果?結果有什麼區別?爲什麼app/ifaces.py中的6行報告爲第二種情況未涉及?

謝謝。

回答

1

好吧,我找到了一個理由。

當從測試本身調用pytest時,所有導入都已完成,因此它們不會被計入覆蓋範圍。

爲了覆蓋它們,它們需要在pytest-cov執行過程中導入。

我的解決方案是使用pytest夾具進行導入: 1.從測試程序的頂部刪除「from app import ifaces」。 2.添加夾具:

@pytest.fixture 
def ifaces(): 
    from app import ifaces 
    return ifaces 

3.Make它可通過作爲變量來測試:

def test_get_local_ips_normal_case(ifaces) 
    ....