[英]In order to test a function with unit testing, does it need to have a return value?
我是 python 的新手,正在嘗試學習單元測試。 我正在使用 pytest 對我的代碼運行一些單元測試。 與此示例非常相似的內容:
def test_calc_total():
total = mathlib.calc_total(4,5)
assert total == 9
我在這里可能不正確,但我了解到,為了讓您的 function 可測試,它必須返回一個值。 所有單元測試都是這樣嗎?
我發現我的大多數函數都無法測試,因為它們沒有返回值。 我正在創建一個票證跟蹤系統並將票證信息存儲在 dataframe 中。 這是TicketDF class 的一部分:
class TicketDF():
cwd = os.getcwd()
df = pd.DataFrame()
def __init__(self, configParser):
self.populateFilePaths(configParser)
self.populateAttributes(configParser)
self.populateTable()
def populateTable(self):
if self.doesFileExistAndNotEmpty(self.ticketCSVFilePath):
self.df = pd.read_csv(self.ticketCSVFilePath, converters={'Comments':literal_eval}) #, 'Attachments':literal_eval})
self.df.set_index('Ticket ID', inplace=True)
def populateAttributes(self, configParser):
self.ticketAttributes = configParser.getTicketAttributes()
def populateFilePaths(self, configParser):
self.ticketCSVFilePath = configParser.getTicketsCSVPath()
def doesFileExistAndNotEmpty(self, filepath):
if os.path.exists(filepath) and os.path.getsize(filepath) > 0:
return True
else:
return False
def getTicketDF(self):
return self.df
def addTicketToDF(self, data):
df = pd.DataFrame (data, columns = self.ticketAttributes)
df.set_index('Ticket ID', inplace=True)
self.df = self.df.append(df)
self.saveDFToCSV()
如您所見,大多數函數,即使是未顯示的函數,也沒有返回值。 編寫代碼以使所有函數都有返回值是最佳實踐嗎? 還是有另一種方法來測試沒有返回值的函數?
最簡潔的答案是不。
測試 function 取決於能力
所以,如果一個函數的行為改變了程序的 state 並且我們需要測試這個行為,那么我們需要能夠訪問被改變的 state 的部分來測試相應的行為。 此類測試可能並不總是依賴於 function 的返回值。 因此,函數不需要返回可測試的值,但它們確實需要公開與需要測試的行為有關的信息。
有關測試這方面的更多信息,請閱讀測試替身。 “xUnit 測試模式”一書中關於間接輸入和輸出的“使用測試替身”一章是一個很好的參考。
不,它可能會產生副作用,您可以測試該副作用。
例如,考慮寫入文件的 function。 通過異常報告錯誤。 它沒有什么可以歸還的。 單元測試將調用 function 並檢查是否已寫入相關文件,並引發各種異常。
另一個示例是更改 object 的 state 的方法調用。 您調用該方法並檢查對象的 state 是否已更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.