nose/nosetests,按照匹配规则收集测试 – [ 先收集,再执行 ]
1、安装:
pip install nose
2、匹配:
a. Test/test 开头的文件、类名、方法名
b. **_Test/test** 的文件、类名、方法名
3、执行:【-s:执行并捕获输出,-q:简易模式,-v:详细模式,查看运行信息和调试信息】
运行所有:nosetests
运行单个测试文件:nosetests test_1001.py
运行整个包:nosetests test_case
运行某个模块:nosetests test_case.test_1002
运行某个case:nosetests test_case.test_1002:test_01_xx
运行不同模块下的不同case:nosetests --tests=test_case.test_1001:test_01_xx,test_case.test_1002:test_02_xx
4、工具nost.tools的使用:from nose.tools import nottest, istest
@nottest:不测试的case
@istest:指定为测试case,被修饰的方法无需匹配命名规则,也可被收集执行
5、setup和teardown:
setup() | tearadown()
:放在__init__.py中,整个测试运行期间只执行一次setup_module() | teardown_module()
def setup_module(module):
...
def teardown_module(module):
...
setup_class() | teardown_class()
@classmethod
def setup_class(cls):
...
@classmethod
def teardown_class(cls):
...
def setup(self): ... | def teardown(self): ...
from nose import with_setup
def my_setup_func():
...
def my_teardown_func():
...
@with_setup(my_setup_func, my_teardown_func)
def test_01_xx():
6、标记执行——attr:
from nose.plugins.attrib import attr
# 使用attr标记case
@attr(tag="one")
def test_01(): ...
@attr("all")
def test_02(): ...
# 执行
nosetests -a tag=one
nosetests -a tag=one -a all # or ,case 匹配到一个attr就可运行
nosetests -a tag=one,all # and,case 必须同时匹配到两个attr才能够被执行到
7、测试报告:【支持html和allure】
插件:`pip install nose-html-reporting` 【注意:要兼容中文,需要修改nose-html-reporting,编码格式改为utf-8】
执行:`nosetests --with-html --html-report=index.html`
8、nose参数化:
插件:`pip install nose-parameterized`
使用:
from parameterized import parameterized
@parameterized.expand([ ("01", 1, 2, 3),
("02", 2, 3, 4),
("03", 3, 4, 5),
])
def test_01_xx(name, a, b, c):
...
运行:
nosetests test_01.py
nosetests test_01.py:TestA1 . test_01_xx_0 ---> 单独运行
nosetests test_01.py:TestA1 . test_01_xx_1
nosetests test_01.py:TestA1 . test_01_xx_2
9、nose并发运行:
命令:`nosetests --process=5 --process-timeout=10`
--process:指定并发数量
--process-timeout:设置超时时间
注意:如果存在所有case之 前/后 运行一次的setup 和 teardown,并行执行会失效【eg:存在setup_class() 和 teardown_class()】,并发会失效;没有class时,setup() 和 teardown() 是module级别的,并发也会失效。
但是,如果有class,class中的setup(self) 和 teardown(self) 是不影响并发执行的。
10、失败运行模式:
使用:`nosetests --failed`
这样运行会记录失败的case,再次运行命令时,会只执行上次失败的case。使用--failed激活此模式。
11、pdb模式:
使用:`nosetests --pdb`
12、nose跳过测试:
使用方法:
from nose.plugins.skip import SkipTest
def test_01():
raise SkipTest
13、nosetests可以直接运行unittest的case
14、其他常用命令:
-q:与-v相对,简易模式
-w WHERE:在这个目录中查找测试
-m REGEX:匹配这个正则表达式的文件、目录、class、function进行测试
--tests=NAMES:运行多个case [ 是以逗号分隔的list ]
-x:在第一个error/failed后停止运行测试
--nologcapture:禁用日志记录捕获插件,日志记录将保持不变
--with-coverage:启用覆盖率插件
--cover-erase:运行前清除之前收集的覆盖率统计信息
--cover-html:产生html覆盖率信息
--cover-html-dir=DIR:在目录中生成html覆盖率信息
--no-skkip:禁用SkipTest异常的特殊处理
--collect-only:收集和输出测试名称,只收集,不执行测试