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测试框架全面介绍十二 ----用例执行顺序打乱
在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...
随机推荐
- Node_初步了解(2)
1. windown下 npm 升级: npm install npm -g 2. Node.js事件驱动模型:设计模型——观察者模型. 3. node.js全局变量:global 4. node.j ...
- Compile groovy mixed with java in Maven
Assuming that groovy codes are in src/main/groovy and java codes are in src/main/java. We can use 2 ...
- 基于SOUI开发一个简单的小工具
基于DriectUI有很多库,比如 Duilib (免费) soui (免费) DuiVision (免费) 炫彩 (界面库免费,UI设计器付费,不提供源码) skinui (免费使用,但不开放源码, ...
- 解析 ViewTreeObserver 源码(上)
主要内容:ViewTreeObserver 是被用来注册监听视图树的观察者,在视图树发生全局改变时将收到通知.本文从 ViewTreeObserver 源码出发,带你剖析 ViewTreeObserv ...
- 【ASP.NET Core】从向 Web API 提交纯文本内容谈起
前些时日,老周在升级“华南闲肾回收登记平台”时,为了扩展业务,尤其是允许其他开发人员在其他平台向本系统提交有关肾的介绍资料,于是就为该系统增加了几个 Web API. 其中,有关肾的介绍采用纯文本方式 ...
- WPF 实现窗体拖动
C# 实现代码 this.Loaded += (r, s) => { this.MouseDown += (x, y) => { if (y.LeftButton == MouseButt ...
- WPF 模板绑定父级控件内容
WPF 模板绑定父级控件内容 <Style TargetType="Button" x:Key="btn"> <Setter Property ...
- n2n的编译和运行、配置
交叉编译: cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake -build ./ ../ 1.n2n 基于p ...
- angularjs $$phase
https://segmentfault.com/q/1010000000738004/a-1020000000738812 $$phase 是 angluar 内部使用的状态标志位,用于标识当前是否 ...
- mysql百分比显示
select doll_name, type, value concat( left(get /(get+ fall)*100, 5), '%') as 抓取概率 from doll_conf