目录

扩展阅读

Python Mock的入门

Openstack 的单元测试工具

  • unittest: 是 Python 的标准库,提供了最基本的单元测试功能,包括 单元测试运行器(简称runner)单元测试框架。项目的单元测试代码的测试类可以继承 unittest.TestCase 类,那么这个类就能够被 runner 发现并且执行。同时, unittest.TestCase 这个类还定义了 setUp() , tearDown() , setUpClass() 和 tearDownClass() 方法,是用来运行 单元测试前的设置工作代码单元测试后的清理工作代码,可以使用 $ python -m unittest test_module 的命令来执行某个模块的单元测试。

  • mock: 用来模拟对象的行为,这样在进行单元测试的时候,可以指定任何对象的返回值,便于测试对外部接口有依赖的代码(导入型代码)。

  • testtools: 是个 unittest 的扩展框架,主要是在 unittest 的基础上提供了更好的 assert 功能,使得写单元测试更加方便。

  • fixtures: 的意思是固定装置,在 Python 的单元测试中,是指某段可以复用的单元测试 setUp() 和 tearDown() 代码组合。一个 fixture 一般用来实现某个组件的 setUp() 和 tearDown() 逻辑,比如: 测试前要先创建好某些数据,测试后要删掉这些数据,这些操作就可以封装到一个 fixture 中。这样不同的测试用例就不用重复写这些代码,只要使用 fixture 即可。fixtures 模块是一个第三方模块,提供了一种简单的创建 fixture 类和对象的机制,并且也提供了一些内置的 fixture。

  • testscenarios: 模块满足了场景测试的需求。它的基本用法是在测试类中添加一个类属性 scenarios ,该属性是一个元组,定义了每一种不同的场景下都会不同的变量值。比如说你测试一段数据访问代码,你需要测试该代码在使用不同的驱动时(MongoDB/MySQL/File)是否都能正常工作。最好的办法就是使用 testscenarios 模块,定义好会应场景而改变的 scenarios 变量,然后实现一个测试用例方法。testscenarios 模块在 OpenStack Ceilometer 中被大量使用。

  • subunit: 是一个用于传输单元测试结果的流协议。一般来说,运行单元测试的时候是把单元测试的结果直接输出到标准输出,但是如果运行大量的测试用例时,这些大量的测试结果将难以被分析。因此使用 python-subunit 模块来运行测试用例,并且把测试结果通过 subunit 协议输出,这样测试结果就可以被分析工具聚合并且分析。python-subunit 模块也自带了一些分析工具用来解析 subunit 协议,比如:$ python -m subunit.run test_module | subunit2pyunit , subunit2pyunit 指令会解析 subunit 协议,并且将结果输出到标准输出。

  • testrepository: 用于管理单元测试用例, 当一个项目中的测试用例很多时,如何更有效的处理单元测试用例的结果就变得很重要。testrepository 会使用 python-subunit 模块来运行测试用例,然后分析 subunit 协议的输出并将测试结果记录到本地文件. testrepository 能够让你:

    • 知道哪些用例运行时间最长
    • 显示运行失败的用例
    • 重新运行上次运行失败的用例
  • coverage: 是用来计算代码运行时的覆盖率的,也就是统计多少代码被执行了。它可以和testrepository一起使用,用来统计单元测试的覆盖率,在运行完单元测试之后,输出覆盖率报告。

  • tox: tox是用来管理和构建虚拟环境(virtualenv)的。对于一个项目,我们需要运行Python 2.7的单元测试,也需要运行Python 3.4的单元测试,还需要运行PEP8的代码检查。这些不同的任务需要依赖不同的库,所以需要使用不同的虚拟环境。使用tox的时候,我们会在tox的配置文件 tox.ini 中指定不同任务的虚拟环境名称,该任务在虚拟环境中需要安装哪些包,以及该任务执行的时候需要运行哪些命令。 tox 是本篇博文主要的研究对象, 所以我们会在下文继续深入的记录 tox 的具体内容.

