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

时间:2017-04-28 14:04:29

标签: python unit-testing testing

我是python中的unittest(通常是测试)的新手。我写了一个简单的控制台应用程序,它为用户提供了多个选项,他们可以通过输入一个数字(1-15)来选择,我有一个功能,一旦检查输入,就会打印出一个响应屏幕。除了响应根据用户选择而变化外,响应还取决于文本文件中保存的数据,因此可能会发生变化。

如何测试这样的功能?

由于

1 个答案:

答案 0 :(得分:1)

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

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

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

Braindead示例:

before.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)

after.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 / testability(read_response_file()仍然依赖于文件系统 - 这使得几乎不能单稳定 - 并且main仍然直接打印到stdout - 这可以通过模拟来测试sys.stdout),但至少是"域" part(get_response())与文件系统和stdout分离。