为什么当我导入时,我的python unittest脚本调用我的脚本?
问题描述:
我想测试一个python脚本,当我将脚本导入到我的测试套件中时,它会调用脚本。在我的例子中,我导入list3rdparty,一旦我运行测试,它立即调用list3rdparty。我不希望发生这种情况。我希望测试只能在每个测试用例中调用函数。为什么当我导入时,我的python unittest脚本调用我的脚本?
list3rdpartytest.pyimport unittest
from list3rdparty import * ## this is where the script is being imported
class TestOutputMethods(unittest.TestCase):
def setUp(self):
pass
def test_no_args_returns_help(self):
args = []
self.assertEqual(get_third_party(args), help())
##get_third_party is a function in list3rdparty##
if __name__ == '__main__':
unittest.main(warnings = False)
list3rdparty.py
def get_third_party(args_array):
##does a bunch of stuff
def get_args():
get_third_party(sys.argv)
get_args()
答
,你可能会有的,这将在导入时执行的模块级代码。例如,如果您有一个包含以下内容的文件,它将在第一次导入时打印该字符串。
import something
from whatever import another
print 'ding'
为了避免这种情况,把代码块中,像这样:
if __name__ == '__main__':
# your module-level code here
get_args()
这将只运行代码,如果它直接在命令行中调用。
导入一个python模块总是执行它内部的代码,这意味着执行它内部的所有方法或类定义,以便它们被加载并准备好自己执行。如果您导入的模块也是一个脚本(例如意味着要从命令行执行),那么您应该将该脚本的启动代码放在一个'if __name__ =='__main __':'语句的下面,该语句不标记在文件导入时执行。尽管我的习惯是保留单独的文件可重复使用的东西,这些东西是要导入的,并且是可执行的东西,这些东西将被启动。 – Svend
为什么人们在评论中回答问题?写一个答案! – Soviut
@Sndnd我导入的模块也是一个脚本。当你说“把启动代码”放在if __name__ =='__main__'声明的下面时,你的意思是什么?我为无知而感到抱歉,我对Python非常陌生。 – jshaf