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

标签 python unit-testing testing

我对 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/

相关文章:

Python - 根据魔数(Magic Number)/长度将文件解析为输出

python - 使用线程和/或多处理同时移动多个 turtle

python - 如何将\x22之类的字符转换成字符串?

unit-testing - 在莱宁根进行测试

.net - WebSphere MQ .NET - 如何本地测试?

python - 使用 PyYAML 有选择地转储对象属性

c# - 使用 Rhino-Mock stub 的排序方法返回值

unit-testing - 在 Eclipse 中运行 Go 测试

Django测试环境

java - Spring Boot HTTPServletRequest 无法通过测试正确使用