单元测试工具使用流程

  • 首先使用 unittest, mock, testtools, fixtures, testscenarios 等工具和模块来编写单元测试用例
  • 然后使用 tox 来管理单元测试运行时的虚拟环境
  • tox 再调用 testrepository 来管理这些测试用例
  • 其中 testrepository 会调用 subunit 来执行测试用例, 并且一同聚合和分析测试结果
  • 然后 testrepository 调用 coverage 来执行代码覆盖率的计算

当我们执行 tox -e py27 时就是开始项目的单元测试, tox 首先会读取项目根目录下的 tox.ini 文件(/opt/stack/keystone/tox.ini ), 然后根据该文件来构建出相应的虚拟环境, 并将该虚拟环境保存在 .tox/ 目录下(以环境的名称来命名).

fanguiju@fanguiju:/opt/stack/keystone/.tox$ ls
log pep8 py27

除了 log 之外的 py27/pep8 都是 virtualenv 环境.

tox

一般 openstack 项目中的 tox 的功能包含了: 打源码包(sdist)、单元测试(UT)、测试覆盖率(coverage)、代码格式检查(pep8,flake) 等功能.

tox 的官方对于 tox 的定义是这样的: 一个通用的虚拟环境管理和测试命令行工具。其中的虚拟环境, 相信使用过 virtualenv 的开发者来说都不会陌生, tox 能够让我们在同一个 Host 上自定义出多套相互独立且隔离的 Python 环境, 所套虚拟环境中可能使用了不同的 Python 拦截器/环境变量设置/第三方依赖包/… 所以 tox 最典型的应用就是用于测试 Python 程序的兼容性了.

tox.ini

[tox]
minversion = 1.6
skipsdist = True
envlist = py27,pep8,com
# envlist 表示 tox 中配置的环境都有哪些 [testenv]
# testenv 是默认配置,如果某个环境自身的 section 中没有定义这些配置, 那么就从这个 section 中读取 setenv = VIRTUAL_ENV={envdir}
PYTHONHASHSEED=0
PYCURL_SSL_LIBRARY=openssl
# setenv 列出了虚拟机环境中生效的环境变量,一些配色方案和单元测试标志 usedevelop = True
# usedevelop 表示安装 virtualenv 时, 项目自身是采用开发模式安装的, 所以不会拷贝代码到 virtualenv 目录中, 只是做个链接 install_command = pip install {opts} {packages}
# 表示构建环境的时候要执行的命令,一般是使用 pip 安装 deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
# deps 指定构建环境时需要安装的第三方依赖包
# 每个虚拟环境创建的时候, 会通过 pip install -r requirements.txt 和 pip install -r test-requirements.txt 安装依赖包到虚拟环境
# 一般的项目会直接安装 requirements 和 test-requirements 两个文件中的所有依赖包 commands = ostestr {posargs}
# commands 表示构建好 virtualenv 之后要执行的命令
# 这里调用了 ostestr 指令来调用 testrepository 执行单元测试用例
# {posargs} 参数就是可以将 tox 指令的参数传递给 ostestr whitelist_externals = bash
passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY [testenv:py34]
commands =
python -m testtools.run
# 这个 section 是为 py34 环境定制某些配置的,没有定制的配置,将会从 [testenv] 读取 [testenv:pep8]
commands =
flake8 {posargs} ./egis egis/common
# Check that .po and .pot files are valid:
bash -c "find egis -type f -regex '.*\.pot?' -print0|xargs -0 -n 1 msgfmt --check-format -o /dev/null"
{toxinidir}/tools/config/check_uptodate.sh
{toxinidir}/tools/check_exec.py {toxinidir}/egis
# 执行 tox -e pep8 进行代码检查, 实际上是执行了上述指令来进行代码的语法规范检查 [tox:jenkins]
downloadcache = ~/cache/pip
# 定义了 CI server jenkins 的集成配置
# 指定了 pip 的下载 cache 目录,提高构建虚拟环境的速度 [testenv:cover]
# Also do not run test_coverage_ext tests while gathering coverage as those
# tests conflict with coverage.
commands =
python setup.py testr --coverage \
--testr-args='^(?!.*test.*coverage).*$'
# 定义一个 cover 虚拟环境,使单元测试的时候,自动应用 coverage ...

参考文章

通过demo学习OpenStack开发——单元测试

