如何测试初学者的Python程序(使用input(),或许用unittest)?

5 投票
8 回答
2084 浏览
提问于 2025-04-16 11:01

我在一门初学者的编程课上担任评分员,课程使用的是Python。虽然我自己的Python水平不高,但我想尝试自动化一些评分的工作。

在网上查找资料时,我发现了PyUnit这个测试工具,虽然它可能对我想做的事情来说有点复杂。

我遇到的问题是,我不太确定怎么把我想要的测试输入传递给学生的函数,因为他们还没有使用命令行参数,甚至还没有多个函数,而是通过input()函数获取用户输入。

举个简单的例子:

#/usr/bin/python3.1
# A silly example python program
def main():
    a = int(input("Enter an integer: "))
    b = int(input("Enter another integer: "))
    c = a+b
    print("The sum is %d" % c)

if __name__ == '__main__'
    main()

对于这个简单的例子,我该怎么写一个单元测试来检查不同输入的输出呢?(比如,如果我输入2和3,输出的字符串应该是“总和是5”)

8 个回答

2

如果你需要和命令行程序进行更复杂的互动,而不仅仅是用 echo 这个简单的命令,那么你可以考虑使用 expect

4

其实你没法对这个进行单元测试。写单元测试的时候,有一个要点就是你可能需要改变一下你的代码,这样才能方便测试。在这种情况下,你需要把输入的部分提取到一个单独的函数里,这样你就可以对这个函数进行修改。

def my_input(prompt):
    return input(prompt)

def main():
    a = int(eval(my_input("Enter an integer: "))

等等。现在你的测试可以对 myscript.my_input 进行修改,让它返回你想要的值。

8

编辑:之所以提这个,是因为这个例子不太适合单元测试(我想初学者可能会对这个限制感到困惑)

如果你只关心输出结果是否符合你的要求,那为什么不试试一些“简单”的bash命令呢?比如:

echo -e "2\n3" | python test.py | grep -q "The sum is 5" && echo "Success"

如果你在做像这样的简单程序,那么这个方法应该足够好,几乎不需要太多努力。

撰写回答