包含输入/输出的导入模块

时间:2014-09-17 18:03:20

标签: python python-3.x python-unittest

我有一个python模块文件(func.py)和一个单元测试文件(f_test.py):

# func.py

def f(x):
    return x + 1

x = input("Enter x: "))

print("f(x): " + str(f(x)))

# f_test.py

import unittest
from func import f

class MyTest(unittest.TestCase):
    def test(self):
        self.assertEqual(f(1), 2)

当我运行f_test.py时,我希望测试套件能够被执行(成功)。 相反,我看到以下输入:

Finding files... done.
Importing test modules ... Enter x:

如果我从func.py注释掉输入/输出行,那么我会得到预期的行为。 如何在不修改func.py的情况下实现它?

3 个答案:

答案 0 :(得分:5)

导入func时,会运行里面的所有代码。运行定义def f(x)...是创建函数f的原因。

您可以使用if __name__=='__main__'区分导入和运行文件。

例如:

# func.py

def f(x):
    return x + 1

if __name__ == '__main__':
    x = input("Enter x: "))
    print("f(x): " + str(f(x)))

当您运行func.py时,__name__=='__main__'将为真。导入时,它将为false(__name__将为'func')。

答案 1 :(得分:2)

当然,正确的答案是修改func.py。如果你绝对肯定不会修改func.py,那么你可以重定向标准输入:

# f_test.py

import os
import sys
import unittest

oldstdin, sys.stdin = sys.stdin, StringIO.StringIO('7')
try:
  from func import f
finally:
  sys.stdin = oldstdin

class MyTest(unittest.TestCase):
    def test(self):
        self.assertEqual(f(1), 2)

答案 2 :(得分:1)

您需要添加到f_test.py的底部:

if __name__ == '__main__':
    unittest.main()

这样一来,测试将在文件运行时执行(我忘了这个次数比我想承认的多。)