我对 python 中的单元测试(和一般测试)非常陌生。我编写了一个简单的控制台应用程序,它为用户提供了多个选项,他们可以通过输入一个数字 (1-15) 来选择这些选项,并且我有一个功能,一旦输入被检查,就会在屏幕上打印一个响应。除了响应会根据用户的选择而变化之外,响应还取决于文本文件中保存的数据,因此可能会发生变化。
我该如何着手测试这样的功能?
谢谢
最佳答案
规范的解决方案是重构你的函数,这样
1/它将可能的输出集作为参数而不是从文件(或数据库或其他任何东西)中读取它们,并让调用者负责传递这个参数,
和 2/它返回响应而不是将其打印到标准输出,并让调用者负责打印到标准输出。
脑死亡示例:
之前.py
def print_response(choicenum):
fname = "response-{}.txt".format(choicenum)
with open(fname) as f:
data = f.read().splitlines()
print data[choicenum]
def main():
choicenum = int(raw_input("choose a number"))
print_response(choicenum)
之后.py
def get_reponse(choicenum, choices):
return choices[choicenum]
def read_responses_file(choicenum):
fname = "response-{}.txt".format(choicenum)
with open(fname) as f:
return f.read().splitlines()
def main():
choicenum = int(raw_input("choose a number"))
choices = read_responses_file(choicenum)
print get_response(choicenum, choices)
它仍然不是完美的可测试性(read_response_file()
仍然取决于文件系统——这使得它很难单元测试——并且 main
仍然直接打印到标准输出——这可以通过模拟 sys.stdout
) 进行测试,但至少“域”部分 (get_response()
) 与文件系统和 stdout 分离。
关于Python 单元测试。测试打印动态数据的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682153/