2017-02-22 245 views
0

免責聲明;初學者問題!代碼覆蓋率報告「代碼運行」,但不是由單獨文件單元測試「代碼覆蓋」

我的項目結構,高度簡化的問題的緣故,看起來是這樣的:

Project/ 
|-- main.py 
|-- test_main.py 

閱讀Jeff Knupp's blogpost on unit testing和寫作的測試,各種各樣我想看看現在多少我的代碼是由測試所覆蓋後。所以我安裝coverage.py和下面讓我困惑:

$覆蓋運行main.py(顯示我的打印/從腳本登錄)

$覆蓋報告main.py

名稱,撐條,小姐,覆蓋

main.py,114,28,75%

的事情是,我不從主腳本內運行單元測試,也沒有我想我應該。我在提交之前手動運行test_main.py中的所有測試,並知道他們的事實而不是覆蓋了我所有語句的75%。在閱讀coverage documentation後,我懷疑我的單元測試實現......我是否需要運行測試的main.py中的觸發器?

於是,我同我的測試腳本:

$覆蓋運行test_main.py(顯示我所有測試的 'OK' 試運行)

$覆蓋報告test_main.py

名稱,撐條,小姐,封面

test_main.py,8,0,100%

但是,這只是向我展示了我在執行腳本期間在測試語句中「擊中了」100%的代碼。那麼爲什麼如果它只是顯示已使用的代碼,則覆蓋範圍列在"increase test coverage"之下。

我真的很想看看我的main.py有多少被test_main.py覆蓋,我很確定我缺少一些基本概念。有人能詳細說明嗎?


在我的Ubuntu機器上運行的「覆蓋運行test_main.py;覆蓋報告」不僅使我對test_main.py的報告。在我的Windows機器這給:

名稱,支桿,小姐,封面


main.py,114,74,35%

test_main。PY,8,0,100%


TOTAL,122,74,39%

覆蓋報告仍然沒有意義:

  1. 的test_main涵蓋9出的134行代碼和主要覆蓋範圍內的10個函數中的1個不是35%
  2. 爲什麼它報告test_main的覆蓋率,這些是測試,如果這不是100%,它會很奇怪,因爲我' m運行所有測試以查看我的cov erage ...
  3. 我在這裏做錯了什麼,或者看着它的這種方式是bollocks,計算平均「覆蓋率」,而總結與代碼本身的測試提供沒有見解,在我的初學者意見是錯誤的
+0

沒有看到您的代碼很難回答。所有的coverage.py都可以告訴你你運行的是什麼代碼,以及你可以運行什麼代碼,並告訴你它們的區別。你已經展示了兩份報告,這兩份報告都聲稱是關於main.py的,但第一份報告中有114份報告,第二份報告說有8份報告。這不應該改變。你能仔細檢查細節嗎? –

+0

@NedBatchelder對不起,小錯 - 底部報告與test_main.py相關。我仍然不明白在* test *上下文中覆蓋是如何有用的,它在檢查哪些代碼可能永遠不會運行或其他用途上看起來很有用。 我想通過單元測試瞭解我的代碼的哪些部分被*覆蓋*(因此覆蓋率我認爲...),但這只是向我展示了在兩個單獨的報告中運行的代碼。因此,我可以用coverage.py完成我想要的唯一方法是複製test_main.py中的所有main.py代碼並在腳本中進行測試? – MarcelTon

+0

您可以使用coverage.py來衡量您的測試套件的執行情況。它會告訴你產品代碼中的哪些行是運行的,哪些不是。做到這一點:「覆蓋運行test_main.py;覆蓋報告」。如果您不想將報告限制爲只有一個文件,則不要將報告名稱放在報告報告上。 –

回答

0

要回答和關閉我自己的問題 - 儘管我仍然不太同意一些覆蓋邏輯,但35%是準確的,謝謝@Ned指出僅當導入時纔會計算行數。它還包含頂級文件描述,argparser和主要引用達到此百分比的函數。在114行代碼中,總共可以有40個 - 即使我直接導入的函數本身只是代碼行。

我不太喜歡這種報告方式,因爲我沒有在測試語句中使用所有的輸入,argparser沒有受到影響,仍然說它們被「覆蓋」 - 主要是導致語義討論,我會說這些是「看到」或「通過」,但實際上沒有「被測試覆蓋」。

我還做了另一個測試覆蓋率運行與不同的文件名test_main_2.py測試以完全相同的方式相同的功能...產生了(35 + 100 + 100)/ 3 = 78%的覆蓋率平均,而不是之前(35 + 100)/ 2 = 68%的覆蓋率。

我明白它是如何計算覆蓋面(平均),現在讓我以更正確的方式解釋數字。也許這可以幫助初學者解釋他或她自己的第一個結果。

相關問題