我有一个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
的情况下实现它?
答案 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()
这样一来,测试将在文件运行时执行(我忘了这个次数比我想承认的多。)