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测试框架全面介绍十一---用例的发现的更多相关文章

  1. python nose测试框架全面介绍十---用例的跳过

    又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...

  2. python nose测试框架全面介绍七--日志相关

    引: 之前使用nose框架时,一直使用--logging-config的log文件来生成日志,具体的log配置可见之前python nose测试框架全面介绍四. 但使用一段时间后,发出一个问题,生成的 ...

  3. python nose测试框架全面介绍六--框架函数别名

    之前python nose测试框架全面介绍二中介绍了nose框架的基本构成,但在实际应该中我们也会到setup_function等一系列的名字,查看管网后,我们罗列下nose框架中函数的别名 1.pa ...

  4. python nose测试框架全面介绍五--attr介绍

    之前写了一系列nose框架的,这篇介绍下attr tag 在nose框架中attr用来标识用例,使得在运行时可以通过标识来执行用例,之前在nose测试框架全面介绍四中有说明,但没有说明清楚,这里再总结 ...

  5. python nose测试框架全面介绍一

    一.简介      nose 是python自带框架unttest的扩展,使测试更简单高效:nose是一个开源的项目,可以在官网上下载源码 1.快速安装 有以下几中安装方式: easy_install ...

  6. python nose测试框架全面介绍四

    四.内部插件介绍 1.Attrib 标记,用于筛选用例 在很多时候,用例可以分不同的等级来运行,在nose中很增加了这个功能,使用attrib将用例进行划分 有两种方式: ef test_big_do ...

  7. python nose测试框架全面介绍三

    三.nose的测试工具集 nose.tools模块提供了一系列的小工具,包括测试执行时间.异常输出及unittest框架中所有的assert功能. 为了使写用例更加容易,nose.tools提供了部分 ...

  8. python nose测试框架全面介绍二

    二.基本使用 nosetest脚本的使用(在安装完nose之后) nosetests [options] [(optional) test files or directories] 我们可以使用配置 ...

  9. python nose测试框架全面介绍十二 ----用例执行顺序打乱

    在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...

随机推荐

  1. sencha touch 目录结构

    1.index.html 整个html 中只加载一个 development.js 2.development.js development.js会根据app.json中的样式和脚本定义来加载样式和脚 ...

  2. URL参数编码

    简单明了区分escape.encodeURI和encodeURIComponent 一.前言讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它 ...

  3. 洛谷 P1162 填涂颜色

    题目链接:https://www.luogu.org/problemnew/show/P1162 题目描述由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要 ...

  4. codevs 2033 邮票

    洛谷 P2725 邮票 Stamps codevs 2033 邮票 题目链接 http://codevs.cn/problem/2033/ https://www.luogu.org/problemn ...

  5. manjaro折腾手记

    以前装过Arch,有点折腾,写了个hello world就卸载了.没用过AUR,甚至也没去了解. 听说manjaro继承Arch,几乎开箱即用,对硬件支持非常好,源里面的软件更新非常快.但是没有装中文 ...

  6. 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别

    STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...

  7. 解决Protobuf生成的C#代码命名不规范问题

    起因 通常使用Protobuf的步骤为 定义 .proto 文件 使用 protoc 生成对应语言的代码 以生成C#代码为例,使用如下命令: protoc -I ../protos --csharp_ ...

  8. python conv2d scipy卷积运算

    scipy的signal模块经常用于信号处理,卷积.傅里叶变换.各种滤波.差值算法等. *两个一维信号卷积 >>> import numpy as np >>> x ...

  9. java 查看SOAP请求报文

    log.info("ESB 请求URL = " + cachedEndpoint.toString());//打印SOAP请求报文 add by LinJC on 20170120 ...

  10. mybatis-plus快速入门使用

    目前正在维护的公司的一个项目是一个ssm架构的java项目,dao层的接口有大量数据库查询的方法,一个条件变化就要对应一个方法,再加上一些通用的curd方法,对应一张表的dao层方法有时候多达近20个 ...