[注明:本文最初发布于简书,然而。。。]

Python作为一门简单易学的编程语言,现在长期位于编程语言榜的前三。在人工智能的第二次浪潮涌起之前,因为简单快速容易维护,Python在很多系统中是作为“胶水语言”存在的。而现今时代因为出现大量数据处理的需求,以及在大数据集上的分析和推演的需求,包括人工智能的广泛运用,使得Python语言换发了第二春,众多的机器学习框架和库都是用Python例如pytorch和tensorflow等等。另外,很多数据分析师或工程师都选择了Python作为主要开发语言。

大量软件系统被开发出来,为了保证系统的质量,测试是不可或缺的。这里全栈哥布鲁斯给大家介绍一下常见的Python测试框架。包括nose, pytest和locust。同学们跟着全栈哥布鲁斯的节奏,开始精进吧。这一篇我们先从Python nose测试框架开始。

一、nose是什么?

nose是一个单元测试的框架,它扩展了Python的标准库unittest,让用户更方便地编写单元测试。Python标准库中提供了单元测试的框架unittest,读者可以自行访问unittest — Unit testing framework — Python 3.8.13 documentation了解更多细节。那么标准库中的unittests包有什么问题呢,主要是比较繁琐,例如每个测试用例必须是unittests.TestCase的子类,而且测试用例的组织也不灵活,unittests中提供了unittest.TestSuite来将一个个test case组织起来形成更大的suite。后边会有文章专门介绍unittests这个标准库的用法和实践。

nose库的官方文档(英文)在这里,Note to Users — nose 1.3.7 documentation。

二、nose怎么使用?

首先我们需要安装nose。跟其他现代的Python库一样,推荐使用`pip`来安装nose。 在PyPI网站上,搜索nose可以看到最新的版本是1.3.7。地址在nose · PyPI

$ pip install nose

安装好了之后,可以运行nosetests -h来检验一下。

$ nosetests -h

三、nose有什么特性?

nosetests提供了很丰富的功能,例如支持使用正则表达式发现测试用例,支持第三方插件扩充功能,支持测试用例的超时,兼容xUnit样式的报告生成,能够生成代码覆盖率的报告等等。很多工程师选择使用nose,因为它具有简单、灵活、可扩展的特点。

我们从下面的示例代码开始,看看这些特点。

# file: src/calculator.py

# 实现一个简单的计算器,因为是demo的用途,仅仅支持两个数的加法和乘法。

class SimpleCalculator:

def __init__(self):

print("initialize a calculator")

def add(self, x, y):

return x + y

def multiply(self, x, y):

return x * y

下面是对应的测试代码。

# tests/test_calculator.py

from calculator import SimpleCalculator

def test_add():

calc = SimpleCalculator()

assert 2022 == calc.add(2000, 22)

def test_multiply():

calc = SimpleCalculator()

assert 15 == calc.multiply(3, 5)

接下来用nosetests命令行撸一把。

$ nosetests -v

test_calculator.test_add ... ok

test_calculator.test_multiply ... ok

----------------------------------------------------------------------

Ran 2 tests in 0.008s

OK

是不是很简单?

Python语言是一门动态语言,跟其他的像C++,JAVA等高级语言相比它的一个特点和优势就是灵活。例如Python语言中的duck typing,就不用像C++,JAVA等等一定需要用继承的方式来构建严格的类型系统。这个动态性的优势,也使得Python的测试框架可以做得很人性化。例如nose中的测试用例,并不要求必须派生于某个基类(如unittests.TestCase),而是只需要符合testMatch的模式就可以了。这里的testMatch在nose官方文档中有着详细的解释,它指的是nose收集和识别测试用例的规则,一般使用正则表达式来定义。缺省情况下所有的模块只要是文件名以“test”(或"Test")开头就会被nose收集,模块中的函数或者类,如果是"test"(或"Test")开头的会被认定为测试用例。上面测试代码中的"test_add"和“test_multiply”除了名字以test开头,它们是普通的函数。这个比unittests中规定的繁文缛节,要清爽多了。

除了这个,nose还支持使用配置文件(config files)来定义参数。这个特性在实际开发中有很多用途,例如我们可以为UT和IT创建不同的配置文件,也可以将(大型)项目中的功能通过配置文件分配到不同的测试子集中。对于config的用法,这里不做展开细讲了。

四、最佳实践介绍

1. 测试用例的收集

虽然说nose通过testMatch可以支持各种定制化的测试组织和命名方式,但是为了提供项目的工程化水平,让项目代码更容易维护,实践中还是以简单清晰的结构为上策。

例如

- package名字一般为test_xxx_yyy或xxx_yyy_test;

- module名字一般为test_aaa或aaa_test;

- case名字一般为test_my_func或class TestMyModule之类的。

对于测试用例的组织来说,一致的清晰的方式容易理解容易维护。nose缺省的testMatch就能够搞定,而且对于新加入项目的同事来说也非常友好。

2. 测试用例的运行

nose运行测试用例的方式比较灵活。例如

下面例子中运行了两个包中的测试。

通常情况下使用

