簡體   English   中英

為了通過單元測試來測試 function,它是否需要有返回值?

[英]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 取決於能力

  1. 觀察程序的 function 到 state 引起的變化或
  2. 訪問 function 的返回值。

所以,如果一個函數的行為改變了程序的 state 並且我們需要測試這個行為,那么我們需要能夠訪問被改變的 state 的部分來測試相應的行為。 此類測試可能並不總是依賴於 function 的返回值。 因此,函數不需要返回可測試的值,但它們確實需要公開與需要測試的行為有關的信息。

有關測試這方面的更多信息,請閱讀測試替身。 “xUnit 測試模式”一書中關於間接輸入和輸出的“使用測試替身”一章是一個很好的參考。

不,它可能會產生副作用,您可以測試該副作用。

例如,考慮寫入文件的 function。 通過異常報告錯誤。 它沒有什么可以歸還的。 單元測試將調用 function 並檢查是否已寫入相關文件,並引發各種異常。

另一個示例是更改 object 的 state 的方法調用。 您調用該方法並檢查對象的 state 是否已更改。

暫無
暫無

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

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