Time will tell.
一、UnitTest启动方式有两种
- python -m unittest xxx.xxx
- unittest.main()
第一种方式是以命令行的方式,也是我们正常执行用例和调试的时候使用的命令。
第二种方式是代码中编排执行测试用例的时候常用的方法。
二、命令行方式
使用命令行方式,首先得了解,这个-m 参数的作用。
官方文档说明了这个参数是按照模块化的方式执行。
几个关键点:
- -m执行对象是一个包,而不是一个.py文件。
- 使用-m的方式执行之后,python会把当前路径加到sys.path中。
- 无法这样执行内建模块
1、-m 执行对象是一个包,而不是一个.py文件。
准确的说,-m执行的是这个包的__main__.py
文件。
例如,新建一个文件夹叫 testmodule,在文件夹中创建__init__.py
, __main__.py
两个文件,在__main__.py
中添加:
print "test"
然后在文件夹上层执行 python -m testmodule,此时输出的内容是:
$ python -m testmodule
test
所以命令行执行 python -m unittest的时候,实际上是执行 unittest 包下的__main__.py
。
# unittest中的源代码
import sys
if sys.argv[0].endswith("__main__.py"):
sys.argv[0] = "python -m unittest"
__unittest = True
from .main import main, TestProgram, USAGE_AS_MAIN
TestProgram.USAGE = USAGE_AS_MAIN
main(module=None)
从这类可以看出来,调用__main__.py
的时候,拿到的是 TestProgram 。从main 中引入的 main,其赋值对象是 main = TestProgram,也就是说,从命令行来运行 unittest 框架,最终运行的类,是 TestProgram。
2、使用-m的方式执行之后,python 会把当前路径加到 sys.path 中。
这点其实非常关键,在测试过程中,经常遇到的问题就是在 pycharm 运行的好好的,但是用命令行执行的时候就经常报错包不存在。
例如这样的结构:
.
|____testmodel
| |______init__.py
| |______main__.py
|____util
| |______init__.py
| |____sum.py
|______init__.py
|____case
| |______init__.py
| |____test.py
在 case 中的test.py
中引用了 util 下面的sum
方法。
import unittest
from util import sum
class TestDemo(unittest.TestCase):
def test_sum(self):
result = sum.sum(1, 2)
self.assertEqual(result, 3)
在根目录下执行就能正常运行
$ python -m unittest case.test.TestDemo.test_sum
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
但是在 case 目录下执行就会报错找不到包。
我们把sys.path
打出来就能看到。
['', '/Library/Python/2.7/site-packages/six-1.12.0-py2.7.egg', '/Library/Python/2.7/site-packages/basedeal-0.0.2-py2.7.egg', '/Library/Python/2.7/site-packages', '/Library/Python/2.7/site-packages/M2Crypto-0.35.2-py2.7-macosx-10.14-intel.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/Library/Python/2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC']
其中的第一个 “” 就是命令所在的目录。如果直接执行python xxx.py
则会将这个文件的路径添加到sys.path
中,这个细微的区别不注意,就会导致经常出现 python 执行的时候经常找不到包。
三、函数方式
代码:
import unittest
something ....
unittest.main()
运行的方法是 unittest 中的 main 方法,跟踪代码可以发现,main()
方法对应的依然是 TestProgram 。这样就找到了
整个测试框架的起点。
可以看到,unittest不同的启动方式,最终走到的地方是一样的。
这里就分享到这么多了,如果你对更多内容、及Python实例练习题、面试题、自动化软件测试感兴趣的话可以加入我们175317069一起学习喔。会有各项学习资源发放,更有行业深潜多年的技术人分析讲解。
最后祝愿你能成为一名优秀的软件测试工程师!
欢迎【评论】、【点赞】、【关注】~
Time will tell.(时间会证明一切)
网友评论