簡體   English   中英

使用pytest導入單元測試資源:模塊級別還是測試級別?

[英]Importing resources for unit testing using pytest: module level or test level?

我一直在學習測試驅動開發的優勢,並嘗試使用pytestsetuptools develop選項開發我的第一個TDD應用程序。 到目前為止一切順利。 我有一個問題:我的test_*模塊中應該將要測試的資源導入到test_*

例如,我可以在模塊級別導入:

from app.module1 import resource1, resource2

def test_resource1():
    assert test_resource1 == "expected value 1"

def test_resource2():
    assert test_resource2 == "expected value 2"

另一方面,在每個測試函數中進行導入似乎更有意義:

def test_resource1():
    from app.module1 import resource1
    assert test_resource1 == "expected value 1"

def test_resource2():
    from app.module1 import resource2
    assert test_resource2 == "expected value 2"

這當然假定在其他地方不需要要測試的資源。

除了所需字符與輸入字符的不同之外,做一個或另一個是否有優勢?

標准樣式指南告訴“導入總是放在文件的頂部”。

功能級別的導入不會帶來重大的架構或技術優勢。

唯一有價值的例外是臨時插入斷點,在調試后刪除它們: import pdb; pdb.set_trace() import pdb; pdb.set_trace()__import__('pdb').set_trace()

如果在函數/方法級別導入,則對象將在更短的時間內進入范圍,從而允許它們比其他情況更快地進行垃圾收集。 所以它主要是內存消耗的好處。

這里的問題是關於測試的范圍,如果測試A旨在涵蓋模塊的導入,那么選項B是好的。 請記住,他們在導入相同模塊時都會失敗(如果該模塊存在問題)。

選項在大多數情況下更容易(更少打字),因為如果你有很多測試,他們將無法正常運行(你將無法收集測試)

在這種情況下還要擔心的另一件事是副作用,這兩個選項在這方面都無濟於事,py.test有一個選項可以在測試之間清除/重新加載所有加載的模塊(它不是默認的)

總而言之,這更像是一種報道風格問題。

將導入放在頂部是一個標准約定,否則(除了臨時調試的其他答案中所述)將使您的代碼對大多數python開發人員的可讀性降低。

在類/功能級別導入沒有任何好處。 如果您擔心要導入的對象之間的命名空間沖突,那么而不是from app.module1 import resource1 import app.module1並在測試中調用app.module1.resource1 在python docs Idioms和Anti-Idioms中也推薦使用這種模式,原因在於https://docs.python.org/2/howto/doanddont.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM