开始对没有返回值的函数进行单元测试

时间:2015-05-15 12:17:31

标签: python unit-testing python-3.x

我有一个基于函数的程序,它们在函数内部输入用户输入而不是函数之前的参数:例如,假设我的函数是

def my_function():
    a = input("a: ")
    b = input("b: ")
    print(a+b)

从我到目前为止所了解到的单元测试这样的函数比单元测试更难以实现像这样的函数:

def another_function(a,b):
    return(a+b)

那么我该如何测试一个看起来像my_function的函数呢?通过输入错误的输入和检查错误,手动测试很容易,但我必须编写一个测试套件,自动测试我的所有功能。

1 个答案:

答案 0 :(得分:1)

鉴于您的函数输入来自input并且输出转到print,您必须“mock”这两个函数才能测试my_function 。例如,使用简单的手动模拟:

def my_function(input=input, print=print):
    a = input("a: ")
    b = input("b: ")
    print(a+b)

if __name__ == '__main__':
    inputs = ['hello', 'world']
    printed = []

    def mock_input(prompt):
        return inputs.pop(0)

    def mock_print(text):
        printed.append(text)

    my_function(mock_input, mock_print)
    assert len(inputs) == 0, 'not all input used'
    assert len(printed) == 1, '{} items printed'.format(len(printed))
    assert printed[0] == 'helloworld'

将其与以下内容进行比较时:

assert my_function('hello', 'world') == 'helloworld'

你可以看出为什么后者更受欢迎!

您还可以使用适当的模拟库来更整齐地执行此操作,而无需将函数作为参数提供;见例如How to supply stdin, files and environment variable inputs to Python unit tests?