[英]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.