如何向python控制台提供输入并以编程方式验证输出?

如何向python控制台提供输入并以编程方式验证输出?,python,automation,Python,Automation,对于此示例程序 N = int(raw_input()); n = 0; sum = 0; while n<N: sum += int(raw_input()); n+=1; print sum; N=int(原始输入()); n=0; 总和=0; 通常情况下,您可能希望以不同的方式构造代码,可能是根据Blender在其评论中的建议。但是,要回答您的问题,您可以使用模块编写一个脚本来调用此脚本,并将输出与预期值进行比较 特别是查看check\u call方法。在

对于此示例程序

N = int(raw_input());
n  = 0;
sum = 0;
while n<N:

    sum += int(raw_input());
    n+=1;

print sum;  
N=int(原始输入());
n=0;
总和=0;

通常情况下,您可能希望以不同的方式构造代码,可能是根据Blender在其评论中的建议。但是,要回答您的问题,您可以使用模块编写一个脚本来调用此脚本,并将输出与预期值进行比较


特别是查看
check\u call
方法。

在Unix shell中,这可以通过以下方式实现:

$ python program.py < in > out  # Takes input from in and treats it as stdin.
                                # Your output goes to the out file.
$ diff -w out out_corr          # Validate with a correct output set

我编写了一个测试框架(),可用于您的问题:

from hamcrest import contains_string
from prego import TestCase, Task

class SampleTests(TestCase):
    def test_output(self):
        task = Task()
        cmd = task.command('echo your_input | ./your_app.py')
        task.assert_that(cmd.stdout.content, 
                         contains_string('your_expected_output'))

当然,PREGO提供了更多的特征。

< P>拿起分离思想,我会考虑如下:

def input_ints():
    while True:
        yield int(raw_input())

def sum_up(it, N=None):
    sum = 0
    for n, value in enumerate(it):
        sum += int(raw_input());
        if N is not None and n >= N: break
    return sum
打印金额

要使用它,你可以

inp = input_ints()
N = inp.next()
print sum_up(inp, N)
要测试它,您可以执行以下操作

inp = (1, 2, 3, 4, 5)
assert_equal(sum_up(inp), 15)

将其转换为函数并用参数替换
raw\u input()
s。另外,不要在每行末尾加分号。Python不需要它们。@我正在解决的Blender需要提供大量输入。我正在自动化那个部分。基本上,我想模仿interviewstreet对提交的程序所做的操作。以及,;旧习难改:)您可以创建第二个函数,使用
raw\u input()
获取用户输入并将其输入到原始函数中。如果你把逻辑和用户交互分开会更容易。你能提供一个完整的例子吗?脚本,它为自身或其他脚本提供多行输入?
inp = (1, 2, 3, 4, 5)
assert_equal(sum_up(inp), 15)