一、为什么使用nose?

  1. 编写测试更容易。 nose可以自动识别继承于unittest.TestCase的测试单元,并执行测试,而且,nose也可以测试非继承于unittest.TestCase的测试单元。nose提供了丰富的API便于编写测试代码。
  2. 执行测试更容易。 只要遵循一些简单的规则去组织你的类库和测试代码,nose是可以自动识别单元测试的。执行测试是非常耗资源的,但是,一段第一个测试模块被加载后,nose就开始执行测试。
  3. 建立测试环境更容易。 
  4. 做你想做的事情更容易。 nose拥有很多内置的插件帮助进行暑输出抓取、错误查找、代码覆盖、文档测试(doctest)等等。同样,如果你不喜欢这些内置插件提供的功能或者这些插件不能满足你的项目结构,你可以自定义开发插件来完成你想要做的事情。

二、基本使用

安装:pip install nose

脚本命令:

nosetests [options] [(optional) test files or directories]

除了使用命令行这种方式之外,还可以在根目录下放置配置文件,配置文件的类型为.noserc或nose.cfg文件。配置文件都是标准的ini内容格式。例如:

[nosetests]
verbosity=3
with-doctest=1

三、扩展使用

nose自动收集单元测试,收集它当前工作目录下的源代码文件、目录以及包。任何的源代码文件、目录或者包只要匹配正则表达式,他们就会被自动收集。包的测试收集按照树的层级级别一级一级进行,因此package.tests、package.sub.tests、package.sub.sub2.tests将会被收集。

匹配成功的包、任何python的源文件都会当做测试用例。

3.1 选择测试用例

将需要 测试的名称 传递给nose的命令行。格式如下:

nosetests only_test_this.py

测试的名称 可以是脚本文件的名称或者模块的名称,也可以使用colon表达式表达的测试名称。路径可以是相对的路径也可以是绝对的路径。如下所示:

nosetests test.module
nosetests another.test:TestCase.test_method
nosetests a.test:TestCase
nosetests /path/to/test/file.py:test_function

同样可以使用-w开关来切换当前的工作路径,从而改变nose查找测试用例的根路径。用法如下:

nosetests -w /path/to/tests

更多关于自定义测试用例的收集与加载方式,可以使用插件的方式做到。

3.2 配置

除了3.1通过脚本命令传递参数的方式外,你还可以在根目录下通过设置setup.cfg或者.noserc或者nose.cfg等配置文件达到同样的目的。例如:

[nosetests]
verbosity=3
with-doctest=1

所有查找到的配置文件将会被加载,而且配置项的值会合并。如果想覆盖标准的配置文件,使用-c选项。

3.3 使用插件

使用pip安装所需要的插件,然后通过nosetests命令行配置插件。执行如下命令验证所安装的插件,

nosetests –plugins

在命令行中添加

-v或者-vv选项可以显示每一个插件的更多信息。 如果通过nose.main()或者nose.run()执行测试,可以将要使用的插件关键字参数的列表传递进去。

3.4  配置选项

-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

开启只收集测试功能。只收集测试用例及输出测试名字,而不执行测试

四、编写测试用例

4.1 项目组织结构

由于nose是自动收集测试用例的,只有nose执行的测试目录下的源代码文件、包名、子目录名跟正则表达式匹配成功后,才能被收集。而且代码是树级层次显示的话,nose会逐级向下查找子目录下的匹配的测试用例。