Openstack_单元测试工具 tox的更多相关文章

  1. Openstack单元测试工具简单说明

    一.Openstack 的单元测试工具介绍 1.unittest unittest: 是 Python 的标准库,提供了最基本的单元测试功能,包括 单元测试运行器(简称runner) 和 单元测试框架 ...

  2. OpenStack基础知识-单元测试工具介绍

    针对以前学的内容的一个简单整理 1.单元测试工具介绍 unittest: 是 Python 的标准库,提供了最基本的单元测试功能,包括 单元测试运行器(简称runner) 和 单元测试框架.项目的单元 ...

  3. 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙

    1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...

  4. codeblocks+Mingw 下配置开源c++单元测试工具 google test

    google test 是google的c++开源单元测试工具,chrome的开发团队就是使用它. Code::Blocks 12.11(MinGW 4.7.1) (Windows版)Google T ...

  5. PHP单元测试工具PHPUnit初体验

    今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查. 看了PHPUnit的文档之后 ...

  6. 单元测试工具之Xunit

    在.NET开发中的单元测试工具之——xUnit.Net  原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ...

  7. Java单元测试工具:JUnit4(一)(二)(三)(四)

    Java单元测试工具:JUnit4(一)--概述及简单例子 Java单元测试工具:JUnit4(二)--JUnit使用详解 Java单元测试工具:JUnit4(三)--JUnit详解之运行流程及常用注 ...

  8. 单元测试工具 SmokeTest

    .NET 程序集单元测试工具 SmokeTest Smoke Test(冒烟测试),也称Regression Test(回归测试),是对软件的安装和基本功能的测试.一般地我们使用脚本来实现Smoke ...

  9. Web Service单元测试工具实例介绍之SoapUI

    原文  Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组 ...

随机推荐

  1. angular集成tinymce

    1.前言 我使用的是angular的7.x版本,和之前的低版本集成方式有所区别.这里记录下基本的集成步骤. 2.集成步骤 2.1安装tinymac包 npm install tinymce --sav ...

  2. dataTable 、dataView、Dataset 区别

    dataTable .dataView.Dataset 区别的经典回答 1.DataView是DataTable的表示,DataTable表里的记录是没有顺序的,但显示可以有不同顺序(DataVIew ...

  3. Codeforces Round #575 (Div. 3) D1+D2. RGB Substring (easy version) D2. RGB Substring (hard version) (思维,枚举,前缀和)

    D1. RGB Substring (easy version) time limit per test2 seconds memory limit per test256 megabytes inp ...

  4. 如何使用windows performance recorder

    先下载WPA TOOLS:从该地址下载,选最新的版本,然后可以只选择下载WPA工具 后面编写XML文件等等,可以参考这篇文章. 需要注意: 用管理员启动cmd后,如果想运行特定路径的文件,需要带上绝对 ...

  5. Lengauer-Tarjan算法的相关证明

    Lengauer-Tarjan算法的相关证明 0. 约定 为简单起见,下文中的路径均指简单路径(事实上非简单路径不会对结论造成影响). \(V\)代表图的点集,\(E\)代表图的边集,\(T\)代表图 ...

  6. VM架构设计文档初稿v0.01

    VM架构设计文档初稿v0.01 文档介绍 本文档是经过讨论,作为VM新架构设计开发中的重要依据.对该架构的整个系统的结构进行详实细致的描述.阐述框架结构,说明该架构所采取的设计策略和所有技术,并对相关 ...

  7. MySQL数据表

    创建数据表 CREATE TABLE IF NOT EXISTS ([列名column][类型type][约束可选])   查看数据表结构 DESC <表名> 修改数据表结构 ALTER ...

  8. Dw 表单制作 与 dedecms 结合实现提交效果

    Dw 表单制作 与 dedecms 结合实现提交效果 自定义表单的用处 1.教育类网站的学员报名 2.企业网站的在线订单 3.普通网页上的一些和用户交互的小功能 实现原理:首先添加表单:核心-频道模型 ...

  9. wed.xml 中 filter、servlet 配置格式

    1.wed.xml 中 filter 配置格式 <filter> <filter-name>filterName</filter-name> <filter- ...

  10. mysql 特殊符号

    1.完全等于 <=> mysql> select null <=> null; +---------------+ | null <=> null | +-- ...