本篇将介绍的 nose 再也不是 Python 官方发行版的标准包,但它与 unittest 有着千丝万缕的联系。好比 nose 的口号就是:python
扩展 unittest,nose 让测试更简单。正则表达式
自古(1970)以来,任何标榜“更简单”的工具所使用的手段基本都是隐藏细节,nose 也不例外。nose 不使用特定的格式、不须要一个类容器,甚至不须要 import nose
~(这也就意味着它在写测试用例时不须要使用额外的 api)api
前两篇中一直使用的 unnecessary_math.py 的 nose 版测试用例是这样子的:函数
lang:python from unnecessary_math import multiply def test_numbers(): assert multiply(3,4)==12 def test_strings(): assert multiply('a',3)=='aaa'
__main__
函数都不用。这里惟一须要一点“讲究”的语法在于,测试用例的命名仍需以 test_
开头。 <br /> ##运行 nosenose 在安装的时候也向你 Python 根目录下的 Scripts 文件夹内添加了一个名为 nosetests 的可执行文件,这个可执行文件就是用来执行测试的命令;固然你也仍可使用 -m
参数来调用 nose 模块:工具
$ nosetests test.py $ python -m nose test.py ·· ------------------------------------------------ Ran 2 tests in 0.001s OK
因为扩展自 unittest,nose 也支持相似于 setUp() setUpClass() setUpModule()
的测试环境建立方式,只不过函数命名规则最好改一改,咱们可使用更符合 Python 规范的命名规则。另外由于 nose 支持上例中所展现的函数式测试用例,因此还有一种为单个函数建立运行环境的装饰器可用。下面咱们将使用一个例子来展现这四种功能的用法。测试
test.py:code
lang:python from nose import with_setup from unnecessary_math import multiply def setup_module(module): print('setup_module 函数执行于一切开始以前') def setup_deco(): print('setup_deco 将用于 with_setup') def teardown_deco(): print('teardown_deco 也将用于 with_setup') @with_setup(setup_deco,teardown_deco) def test_2b_decorated(): assert multiply(3,4)==12 class TestUM(): def setup(self): print('setup 方法执行于本类中每条用例以前') @classmethod def setup_class(cls): print('setup_class 类方法执行于本类中任何用例开始以前,且仅执行一次') def test_strings(self): assert multiply('a',3)=='aaa'
运行 $ nosetests -v test.py
结果以下:对象
test.TestUM.test_strings ... ok test.test_2b_decorated ... ok --------------------------------------------------------------------- Ran 2 tests in 0.002s OK
print()
函数一点东西都没打出来,若是你想看的话,给 nosetests 添加一个 -s
参数就能够了。 <br /> ##Test Discoverynose 的 discovery 规则为:ip
testMatch
正则表达式匹配上,那就会被认为是一个用例。另外全部 unittest.TestCase
的子类也都会被当作测试用例。(这里的 testMatch
多是个环境变量之类的东西,我没有去查,由于反正你只要以 test_
开头的格式来命名就能够保证能被发现)__init__.py
)的话,那么 nose 就会略过对这个路径的检查。__test__
属性,而且运算结果不为 True
。并不须要直接指定为 False
,只要 bool(__test__) == False
便可。另外,这个属性的添加方式比较特别,确认本身已经掌握使用方法前最好都试试。例如在类里面须要添加为类属性而非实例属性(即不能写在 __inti__(self)
里),不然不起做用。这里由于只是简介,就不挨个试了。(官方文档里就没解释清楚...)调用 discovery 的语法为,cd 到目录后直接调用 $ nosetests
,后面不跟具体的文件名。另外这种方法其实对 unittest 也适用。文档