在写一个简单的python测试程序的时候,发现eclipse中Run as "Python run 和 Python unittest”结果不一样?为什么会不一样?

先贴一下代码段:

# -*- coding: utf-8 -*-
'''
Created on 2015-1-28 @author: z.q.ot
'''
import unittest from driver import Driver
from new_plan_api import new_plan_check, new_plan_accept, new_plan_reject,\
plans_detail, plans_detail_today
import json
from unittest import runner new_plan_id_array = [] class Test(unittest.TestCase): def setUp(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 = [] def tearDown(self):
print "tearDown" # @unittest.skip("not check new plan")
def testA_Check_new_plan(self): print "testCheck_new_plan......"
result = new_plan_check(self.token_id)
print result
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 in range(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")
def testB_Accept_new_plan(self):
print "testAccept_new_plan......"
print new_plan_id_array
for i in new_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")
def testD_detail_today(self):
print "Get today plans......"
plans_detail_today(self.token_id) def suite():
suite = unittest.TestSuite()
suite.addTest(Test("testD_detail_today"))
#suite.addTest(Test("testA_Check_new_plan"))
#suite.addTest(Test("testB_Accept_new_plan"))
return suite #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)
return mod
except:
......更多的代码查看源码pydev_runfiles.py

此时的modname为文件名:handle_new_plan_test;通过这样的查看,可知,在python unittest运行的时候,文件作为一个模块导入到了执行程序pydev_runfiles.py中。似乎有点说明一个问题:Python文件的执行有"导入执行”和“未导入执行(就是执行自身)“

还是有些迷糊?那么接下来的说明会更清晰。

因为程序执行的时候,总会有一个不同的地方,那就是上面说的那个问题。那么python到底是怎么去做模块导入执行和自身执行的呢?

贴一段测试代码:

#-*- coding: utf-8 -*-

def sayHello():
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 run 和python unittest两种eclipse运行方式深入理解if __name__ == "__main__"的更多相关文章

  1. 「python」: arp脚本的两种方法

    「python」: arp脚本的两种方法 第一种是使用arping工具: #!/usr/bin/env python import subprocess import sys import re de ...

  2. python中执行shell的两种方法总结

    这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...

  3. python中的pandas的两种基本使用

    python中的pandas的两种基本使用2018年05月19日 16:03:36 木子柒努力成长 阅读数:480 一.pandas简介 pandas:panel data analysis(面板数据 ...

  4. python执行linux命令的两种方法

    python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...

  5. python学习--python 连接SQLServer数据库(两种方法)

    1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...

  6. Pycharm上python和unittest两种姿势傻傻分不清楚

    前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告:为什么别人运行结果跟我的不一样啊... 这种问题先检查代码,确定是一样的,那就是运行姿势不对了,一旦导入unittes ...

  7. Pycharm上python和unittest两种姿势傻傻分不清楚【转载】

    前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告:为什么别人运行结果跟我的不一样啊... 这种问题先检查代码,确定是一样的,那就是运行姿势不对了,一旦导入unittes ...

  8. Python随机生成验证码的两种方法

    Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法方法一:利用range Python随机生成验证码的方法有很多,今天给大家列举两种 ...

  9. python安装第三方包的两种方式

    最近研究QQ空间.微博的(爬虫)模拟登录,发现都涉及RSA算法.于是需要下一个RSA包(第三方包).折腾了很久,主要是感觉网上很多文章对具体要在哪里操作写得不清楚.这里做个总结,以免自己哪天又忘了. ...

随机推荐

  1. 【mysql的编程专题①】流程控制与其他语法

    流程控制与内置函数,一般用在select的field字段上,或者用在函数,存储过程,触发器中; 如果用在select上就会随着query出来的row来隐式迭代; 注释与语句结束符 语句结束符 默认有两 ...

  2. java代码实现自动登录功能

    通常我们登录某网站,会有选择保存几天,或者是几个星期不用登录,之后输入该网站地址无需登录直接进入主页面,那么这就叫做自动登录,怎么实现呢,下面我以一个小例子来演示一下 登录页面:login.jsp & ...

  3. iOS开发--调试必备 — NSLog

    对于程序的开发者来说,拥有一手强大的DEBUG能力,那就好比在武侠世界中拥有一种强大的内功心法一样,走到哪里都是大写的牛B.在我们DEBUG的时候,大部分情况都是要查看我们的调试日志的,这些打印日志可 ...

  4. Shell最多支持多少个参数

    本文转自:http://www.jb51.net/article/56548.htm   这篇文章主要介绍了Shell最多支持多少个参数?本文是对Shell最多可以输入多少个参数的一篇测试文章,需要的 ...

  5. 65. Valid Number

    题目: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " = ...

  6. 使用phantomjs对页面进行截图

    本文章参考了使用phantomjs操作DOM并对页面进行截图需要注意的几个问题 及 phantomjs使用说明 这两篇文章,初次接触phantomjs的童鞋可以去看下这两篇原文 在学习中可以看下 ph ...

  7. WCF 简单示例

    WCF(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK).WC ...

  8. 如何用Maven创建一个普通Java项目

    一下内容包括:用Maven创建一个普通Java项目,并把该项目转成IDEA项目,导入到IDEA,最后把这个项目打包成一个jar文件. 有时候运行mvn命令失败,重复运行几次就OK了,无解(可能因为网络 ...

  9. maven 仓库下载缓慢,怎么解决

    maven下载jar的时候会去寻国外的地址,因此造成了下载jar很缓慢,影响开发效率,于是就出现maven镜像地址,可以使我们开发人员迅速下载相关的jar. 在maven的config的setting ...

  10. 【C#设计模式——创建型模式】工场方法模式

    工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子 ...