转载:https://blog.csdn.net/qq_15013233/article/details/52527260
摘要

这里将从(pythontesting.net)陆续编译四篇 Python 测试框架的简介,分别为:doctest、unittest、nose 和 pytest。本篇为第三篇:nose

本篇将介绍的 nose 不再是 Python 官方发行版的标准包,但它与 unittest 有着千丝万缕的联系。比如 nose 的口号就是:

扩展 unittest,nose 让测试更简单。

简单在哪


自古(1970)以来,任何标榜“更简单”的工具所使用的手段基本都是隐藏细节,nose 也不例外。nose 不使用特定的格式、不需要一个类容器,甚至不需要 import nose ~(这也就意味着它在写测试用例时不需要使用额外的 api)

前两篇中一直使用的 unnecessary_math.py 的 nose 版测试用例是这样子的:

lang:python
from unnecessary_math import multiply def test_numbers():
assert multiply(3,4)==12 def test_strings():
assert multiply('a',3)=='aaa'

看上去完全就是一个普通的模块文件嘛,甚至连 __main__ 函数都不用。这里唯一需要一点“讲究”的语法在于,测试用例的命名仍需以 test_ 开头。 <br />

运行 nose


nose 在安装的时候也向你 Python 根目录下的 Scripts 文件夹内添加了一个名为 nosetests 的可执行文件,这个可执行文件就是用来执行测试的命令;当然你也仍可以使用 -m 参数来调用 nose 模块:

$ nosetests test.py
$ python -m nose test.py
··
------------------------------------------------
Ran 2 tests in 0.001s OK

另外非常棒的一点是,nosetests 兼容对 doctest 和 unittest 测试脚本的解析运行。如果你认为 nose 比那两个都好用的话,完全可以放弃 doctest 和 unittest 的使用。 <br />

测试环境


由于扩展自 unittest,nose 也支持类似于 setUp() setUpClass() setUpModule() 的测试环境创建方式,只不过函数命名规则最好改一改,我们可以使用更符合 Python 规范的命名规则。另外因为 nose 支持上例中所展示的函数式测试用例,所以还有一种为单个函数创建运行环境的装饰器可用。下面我们将使用一个例子来展示这四种功能的用法。

test.py:

lang:python
from nose import with_setup
from unnecessary_math import multiply def setup_module(module):
print('setup_module 函数执行于一切开始之前') def setup_deco():
print('setup_deco 将用于 with_setup') def teardown_deco():
print('teardown_deco 也将用于 with_setup') @with_setup(setup_deco,teardown_deco)
def test_2b_decorated():
assert multiply(3,4)==12 class TestUM():
def setup(self):
print('setup 方法执行于本类中每条用例之前') @classmethod
def setup_class(cls):
print('setup_class 类方法执行于本类中任何用例开始之前,且仅执行一次') def test_strings(self):
assert multiply('a',3)=='aaa'

运行 $ nosetests -v test.py 结果如下:

test.TestUM.test_strings ... ok
test.test_2b_decorated ... ok ---------------------------------------------------------------------
Ran 2 tests in 0.002s OK

我们的 print() 函数一点东西都没打出来,如果你想看的话,给 nosetests 添加一个 -s 参数就可以了。 <br />

Test Discovery


nose 的 discovery 规则为:

  1. 长得像测试用例,那就是测试用例。路径、模块(文件)、类、函数的名字如果能和 testMatch 正则表达式匹配上,那就会被认为是一个用例。另外所有 unittest.TestCase 的子类也都会被当做测试用例。(这里的 testMatch 可能是个环境变量之类的东西,我没有去查,因为反正你只要以 test_ 开头的格式来命名就可以保证能被发现)
  2. 如果一个文件夹既长得不像测试用例,又不是一个包(路径下没有 __init__.py)的话,那么 nose 就会略过对这个路径的检查。
  3. 但只要一个文件夹是一个包,那么 nose 就一定会去检查这个路径。
  4. 显式避免某个对象被当做测试用例的方法为:给其或其容器添加一个 __test__ 属性,并且运算结果不为 True。并不需要直接指定为 False,只要 bool(__test__) == False 即可。另外,这个属性的添加方式比较特别,确认自己已经掌握使用方法前最好都试试。例如在类里面需要添加为类属性而非实例属性(即不能写在 __inti__(self) 里),否则不起作用。这里因为只是简介,就不挨个试了。(官方文档里就没解释清楚...)

