作者:HelloGitHub-Prodesire

HelloGitHub 的《讲解开源项目》系列,项目地址:https://github.com/HelloGitHub-Team/Article

一、nose

nose 是一个第三方单元测试框架,它完全兼容 unittest,并且号称是一个更好用的测试框架。

那么 nose 除了具备 unittest 的所有功能外,还具有哪些优势呢?

1.1 用例编写

用例的编写方式除了编写继承于 unittest.TestCase 的测试类外,还可以编写成没有继承的测试类。比如,写成如下形式也会被 nose 视作一个测试类:

from nose.tools import raisesclass TestStringMethods:def test_upper(self):assert 'foo'.upper() == 'FOO'def test_isupper(self):assert 'FOO'.isupper()assert not 'Foo'.isupper()@raises(TypeError)def test_split(self):s = 'hello world'assert s.split() == ['hello', 'world']# check that s.split fails when the separator is not a strings.split(2)

当然,测试类并没有继承 unittest.TestCase,将不能使用其内置的各类 assertXXX 方法,进而导致用例出错时无法获得更加详细的上下文信息。

此外,nose 也支持定义函数来作为测试,这给许多简单的测试场景带来很大的便利:

def test_upper():assert 'foo'.upper() == 'FOO'

1.2 用例发现和执行

unittest 所支持的用例发现和执行能力,nose 均支持。
nose 支持用例自动(递归)发现:

  • 默认发现当前目录下所有包含 test 的测试用例,但不包括以 _ 开头的用例

    • 使用 nosetests 命令
  • 通过 -w 参数指定要自动发现的目录, -m 参数指定用例文件、目录、函数、类的名称模式(正则匹配)
    • nosetests -w project_directory "test_.+"

nose 也支持执行指定用例:

  • 指定测试模块

    • nosetests test.module
  • 指定测试类
    • nosetests a.test:TestCase
  • 指定测试方法
    • nosetests another.test:TestCase.test_method
  • 指定测试文件路径
    • nosetests /path/to/test/file.py
  • 指定测试文件路径+测试类或测试函数(这是 unittest 所不支持的)
    • nosetests /path/to/test/file.py:TestCase
    • nosetests /path/to/test/file.py:TestCase.test_method
    • nosetests /path/to/test/file.py:test_function

1.3 测试夹具(Fixtures)

nose 除了支持 unittest 所支持的定义测试前置和清理方式,还支持一种更为简单的定义方式:

def setup_func():"set up test fixtures"def teardown_func():"tear down test fixtures"@with_setup(setup_func, teardown_func)
def test():"test ..."

只需定义两个函数用来表示前置和清理方法,通过 nose.tools.with_setup 装饰器装饰测试函数,nose 便会在执行测试用例前后分别执行所定义的前置和清理函数。

1.4 子测试/测试生成器

nose 除了支持 unittest 中的 TestCase.subTest,还支持一种更为强大的子测试编写方式,也就是 测试生成器(Test generators),通过 yield 实现。

在下面的示例中,定义一个 test_evens 测试函数,里面生成了 5 个子测试 check_even

def test_evens():for i in range(0, 5):yield check_even, i, i*3def check_even(n, nn):assert n % 2 == 0 or nn % 2 == 0

此外,相较于 unittest.TestCase.subTest 多个子测试只能执行一次测试前置和清理,nose测试生成器 可以支持每个子测试执行一次测试前置和清理,如:

def test_generator():# ...yield func, arg, arg # ...@with_setup(setup_func, teardown_func)
def func(arg):assert something_about(arg)

1.5 插件体系

nose 相较于 unittest 一个最大的优势就是插件体系,自带了很多有用的插件,也有丰富的第三方插件。这样就能做更多的事情。

其中,自带插件如下:

  • AllModules:在所有模块中收集用例
  • Attrib:给用例打标签,并可运行含指定标签的用例
  • Capture:捕获用例的标准输出
  • Collect:快速收集用例
  • Cover:统计代码覆盖率
  • Debug:用例失败时进入 pdb 调试
  • Deprecated:标记用例为弃用
  • Doctests:运行文档用例
  • Failure Detail:断言失败时提供上下文信息
  • Isolate:保护用例避免受一些副作用的影响
  • Logcapture:捕捉 logging 输出
  • Multiprocess:并行执行用例
  • Prof:使用热点分析器进行分析
  • Skip:标记用例为跳过
  • Testid:为输出的每个用例名称添加测试 ID
  • Xunit:以 xunit 格式输出测试结果

而第三方库则多种多样,如用来生成 HTML 格式测试报告的 nose-htmloutput 等,这里不再一一列出。

得益于 nose 丰富的插件生态,当 nose 本身不能够完全满足我们的测试需求时,可以通过安装插件,并在 nosetests 命令行指定该插件所提供的特定参数即可非常容易的使用插件。
相较于 unittest,就能省去很多自己开发额外测试逻辑的精力。

二、nose2

nose2 是 nose 的继任者。
它们的理念都是让编写和运行测试用例变得更容易。

