安装:pip install nosehtml
脚本命令:python
nosetests [options] [(optional) test files or directories]正则表达式
除了使用命令行这种方式以外,还能够在根目录下放置配置文件,配置文件的类型为.noserc或nose.cfg文件。配置文件都是标准的ini内容格式。例如:python3.x
[nosetests] verbosity=3 with-doctest=1
nose自动收集单元测试,收集它当前工做目录下的源代码文件、目录以及包。任何的源代码文件、目录或者包只要匹配正则表达式,他们就会被自动收集。包的测试收集按照树的层级级别一级一级进行,所以package.tests、package.sub.tests、package.sub.sub2.tests将会被收集。函数
匹配成功的包、任何python的源文件都会当作测试用例。单元测试
将须要测试的名称传递给nose的命令行。格式以下:测试
nosetests only_test_this.pyui
测试的名称能够是脚本文件的名称或者模块的名称,也可使用colon表达式表达的测试名称。路径能够是相对的路径也能够是绝对的路径。以下所示:this
nosetests test.module
nosetests another.test:TestCase.test_method
nosetests a.test:TestCase
nosetests /path/to/test/file.py:test_function
一样可使用-w开关来切换当前的工做路径,从而改变nose查找测试用例的根路径。用法以下:spa
nosetests -w /path/to/tests
更多关于自定义测试用例的收集与加载方式,可使用插件的方式作到。
除了3.1经过脚本命令传递参数的方式外,你还能够在根目录下经过设置setup.cfg或者.noserc或者nose.cfg等配置文件达到一样的目的。例如:
[nosetests] verbosity=3 with-doctest=1
全部查找到的配置文件将会被加载,并且配置项的值会合并。若是想覆盖标准的配置文件,使用-c选项。
使用pip安装所须要的插件,而后经过nosetests命令行配置插件。执行以下命令验证所安装的插件,
nosetests –plugins
在命令行中添加
-v或者-vv选项能够显示每个插件的更多信息。 若是经过nose.main()或者nose.run()执行测试,能够将要使用的插件关键字参数的列表传递进去。
-V,—version
输出nose的版本
-p,—plugins
输出可获取的插件列表。
-v=DEFUALT,—verbose=DEFAULT
使用更多的verbose
--verbosity=VERBOSITY
设置verbosity;--verbosity=2与-v设置一致
-q,—quiet=DEFAULT
使用更少的verbose
-c=FILES,—config=FILES
设置配置文件。能够设置不少次,而后将全部的配置文件合并。
-w=WHERE,--where=WHERE
设置查找的根目录。
-py3where=WHERE
顾名思义,针对python3.x以上设置查找路径。
-m=REGEX,--match=REGEX,—testmatch=REGEX
设置用于自动化收集用例的正则表达式。
--tests=NAMES
执行这些测试。
--debug-log=FILE
设置调试的日志文件路径。
--logging-config=FILE,—log-config=FILE
设置日志文件的配置文件。
-I=REGEX,—ignore-files=REGEX
设置自动收集测试用例时忽略的正则表达式。
-e=REGEX,—exclude=REGEX
排除要执行的测试用例的正则表达式
-i=REGEX,—include=REGEX
包含要执行的测试用例的正则表达式
-x,—stop
执行测试发生错误后,中止执行测试。
--noexe
不查找能够执行文件。
-a=ATTR,--attr=ATTR
只执行包含ATTR属性的测试用例。
-A=EXPR,—eval-attr=EXPR
只执行属性与EXPR匹配的测试用例。
-s,—nocapture
不抓取标准输出(stdout)
--nologcapture
禁止使用日志插件
--logging-format=FORMAT
打印语句的自定义格式
--logging-datefmt=FORMAT
日志的日期时间格式
--logging-filter=FILTER
日志语句的过滤器。
--logging-clear-handlers
清除日志的其余handlers
--logging-level=DEFUALT
设置日志的等级
--with-coverage
开启coverage插件
--cover-package=PACKAGE
限定coverage所在包
--cover-erase
在执行以前 清除上次coverage统计结果
--cover-testes
在coverage报告中包含测试模块
--cover-html
产生html的coverage报告
--cover-html-dir=DIR
设置存储html的目录
--cover-xml
产生xml的coverage报告
--cover-xml-file=FILE
设置存储coverage报告的xml文件
--cover-config-file=DEFUALT
设置coverage的配置文件
-pdb
当测试失败或产生错误是进入调试模式
--pdb-failures
当测试失败时进入调试模式
--pdb-errors
当测试产生错误时进入调试模式
--with-doctest
开启doctest插件
--doctest-tests
在测试模块中查询doctests
--with-profile
开启profile插件
--profile-sort=SORT
设置profiler 输出排序
--profile-stats-file=FILE
设置统计所在的文件地址
--with-id
开启TestId插件
--processes=NUM
开始测试处理器的个数
--processes-timeout=SECONDS
设置超时时间。
--with-xuint
开始Xunit插件
--xuint-file=FILE
设置XUnit报告所在的xml文件
--all-modules
开启AllModules插件
--collect-only
开启只收集测试功能。只收集测试用例及输出测试名字,而不执行测试
因为nose是自动收集测试用例的,只有nose执行的测试目录下的源代码文件、包名、子目录名跟正则表达式匹配成功后,才能被收集。并且代码是树级层次显示的话,nose会逐级向下查找子目录下的匹配的测试用例。
匹配的正则表达式默认值为:((?:^|[\\b_\\.-])[Tt]est.因此最好是以Test开头,或者test开头。固然也能够修改默认的匹配的正则表达式。
因此,推荐的项目结构为:
为项目单独建一个test包,里面按项目模块分子包,最后以及为 “test_”开头的测试用例源文件。
4.2 测试结果
test_mymath.py中的代码以下:
# -*- coding: utf-8 -*- __author__ = 'Administrator' from nose.tools import assert_equal from nose.tools import with_setup import unittest import mymath.math as mmath def setUp(): print("============test math module setup==============") def teardown(): print("============test math module teardown==============") def test_math_add(): result=mmath.add(4, 5) print("================test_math_add============") assert_equal(10, result) class test_math3(): def setUp(self): print("============test math class setup==============") def teardown(self): print("============test math class teardown==============") def test_math_square(self): print("=============== test_math_square================ ") assert_equal(9, mmath.square(3)) def test_math_sub(self): print("=============== test_math_sub================ ") assert_equal(1, mmath.sub(3, 2)) class test_math2(unittest.TestCase): def test_math_multipy(self): print("=============== test_math_multipy================ ") assert_equal(8, mmath.multiply(2, 4))
test_logicOper.py 中的代码以下:
# -*- coding: utf-8 -*- __author__ = 'Administrator' from nose.tools import assert_equal from logicOperator.localOperator import * def test_logicOper_isGreaterThan(): print("=================test_logicOper_isGreaterThan============") result=isGreaterThan(4,3) assert_equal(True,result)
(1)测试用例的收集
因为nose是按照正则表达式自动收集匹配的测试用例。咱们这里收集了5个测试用例。分别了
(2)测试的运行顺序。
从下图打印输出的结果能够看出。收集的测试用例的执行顺序test_logicOper_isGreaterThan—>test_mymath(模块).setup—>test_math2(类).test_math_multipy—>test_math3(类).setup—>test_math3(类).test_math_square—>
test_math3(类).teardown—>test_math3(类).setup—>test_math3(类).test_math_sub—>test_math3(类).teardown—>test_mymath(模块).test_math_add—>test_mymath(模块).teardown.
大致能够得出以下结论:
1)测试的顺序整体上按照包—>模块—>类的顺序进行;
2) 而后按照测试用例名称的升序排序进行,好比test_math_multipy比test_math_square先执行;
3)当测试模块中既包含测试函数,又包含测试类时,都必定是先执行setup(若是定义了),模块测试执行完毕后执行teardown(若是定义了)。并且模块的setup、setdown只执行一次。
4)测试类中的每一个测试方法执行前先执行setup(若是定义了),执行完毕后执行teardown(若是定义了)。并且每一个测试方法的执行过程都是如此,新的方法从新按setup—>执行方法—>teardown的顺序执行。
(3)关于setup 、teardown
package、module、class均可以设置setup、teardown。
1)package的setup 、teardown的设置
放在__init__.py文件中,在整个测试的运行期间只运行一次。
setup函数的取名能够是 setup, setup_package, setUp, setUpPackage中的一个。
teardown 函数取名能够是teardown, teardown_package, tearDown or tearDownPackage中的一个。
2) module的setup 、teardown的设置
在整个测试的运行期间只运行一次。
setup函数的取名能够是 setup, setup_module, setUp or setUpModule中的一个。
teardown 函数取名能够是teardown_module, or tearDownModule中的一个。
3)class的setup 、teardown的设置
每一个测试方法执行时都会调用。
setup函数的取名能够是setup_class, setupClass, setUpClass, setupAll ,setUpAll中的一个。
teardown 函数取名能够是teardown_class, teardownClass, tearDownClass, teardownAll ,tearDownAll中的一个。
测试类能够继承unittest.TestCase ,也能够不继承,nose都能识别。
4)测试方法的setup、teardown
能够经过with_setup装饰器进行设置,好比
总之,nose的口号是:nose extends unittest to make testing easier(测试更简单).