$ nosetests -v

运行所有的测试用例。

另外一个常常用到的办法是使用tags。nose内建的插件“attribute selector”可以根据用户指定的attribute来筛选特定的测试用例。例如

from nose.plugins.attrib import attr

@attr('smoke')

def test_an_important_case():

#implementation goes here

pass

结果示例如下

$ nosetests -a "smoke" -v

test_hello.test_an_important_case ... ok

----------------------------------------------------------------------

Ran 1 test in 0.009s

OK

关于这个插件,更详细的用法可以参考

https://nose.readthedocs.io/en/latest/plugins/attrib.html

3. 测试报告的生成

nose自身的测试报告是简约风格,但是项目可能需要更详细的报告或者需要在Jenkins等CI工具中进行集成。这一点可以通过nosetests的选项--with-xunit完美解决。

$ nosetests --with-xunit

它会生成一个JUnit兼容的报告文件叫做nosetests.xml。当然你可以通过选项--xunit-file指定这个文件的生成位置和文件名。

4. 内建的插件

nose还有一些其他的插件,勤奋又聪明的读者可以自己动手学习和实践。文档地址是 https://nose.readthedocs.io/en/latest/plugins/builtin.html

五、那么问题呢?

nose也有自身的缺点。一个最大的问题是,这个库以及很久没有更新了。似乎原作者不再想维护了,有些可惜。作者推荐用户迁移到py.test或者nose2,或者干脆直接使用Python标准库中的unittests。因为py.test现在的人气很旺,所以全栈哥布鲁斯也推荐读者去使用py.test。本人在新的项目中也使用了py.test,感兴趣的读者可以跟我多多交流互相学习。

Python nose测试大法相关推荐

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

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

  2. python自动测试n_接口自动化:Jenkins 自动构建python+nose测试

    参考: 通过Jenkins自动化构建python nose测试分两步: 1. 创建节点(节点就是执行自动化测试的机器): 2. 创建任务并绑定节点(用指定的机器来跑我们创建的任务,这里我们选择执行一段 ...

  3. python测试框架nose研究_详解Python nose单元测试框架的安装与使用

    本文介绍了Python nose单元测试框架的安装与使用 ,分享给大家,具体如下: 安装(Python2下安装) pip install nose 原理与命名规则 Nose会自动查找源文件.目录或者包 ...

  4. python api测试框架_python api 测试框架

    python常用框架 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是 ...

  5. Python nose test framework 介绍

    Python nose test framework 介绍 一.安装nose 先用easy_install 安装 nose,easy_install是一个很好的python工具,可以方便安装很多的py ...

  6. python行为驱动测试开发_行为驱动开发在 Python 开发测试中的应用

    行为驱动开发 (BDD) 简介 行为驱动开发是什么? 说到行为驱动开发(BDD),无可避免的要提到敏捷里面的测试驱动开发(TDD),TDD 的主要思想是"代码即文档",其倡导的流程 ...

  7. python入门测试教程_Python测试入门

    python入门测试教程 This tutorial is for anyone who has written a fantastic application in Python but hasn' ...

  8. python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~

    坚持梦想 就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. 测试开发python系列面试题 01 单选题 1.下列哪个语句在P ...

  9. 基于python渗透测试_Python中基于属性的测试简介

    基于python渗透测试 by Shashi Kumar Raja 由Shashi Kumar Raja Python中基于属性的测试简介 (Intro to property-based testi ...

最新文章

  1. DOM对象与jquery对象有什么不同
  2. python 登陆网站图片验证_登陆需要密码以及图片验证的网站 如知乎
  3. Transformer太大了,我要把它微调成RNN
  4. git入门(廖雪峰老师)
  5. Solr router 路由介绍
  6. 数字图像处理 中值滤波 MATLAB实验
  7. 最便宜iPad曝光 苹果给力了!
  8. linux正则表达式_【开发者成长】5 分钟搞定 Linux 正则表达式
  9. layer——极简的jquery弹出层插件
  10. python实现二分查找算法
  11. Tomcat日志乱码问题解决方法
  12. 苹果4s刷linux,苹果4s降级教程【图解】
  13. 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版登录入口
  14. 【面试】数据分析助理面试
  15. php like 中文,punycode和中文转换 phpThe Twitter-clone/twitter-like sites collection
  16. linux gem安装软件,安装gem报错
  17. 清华计算机考研报考人数,2020部分院校考研报考人数统计
  18. 一个题目引发的数组和指针复习
  19. maya blend shape
  20. 提高数据库查询效率的八个方法

热门文章

  1. Benchmark(基准测试)初相识
  2. 多变量干扰事件发生下的地铁客流预测
  3. python校正人脸_Python 进行人脸校正
  4. 数据中心交换机横向虚拟化集群漫谈
  5. MySQL:HINT
  6. 语音转文字 Privacy Policy
  7. ventoy启动盘 集成多版本系统的启动盘
  8. antd-mobile下拉加载
  9. 二代身份证号码最后一位校验位的计算方法
  10. Android源码:2、如何下载源码详解(二)(支持移动硬盘、mac)—亲测成功