美文网首页
带你从零理解UnitTest测试框架(1)

带你从零理解UnitTest测试框架(1)

作者: 白码会说 | 来源:发表于2020-11-16 22:17 被阅读0次

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.(时间会证明一切)

相关文章

网友评论

      本文标题:带你从零理解UnitTest测试框架(1)

      本文链接:https://www.haomeiwen.com/subject/juctiktx.html