调用 discovery 的语法为,cd 到目录后直接调用 $ nosetests,后面不跟具体的文件名。另外这种方法其实对 unittest 也适用。

Python 各种测试框架简介(三):nose的更多相关文章

  1. Python 各种测试框架简介

    转载:https://blog.csdn.net/yockie/article/details/47415265 一.doctest doctest 是一个 Python 发行版自带的标准模块.本篇将 ...

  2. python pytest测试框架介绍三

    之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例 1.pytest fixture实例1 代码如下 from __future__ import print_f ...

  3. pytest测试框架 -- 简介

    一.pytest测试框架简介: (1)pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效. (2)pytest框架可以兼容unittest用 ...

  4. Pytest测试框架(三):pytest fixture 用法

    xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardown功能的改进.pytest fixture为测试 ...

  5. python主流测试框架的简介

    1.python自动化的一些测试框架 1).unitest(也称为PyUnit)  地址:https://docs.python.org/2/library/unittest.html 2).Nose ...

  6. python pytest测试框架介绍二

    在介绍一中简单介绍了pytest的安装和简单使用,接下来我们就要实际了解pytest了 一.pytest的用例发现规则 pytest可以在不同的函数.包中发现用例,发现的规则如下 文件名以test_开 ...

  7. Assignment3:白盒测试以及测试框架简介

    一. 白盒测试简介       白盒测试又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及 ...

  8. Selenium3+python自动化010-UnitTest框架简介和单元测试框架使用

    一.UnitTest介绍 unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过, ...

  9. Cypress与TestCafe WebUI端到端测试框架简介

    近期接触了Cypress和TestCafe,两个测试框架都基于Node.js,都不再使用Selenium+WebDriver,而且开箱即用,非常轻量级,就冲着不再使用WebDriver这一点,极大地勾 ...

随机推荐

  1. 删除 AP 发票相关脚本

    /* Formatted on 2018/3/15 10:33:14 (QP5 v5.256.13226.35538) */ --发票 CREATE TABLE bak.ap_invoices_all ...

  2. 迭代dict的value

    我们已经了解了dict对象本身就是可迭代对象,用 for 循环直接迭代 dict,可以每次拿到dict的一个key. 如果我们希望迭代 dict 对象的value,应该怎么做? dict 对象有一个 ...

  3. 【CentOS】centos7 稳定使用版本,centos镜像的下载

    命令: cat /etc/redhat-release 下载地址: https://wiki.centos.org/Download 下载版本:

  4. 【Android】开源项目汇总-备用

    from://http://www.eoeandroid.com/home.php?mod=space&uid=765778&do=blog&id=47674 Android开 ...

  5. how to use kvo with swift (怎样在swift中使用kvo)

  6. java初始化ArrayList

    初始化ArrayList我们一般这样写:ArrayList<String> places = new ArrayList<String>();places.add(" ...

  7. SharePoint 2016 工作流报错“没有适用于此应用程序的地址”

    前言 最近为SharePoint 2016配置工作流,创建工作流的过程中遇到这样一个错误,记录分享下来,希望能够为有需要的人带来帮助. 错误截图 创建完毕工作流,发布的时候报错,保存没有问题. 错误信 ...

  8. 哥谭第四季/全集Gotham迅雷下载

    <哥谭>(Gotham)第三季刚刚结束,第四季首集的集名就公布了.<Pax Penguina>这个集名在拉丁语中意味着「Pax Romana」,也就是「罗马式的和平」(Roma ...

  9. [Android Pro] 自己动手编译Android源码(超详细)

    cp from : https://www.jianshu.com/p/367f0886e62b 在Android Studio代码调试一文中,简单的介绍了代码调试的一些技巧.现在我们来谈谈andro ...

  10. Python获取数字的二进制值

    目标 想要获取一个整形数字的二进制表示 bin 内置函数 看一下官方的解释 Convert an integer number to a binary string prefixed with &qu ...