Python单元测试。测试打印动态数据的方法

Python单元测试。测试打印动态数据的方法,python,unit-testing,testing,Python,Unit Testing,Testing,我对python中的单元测试(以及一般的测试)非常陌生。我编写了一个简单的控制台应用程序,它为用户提供了多个选项,用户可以通过输入一个数字(1-15)来选择这些选项,并且我有一个功能,一旦检查了输入,就会将响应打印到屏幕上。除了响应根据用户的选择而变化外,响应还取决于文本文件中保存的数据,因此可能会发生变化 我如何测试这样的函数 谢谢规范的解决方案是重构函数,以便 1/它将可能的输出集作为参数,而不是从文件(或数据库或其他任何地方)读取它们,并使调用方负责传递此参数 2/它返回一个响应,而不是将

我对python中的单元测试(以及一般的测试)非常陌生。我编写了一个简单的控制台应用程序,它为用户提供了多个选项,用户可以通过输入一个数字(1-15)来选择这些选项,并且我有一个功能,一旦检查了输入,就会将响应打印到屏幕上。除了响应根据用户的选择而变化外,响应还取决于文本文件中保存的数据,因此可能会发生变化

我如何测试这样的函数


谢谢

规范的解决方案是重构函数,以便

1/它将可能的输出集作为参数,而不是从文件(或数据库或其他任何地方)读取它们,并使调用方负责传递此参数

2/它返回一个响应,而不是将其打印到stdout,并使调用方负责打印到stdout

脑死的例子:

在…之前

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)  

它仍然不是完美的wrt/可测试性(
read\u response\u file()
仍然依赖于文件系统,这使得它很难进行统一测试,
main
仍然直接打印到stdout,这可以通过模拟
sys.stdout
进行测试),但至少“域”部分(
get\u response()
)与文件系统和标准输出都解耦。

您为它提供已知的输入,并期望得到已知的输出。它依赖的东西越多,你必须提供的东西就越多(尽管有时你可以重新设计,这样它就不再依赖它们了)