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

时间:2013-01-19 06:37:33

标签: python automation

对于此示例程序

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

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

print sum;  

我有一组测试用例,所以我需要一个python程序来调用上面的python程序,给出输入并且应该验证控制台中打印的输出。

4 个答案:

答案 0 :(得分:3)

在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

你可以在这样的Python中做同样的事情

from subprocess import Popen, PIPE, STDOUT

f = open('in','r')            # If you have multiple test-cases, store each 
                              # input/correct output file in a list and iterate
                              # over this snippet.
corr = open('out_corr', 'r')  # Correct outputs
cor_out = corr.read().split()
p = Popen(["python","program.py"], stdin=PIPE, stdout=PIPE)
out = p.communicate(input=f.read())[0]
out.split()
# Trivial - Validate by comparing the two lists element wise.

答案 1 :(得分:1)

提出分离思想,我会考虑这个:

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)

答案 2 :(得分:0)

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

请特别注意check_call方法。

答案 3 :(得分:0)

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

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提供的功能多于此。