它们有很多相同点,比如都兼容 unittest,支持使用函数作为测试用例,支持子测试,拥有插件体系。但也有很多不同点,下面列出一些主要的不同点:

  • 发现和载入测试

    • nose 自行实现了模块加载功能,使用惰性方式加载测试模块,加载一个执行一个。
    • nose2 则借助内建的 import() 导入模块,并且是先全部载入,再执行用例
    • nose2 并不支持 nose 所支持的所有测试用例项目结构,比如如下用例文件的结构在 nose2 中就不受支持:
.
`-- tests|-- more_tests|   `-- test.py`-- test.py
  • 测试前置和清理函数级别

    • nose 支持方法、类、模块和包级别的测试前置和清理函数
    • nose2 则不支持包级别的测试前置和清理函数
  • 子测试
    • nose2 除了支持使用测试生成器来实现子测试外,还支持使用参数化测试(Parameterized tests)来实现子测试
    • nose2 除了像 nose 一样支持在测试函数和测试类(不继承于 unittest.TestCase)中支持参数化测试和测试生成器外,还支持在继承于 unittest.TestCase 的测试类中使用
  • 配置化
    • nose 期望所有插件的配置通过命令行参数进行配置
    • nose2 则通过配置文件进行控制,以最小化命令行参数让人读得更舒服

更多对比详见 官方文档。

三、小结

nosenose2 在做到兼容 unittest 上就足以看出它们的目标,那便是要吸引原来那些使用 unittest 的用户来使用它们。它们确实做到了!

nosenose2 在用例编写、测试夹具、子测试上做出改进,已经能让日常用例编写工作变得更加容易和灵活。同时又引入插件体系,进一步将单元测试框架的能力提升了一个大大的台阶,这让很多在基础测试功能之上的高阶功能的实现和共享成为了可能。也难怪有众多开发者对它们情有独钟。


『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~

转载于:https://www.cnblogs.com/xueweihan/p/11529101.html

聊聊 Python 的单元测试框架(二):nose 和它的继任者 nose2相关推荐

  1. python 单元测试_聊聊 Python 的单元测试框架(一):unittest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest. ...

  2. pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...

  3. python split()方法_聊聊 Python 的单元测试框架(一):unittest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest. ...

  4. 聊聊 Python 的单元测试框架(一):unittest

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. python单元测试框架-Python unittest单元测试框架总结

    什么是单元测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对于函数abs(),我们可以编写的测试用例为: (1)输入正数,比如1.1.2.0.99,期待返回值与输入 ...

  6. Python自动单元测试框架

    软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作.既然如此,为什么不让程序员在编写软 ...

  7. python自动化测试-【自动化测试】Python - unittest单元测试框架

    一.测试模型 下面这部分来自于某书籍资料,拿过来,按需参考一下: 测试模型 (1)线性测试 1.概念: 通过录制或编写对应应用程序的操作步骤产生的线性脚本.单纯的来模拟用户完整的操作场景.(操作,重复 ...

  8. Python热门单元测试框架对比:pytest和unittest还傻傻分不清楚?

    前言 对于我们测试来说,做自动化测试需要编写测试用例,编写测试用例就会使用到单元测试模块,常见的python单元测试模块有unittest,pytest,nose等,但是听说过最多的也就属于pytes ...

  9. Python - unittest单元测试框架(全)

    一.简介 1.unittest的作用 unittest是Python内置的单元测试框架,主要用于单元测试,具备编写用例.组织用例.执行用例.输出报告等作用. 2.单元测试框架的优点 单元测试是通过一段 ...

最新文章

  1. 致命错误:没有用于主机192.168.1.112,用户postgres
  2. python3环境下“No module named nibabel”的解决办法
  3. linux系统利用可执行文件的Capabilities实现权限提升
  4. 不同层级的Java开发者的不同行为
  5. JRebel 代理激活
  6. vista装不了SQL SERVER
  7. Java黑皮书课后题第8章:*8.22(偶数个1)编写一个程序,产生一个6*6的填满0和1的二维矩阵,显示该矩阵,检测是否每行以及每列中有偶数个1
  8. 一行Python代码
  9. 不止代码:友好城市(动态规划)
  10. oracle走当前时间分区,Oracle分区使用波斯日历的时间间隔
  11. Windows平台下kafka环境的搭建
  12. 安全狗结合服云,网络管理倍儿轻松
  13. LoadRunner函数中文翻译
  14. 基于arduino ws2812b简单的渐变代码
  15. HTML5+CSS网页设计概述
  16. 基于STM32cubemx的STM32F107vct6的代码生成,实验四串口与DMA
  17. speedoffice(表格)怎么插入文本框?
  18. 杨韬的Markdown自定义CSS样式
  19. 基于MySQL 数据库的审计设计方案
  20. php gd imageaffine

热门文章

  1. php向数据库 插入图片,php-向/从MySQL数据库插入/查看图像
  2. data 谷歌浏览器更改user 路径_chrome修改默认用户目录
  3. android 控件随手指移动_Android 实习生面试经历记录
  4. build openni with gcc 7
  5. 【matlab】元胞数组(使用celldisp显示元胞数组)
  6. java设置子线程优先级_Java 实例 - 线程优先级设置
  7. 动手学深度学习Pytorch Task08
  8. YOLOX目标检测模型Keras实现,超越Yolov5
  9. 如何利用用户业务行为画像,做套餐与用户之间个性化智能匹配模型?
  10. 浅谈今日头条关键词下拉词框优化推广的优势