为什么当我导入时,我的python unittest脚本调用我的脚本?

问题描述:

我想测试一个python脚本,当我将脚本导入到我的测试套件中时,它会调用脚本。在我的例子中,我导入list3rdparty,一旦我运行测试,它立即调用list3rdparty。我不希望发生这种情况。我希望测试只能在每个测试用例中调用函数。为什么当我导入时,我的python unittest脚本调用我的脚本?

list3rdpartytest.py
import 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() 
+0

导入一个python模块总是执行它内部的代码,这意味着执行它内部的所有方法或类定义,以便它们被加载并准备好自己执行。如果您导入的模块也是一个脚本(例如意味着要从命令行执行),那么您应该将该脚本的启动代码放在一个'if __name__ =='__main __':'语句的下面,该语句不标记在文件导入时执行。尽管我的习惯是保留单独的文件可重复使用的东西,这些东西是要导入的,并且是可执行的东西,这些东西将被启动。 – Svend

+0

为什么人们在评论中回答问题?写一个答案! – Soviut

+0

@Sndnd我导入的模块也是一个脚本。当你说“把启动代码”放在if __name__ =='__main__'声明的下面时,你的意思是什么?我为无知而感到抱歉,我对Python非常陌生。 – jshaf

,你可能会有的,这将在导入时执行的模块级代码。例如,如果您有一个包含以下内容的文件,它将在第一次导入时打印该字符串。

import something 
from whatever import another 

print 'ding' 

为了避免这种情况,把代码块中,像这样:

if __name__ == '__main__': 
    # your module-level code here 
    get_args() 

这将只运行代码,如果它直接在命令行中调用。

+0

感谢您的快速响应!我只是好奇,你的意思是把代码放在这里。我在其他答案中已经看到,但我不确定这意味着什么。我为无知而感到抱歉,我是python的新手。 – jshaf

+0

任何在模块级执行的代码,所以任何代码都不在函数,类或其他可调用块中。 – Soviut

+0

我做了一些编辑,向您展示我在list3rdparty.rb中所做的事情。那么我会在测试套件中的if __name__ =='__main__'下添加get_args()吗? – jshaf