繁体   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