为了使用单元测试测试函数,它是否需要有一个返回值?

2024-05-16 00:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,正在努力学习单元测试。我正在使用pytest对我的代码运行一些单元测试。类似于此示例的内容:

def test_calc_total():
    total = mathlib.calc_total(4,5)
    assert total == 9

我在这里可能不正确,但我了解到,为了使函数可测试,它必须返回一个值。所有单元测试都是这样吗

我发现我的大多数函数都无法测试,因为它们没有返回值。我正在创建一个票证跟踪系统,并将票证信息存储在一个数据框中。以下是TicketDF课程的一部分:

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()

如您所见,大多数函数(即使未显示的函数)都没有返回值。编写代码以使所有函数都有返回值是最佳做法吗?或者有没有其他方法可以在没有返回值的情况下测试函数


Tags: 函数selftruedfreturnosdefcalc
2条回答

不,它可能有副作用,你可以测试一下副作用

例如,考虑一个写入文件的函数。通过异常报告错误。它没有任何回报。单元测试将调用函数并检查相关文件是否已写入,以及引发各种异常

另一个示例是更改对象状态的方法调用。调用该方法并检查对象的状态是否已更改

简而言之,答案是否定的

测试函数取决于

  1. 观察该功能对程序状态的改变,或
  2. 访问函数的返回值

因此,如果一个函数的行为改变了一个程序的状态,我们需要测试这个行为,那么我们需要能够访问被改变的状态部分来测试相应的行为。此类测试可能并不总是依赖于函数的返回值。因此,函数不需要返回可测试的值,但它们确实需要公开与需要测试的行为相关的信息

有关测试这方面的更多信息,请阅读关于测试加倍的文章。《xUnit测试模式》一书中关于间接输入和输出的“使用测试双精度”一章是一个很好的参考

相关问题 更多 >