考虑这个小型的交互式Python会话:
>>> a = 'a'
>>> b = 'b'
>>> ab = a + b
>>> ab
'ab'
有没有办法以编程方式执行此操作?我想每行注入一行,然后对结果进行单元测试。我不能像通常那样创建Python脚本并执行它,因为有些代码在交互式Python中有不同的反应(例如,inspect.getcomments())。我想在交互式Python中测试行为。我更喜欢Python3解决方案,但我怀疑解决方案与Python2中的解决方案没有什么不同。
答案 0 :(得分:3)
执行此操作的一种方法是使用Python的doctest模块。它本质上解析代码就好像它在Python REPL中一样,然后断言输出与该REPL中写入的内容相匹配。
$ cat foo
>>> a = 'a'
>>> b = 'b'
>>> ab = a + b
>>> ab
'ab'
$ python -m doctest foo
$ cat > bar
>>> a = 'a'
>>> b = 'b'
>>> ab = b + a # oops
>>> ab
'ab'
$ python -m doctest bar
**********************************************************************
File "bar", line 4, in bar
Failed example:
ab
Expected:
'ab'
Got:
'ba'
**********************************************************************
1 items had failures:
1 of 4 in bar
***Test Failed*** 1 failures.