在写一个简单的python测试程序的时候,发现eclipse中Run as "Python run 和 Python unittest”结果不一样?为什么会不一样?
先贴一下代码段:
#-*- coding: utf-8 -*-
'''Created on 2015-1-28
@author: z.q.ot'''
importunittestfrom driver importDriverfrom new_plan_api importnew_plan_check, new_plan_accept, new_plan_reject,
plans_detail, plans_detail_todayimportjsonfrom unittest importrunner
new_plan_id_array=[]classTest(unittest.TestCase):defsetUp(self):print "setUp"self.driver_info= Driver(usr='soil',pwd='soil',channel=1,typ=3)
self.token_id=self.driver_info.driver_login()#self.new_plan_id_array = []
deftearDown(self):print "tearDown"
#@unittest.skip("not check new plan")
deftestA_Check_new_plan(self):print "testCheck_new_plan......"result=new_plan_check(self.token_id)printresult
JsonResult= json.loads(result,"utf-8");if JsonResult["result"] ==0:print "check new plan is success and the new plan count is: %d"%JsonResult["data"]["page"]["total"]
self.new_plan_count= JsonResult["data"]["page"]["total"]for i inrange(self.new_plan_count):
new_plan_id_array.append(JsonResult["data"]["rows"][i]["id"])else:print "check new plan is fail and result code is: %d"%JsonResult["result"]
@unittest.skip("not accept new plan")deftestB_Accept_new_plan(self):print "testAccept_new_plan......"
printnew_plan_id_arrayfor i innew_plan_id_array:print "new_plan_id is %d" %i
new_plan_accept(i, self.token_id)#@unittest.skip("not Reject new plan")#def testC_Reject_new_plan(self):#print "testReject_new_plan......"
#new_plan_reject(plan_id=1, self.token_id)#@unittest.skip("not get detail today")
deftestD_detail_today(self):print "Get today plans......"plans_detail_today(self.token_id)defsuite():
suite=unittest.TestSuite()
suite.addTest(Test("testD_detail_today"))#suite.addTest(Test("testA_Check_new_plan"))
#suite.addTest(Test("testB_Accept_new_plan"))
returnsuite#or use like this
#tests=['testA_Check_new_plan','testB_Accept_new_plan','testD_detail_today']
#return unittest.TestSuite(map(Test,tests))
if __name__ == "__main__":#import sys;sys.argv = ['', 'Test.testName']
#unittest.main()
runner =unittest.TextTestRunner()
runner.run(suite())
在eclipse中对此代码段进行调试,发现:
1,在python真正入口操作中有所不同,run方式会执行到main函数中,而python unittest不会执行到。
2,run方式会根据控制来执行对应的测试,而python unittest执行全部测试
其中,调试python unittest方式main函数进入如下函数:
def __get_module_from_str(self, modname, print_exception, pyfile):"""Import the module in the given import path.
* Returns the "final" module, so importing "coilib40.subject.visu"
returns the "visu" module, not the "coilib40" as returned by __import__"""
try:
mod= __import__(modname)//入口就进入这里for part in modname.split('.')[1:]:
mod=getattr(mod, part)returnmodexcept:
......更多的代码查看源码pydev_runfiles.py
此时的modname为文件名:handle_new_plan_test;通过这样的查看,可知,在python unittest运行的时候,文件作为一个模块导入到了执行程序pydev_runfiles.py中。似乎有点说明一个问题:Python文件的执行有"导入执行”和“未导入执行(就是执行自身)“
还是有些迷糊?那么接下来的说明会更清晰。
因为程序执行的时候,总会有一个不同的地方,那就是上面说的那个问题。那么python到底是怎么去做模块导入执行和自身执行的呢?
贴一段测试代码:
#-*- coding: utf-8 -*-
defsayHello():print "hello"
if __name__ == "__main__":print "__main__"sayHello()
python作为一种脚本语言,我们用python写得各个module都可以可以包含__main__,当然也可以不包含,主要的体现就在:
1,当单独执行此module时,会根据__main__中逻辑去执行,其结果为:
>>>
__main__hello>>>
2 , 当该module被其他的module引入使用时,其中的"if __name__ == "__main__":所表示的逻辑不会被执行,这是因为当被其他模块引用时,__name__的值将发生变化,其将是文件module的名字,如之前__get_module_from_str()函数所获得modname,所以if条件为false,那么将不会执行到后面的逻辑。
到此,开始的疑问也就解决掉了!
相关知识
Python笔试题
《python灰帽子》源码一,运行一个程序进入调试状态
Cat Run下载
通过python
Python面向对象高级编程——多重继承
Python学习天二天
输出宠物的叫声python
python动物语音识别
Python基于大数据技术的宠物商品信息比价及推荐系统
基于Python的图像分类 项目实践——图像分类项目
网址: python运行run在哪 https://m.mcbbbk.com/newsview177308.html
上一篇: 金毛犬要比赛什么 |
下一篇: (10110010.1011)2 |