python nose测试框架全面介绍十一---用例的发现
nose是怎么发现用例的??网上一大把说函数以test开头的都会自动发现,真的是这样吗???还是自己来试验下吧
首先,我们还是来看看官方文档怎么说的吧:
If it looks like a test, it’s a test. Names of directories, modules, classes and functions are compared against the testMatch regular expression, and those that match are considered tests. Any class that is a unittest.TestCase subclass is also collected, so long as it is inside of a module that looks like a test. Files with the executable bit set are ignored by default under Unix-style operating systems–use --exe to allow collection from them, but be careful that is safe to do so. Under Windows, executable files will be picked up by default since there is no executable bit to test. Directories that don’t look like tests and aren’t packages are not inspected. Packages are always inspected, but they are only collected if they look like tests. This means that you can include your tests inside of your packages (somepackage/tests) and nose will collect the tests without running package code inappropriately. When a project appears to have library and test code organized into separate directories, library directories are examined first. When nose imports a module, it adds that module’s directory to sys.path; when the module is inside of a package, like package.module, it will be loaded as package.module and the directory of package will be added to sys.path. If an object defines a __test__ attribute that does not evaluate to True, that object will not be collected, nor will any objects it contains.
什么意思呢?
就是说,
1、查找,只找目录,模块、类及函数,还有以unittest.TestCase继承的子类
2、可执行文件也会查看
3、不找非包形式的目录
来看看,testMatch正则是什么呢,我们来看看nosetests -h
-m REGEX, --match=REGEX, --testmatch=REGEX
Files, directories, function names, and class names
that match this regular expression are considered
tests. Default: (?:^|[\b_\.\-])[Tt]est
从这段可以看出,默认的nose,不是仅仅匹配test开头的,而是包含test字样的文件,文件夹,类名或函数名。
我们来举个例子
#coding:utf-8
'''
Created on 2017年11月1日
@author: huzq
''' from unitest_class_for_nose import yy
class TestClass(): def setUp(self):
print "MyTestClass setup" def tearDown(self):
print "MyTestClass teardown" def Testfunc1(self):
print "this is Testfunc1"
pass def test_func1(self):
print "this is test_func1"
pass def Testfunc2(self):
print "this is Testfunc2"
pass def test_func2(self):
print "this is test_func2"
pass def aaa_test(self):
print "xxxx" def test_io(self): yy().test_yh()
pass class afdfdTest():
def test_aaa(self):
pass
这样一个简单的例子,
默认打出来的是这样的:
nose.config: INFO: Ignoring files matching ['^\\.', '^_', '^setup\\.py$']
test_case.nose_learn_45.TestClass.Testfunc1 ... ok
test_case.nose_learn_45.TestClass.Testfunc2 ... ok
test_case.nose_learn_45.TestClass.aaa_test ... ok
test_case.nose_learn_45.TestClass.test_func1 ... ok
test_case.nose_learn_45.TestClass.test_func2 ... ok
test_case.nose_learn_45.TestClass.test_io ... ok ----------------------------------------------------------------------
Ran 6 tests in 0.003s OK
连aaa_test也出来了,但class afdfdTest里的测试却没有。
再改改脚本,将afdfdTest继承unittest.TestCase
from unittest import TestCase
... class afdfdTest(TestCase):
def test_aaa(self):
pass
再看看执行:
nose.config: INFO: Ignoring files matching ['^\\.', '^_', '^setup\\.py$']
test_case.nose_learn_45.TestClass.Testfunc1 ... ok
test_case.nose_learn_45.TestClass.Testfunc2 ... ok
test_case.nose_learn_45.TestClass.aaa_test ... ok
test_case.nose_learn_45.TestClass.test_func1 ... ok
test_case.nose_learn_45.TestClass.test_func2 ... ok
test_case.nose_learn_45.TestClass.test_io ... ok
test_aaa (test_case.nose_learn_45.afdfdTest) ... ok ----------------------------------------------------------------------
Ran 7 tests in 0.005s OK
这下出来了。
如果你想真只执行以test开头的脚本该怎么做呢?,如下
nosetests -v -s --match="^[Tt]est" nose_learn_45.py --collect-only nose.config: INFO: Ignoring files matching ['^\\.', '^_', '^setup\\.py$']
test_case.nose_learn_45.TestClass.Testfunc1 ... ok
test_case.nose_learn_45.TestClass.Testfunc2 ... ok
test_case.nose_learn_45.TestClass.test_func1 ... ok
test_case.nose_learn_45.TestClass.test_func2 ... ok
test_case.nose_learn_45.TestClass.test_io ... ok
test_aaa (test_case.nose_learn_45.afdfdTest) ... ok ----------------------------------------------------------------------
Ran 6 tests in 0.004s OK
可以看出aaa_test没有出来了。。。。
需要注意的是 --match后面的一定要双引号
So,不要看网上,相信自己的真实看到的就行
更新2020/03/23
在网上看了一个视频说nose默认只能执行以test开头的用例,这又一次让我怀疑自己,再次回来温习这编文章,发现有误解读者的意思,特更新下
发现的规则默认正则表达式是这样的:
(?:^|[\b_\.\-])[Tt]est ?: --- 表示不分组的
^: --- 表示开头
| --- 或
\b_: ----单词和_
\.和\-: ---- 在python函数不支持这二个符号,所以这里意义不大 所以从上面这段正则中可以看出,匹配的是以Test或test开头的、有单词加_的;我们试试
def test_aa():
pass def test_bb():
pass def testff():
pass def aa_test():
pass def aatest():
pass def aatest_aa():
pass
执行结果如下:
[root@ecs-x-medium--linux- bbb]# nosetests -v -s test_qq.py
test_qq.test_aa ... ok
test_qq.test_bb ... ok
test_qq.testff ... ok
test_qq.aa_test ... ok ----------------------------------------------------------------------
Ran tests in .001s
所以网上说的nose只以能test开头或test结果的说法都是错误。应该这么说,以大写T或小写t开头的、或[T|t]est前面带有_的用例都会执行
python nose测试框架全面介绍十一---用例的发现的更多相关文章
- python nose测试框架全面介绍十---用例的跳过
又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...
- python nose测试框架全面介绍七--日志相关
引: 之前使用nose框架时,一直使用--logging-config的log文件来生成日志,具体的log配置可见之前python nose测试框架全面介绍四. 但使用一段时间后,发出一个问题,生成的 ...
- python nose测试框架全面介绍六--框架函数别名
之前python nose测试框架全面介绍二中介绍了nose框架的基本构成,但在实际应该中我们也会到setup_function等一系列的名字,查看管网后,我们罗列下nose框架中函数的别名 1.pa ...
- python nose测试框架全面介绍五--attr介绍
之前写了一系列nose框架的,这篇介绍下attr tag 在nose框架中attr用来标识用例,使得在运行时可以通过标识来执行用例,之前在nose测试框架全面介绍四中有说明,但没有说明清楚,这里再总结 ...
- python nose测试框架全面介绍一
一.简介 nose 是python自带框架unttest的扩展,使测试更简单高效:nose是一个开源的项目,可以在官网上下载源码 1.快速安装 有以下几中安装方式: easy_install ...
- python nose测试框架全面介绍四
四.内部插件介绍 1.Attrib 标记,用于筛选用例 在很多时候,用例可以分不同的等级来运行,在nose中很增加了这个功能,使用attrib将用例进行划分 有两种方式: ef test_big_do ...
- python nose测试框架全面介绍三
三.nose的测试工具集 nose.tools模块提供了一系列的小工具,包括测试执行时间.异常输出及unittest框架中所有的assert功能. 为了使写用例更加容易,nose.tools提供了部分 ...
- python nose测试框架全面介绍二
二.基本使用 nosetest脚本的使用(在安装完nose之后) nosetests [options] [(optional) test files or directories] 我们可以使用配置 ...
- python nose测试框架全面介绍十二 ----用例执行顺序打乱
在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...
随机推荐
- jquery 在线视频
1. jquery 网址 自学视频 http://edu.51cto.com/center/course/lesson/index?id=19292
- vim查找格式
使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个关键字时,想不起来怎么查找“下一个”,于是google之并解决,顺便把有用的都贴过来罢. 查找指令:/xxx 往下查找?xxx 往上 ...
- linux 新建用户、用户组 以及为新用户分配权限(转)
本文转自https://www.cnblogs.com/clicli/p/5943788.html 感谢作者 Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先 ...
- 为什么样本方差分母是n-1
https://blog.csdn.net/qq_39521554/article/details/79633207 为什么样本方差的分母是n-1?为什么它又叫做无偏估计? 至于为什么是n-1,可以看 ...
- Mongodb: Sort operation used more than the maximum 33554432 bytes of RAM
上线许久的产品突然爆出了一个Mongodb 查询的BUG,错误如下: "exception":"org.springframework.data.mongodb.Unca ...
- MFC通过button控制编辑框是否显示系统时间
在dlg.h中public bool flag; 在构造函数中 flag=false; 在button的生成函数中 if(flag) { flag=false; //m_showtime.SetWin ...
- php : 开发记录(2017-03-10)
0.后台 循环N*10000次操作的简单处理 后台需要循环做N*10000次级别的工作时候,比如,发送邮件,推送通知.可以先把所有数据导入数据表(数据库操作所需的时间1~2秒),然后前台循环发送请求, ...
- (原)caffe中的conv
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/10486686.html conv总体调用流程如下图所示: 说明:带o的为输出,如Wo代表输出宽度:带 ...
- mysqldump详解之--master-data
在前一篇文章中,有提到mysqldump的--single-transaction参数.另外还有个很重要,也是运维中经常用到的参数:--master-data,网上很多关于MySQL不停机备份的实现都 ...
- 爬虫破解js加密(一) 有道词典js加密参数 sign破解
在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术. 常见的反爬虫技术有封ip,user_agent,字体库,js加密, ...