匹配的正则表达式默认值为:( (?:^|[\\b_\\.-])[Tt]est.所以最好是以Test开头,或者test开头。当然也可以修改默认的匹配的正则表达式。

  所以,推荐的项目结构为:

   为项目单独建一个test包,里面按项目模块分子包,最后以及为 “test_”开头的测试用例源文件。

4.2  测试结果

4.3测试代码

test_mymath.py中的代码如下:

# -*- coding: utf-8 -*-
__author__ = 'Administrator'
from nose.tools import assert_equal
from nose.tools import with_setupimport  unittest
import mymath.math as mmathdef 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_equalfrom  logicOperator.localOperator import  *
def test_logicOper_isGreaterThan():print("=================test_logicOper_isGreaterThan============")result=isGreaterThan(4,3)assert_equal(True,result)

4.4 测试分析

(1)测试用例的收集

由于nose是按照正则表达式自动收集匹配的测试用例。我们这里收集了5个测试用例。分别了

  • test_mymath.py模块里的test_math_add函数。
  • test_mymath.py模块里的test_math3类下面的test_math_square、test_math_sub两个函数。
  • test_mymath.py模块里的test_math2类下面的test_math_multipy函数。
  • test_logicOper.py模块里的test_logicOper_isGreaterThan函数。

(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 函数取名可以是t eardown , 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(测试更简单) .

使用nose进行python自动化测试相关推荐

  1. python自动化测试框架pytest.pdf_Python自动化测试框架

    随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架.只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了开发时间.而且由于这些框架被广泛使用,他们具有很好的 ...

  2. Python自动化测试框架有哪些?

    令开发者万分高兴的是,开发自己的测试框架的日子终于结束了.以前,开发团队接手一个项目并开始开发时,除了项目模块的实际开发之外,他们不得不为这个项目构建一个自动化测试框架.一个测试框架应该具有最佳的测试 ...

  3. 7个实用的Python自动化测试框架

    目录 前言 1.Unittest 2. Doctest 3.pytest 4.Nose 5.tox 6.Unittest2 7.mock unittest. 结语 前言 随着技术的进步和自动化技术的出 ...

  4. 阿里P8连肝一周整理出这份python自动化测试实战PDF

    由于细节内容实在太多啦,也为了不影响各位大大观看,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!总共整理了有282页的PDF文档,有需要的可以查看我文章最后. 整理了一份pyt ...

  5. selenium + python自动化测试环境搭建

    elenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: 免费,也不用再为破解QTP而大伤脑筋 小巧,对于不同的语言它只是一个包 ...

  6. selenium+python自动化测试系列(一):登录

        最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重,为了减轻回归测试的工作量,所以考虑后台 ...

  7. python自动化测试看什么书-《Python自动化测试实战》终于出版!!!

    一.为什么会写这本书 1.系统梳理.可以加深对测试知识体系的系统梳理 2.名气.增加个人的名气,比如:面试时,可以很自豪的说,我是xxxx书的作者 3.利他.帮助有需要的学习者更系统.完备的学习和进阶 ...

  8. 怎么自学python自动化测试-学习自动化测试,如何学习Python语言?

    一.Python常用领域Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件: Python用于系统编程,如开发系统应用: Python用于开发网络爬虫: 有资料奉上,可以看看 ...

  9. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装

    因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...

最新文章

  1. python使用imbalanced-learn的ADASYN方法进行上采样处理数据不平衡问题
  2. 关于CS1061报错(XX不包含XXX的定义,并且找不到类型为XX的第一个参.....)的一种可能的解决的办法...
  3. C# 显式接口成员实现
  4. 你必须知道的Dockerfile
  5. 前端学习(1672):前端系列实战课程之加速减速运动
  6. EWSN 2019 (待续)
  7. 企业数字化新战场:低代码究竟是“毒瘤”还是“良药”?
  8. S5PV210裸机之SD卡
  9. mac: brew的删除
  10. 如何最快速的找到页面某一元素所绑定的点击事件,并查看js代码
  11. python中sendmessage的使用_SendMessage函数完全使用手册
  12. 程序设计语言及其文法
  13. 《流畅的Python第二版》读书笔记——Python数据模型
  14. 新会计准则(New Edition of Accounting Standard)
  15. HTML+css网站设计布局模板
  16. 弘辽科技:淘宝开店类别怎么选择?淘宝开店如何选类目?
  17. 上研动力小课堂丨柴油机启动困难原因大揭秘(上篇)
  18. Tableau图表 | 6、气泡图/树状图/文字云
  19. Arcmap没有Spatial Analyst模块
  20. WPF写入剪切板时报异常

热门文章

  1. 在mac上通过Homebrew安装redis
  2. [分享]方便的 windbg 命令 - !list
  3. python常见的数据类型形式化定义_详解:规整数据(Tidy Data)的理论与Python实践
  4. 机器学习科研助手总结
  5. 字符数组 - 数组名
  6. 统一认证中心-auth2.0
  7. 电子设计中常用的运放电路
  8. 多线程下SOCKET编程
  9. 微信小程序的手机通讯录点击本页面跳转位置的代码详解
  10. STL之容器stack