以前我是不写任何测试的,后来偶尔写单元测试,现在我主动写单元测试 ----- 不得 不承认,测试是有其存在必要性的,要说为什么的话,大概又会引发语言的强弱类型和 是否静态语言之争了吧。

就目前而言,个人认为写单元测试的好处有以下几点:

当修改了代码之后,单元测试可以保证API不会发生变化(假设原需求就不需API发生 变化)。这点可能一般情况下没什么感觉,但是当你去修改前辈留下的代码的时候, 你就会感谢他写了单元测试,最少让你知道了从功能上,这个函数是干什么的,而且 能保证你修改了函数内部实现,但是不影响函数功能。

写单元测试的时候会回想函数的作用,从而自动对函数进行回想和 review。

缺点嘛:耗费时间。单元测试和文档一样,属于非常重要,但是非常耗费时间的工作, 因为要考虑齐全,考虑到的边界条件越多,测试覆盖率越高,程序越可靠,而想这些东 西是很耗费时间精力的。

吐槽完毕,我们来说说目前我知道的几个和测试有关的东西(全程 Python 3)。

Mock

Mock是个好东西呀,遇到测试中出现的不可预知的或者不稳定因素,就用 Mock 来代 替。例如查询数据库(当然像目前我们用的MongoDB,由于特别灵活,可以直接在代码里 把相应的collection替换掉),例如异步任务等。举个例子:

import logging
from unittest.mock import Mock
logging.basicConfig(level=logging.DEBUG)
#  code
class ASpecificException(Exception):pass
def foo():pass
def bar():try:logging.info("enter function <foo> now")foo()except ASpecificException:logging.exception("we caught a specific exception")
#  unittest
def test_foo():foo = Mock(side_effect=ASpecificException())  # noqalogging.info("enter function <bar> now")bar()logging.info("everything just be fine")
if __name__ == "__main__":test_foo()

运行一下:

root@arch tests: python test_demo.py
INFO:root:enter function <bar> now
INFO:root:enter function <foo> now
INFO:root:everything just be fine

一个简单的测试就这么写好了。来,跟我念,Mock 大法好呀!

doctest

doctest属于比较简单的测试,写在 docstring 里,这样既能测试用,又能当文档 示例,是在是好用之极啊。缺点是,如果测试太复杂,doctest就显得太臃肿了(例如 如果测试之前要导入一堆东西)。举个例子:

import logging
logging.basicConfig(level=logging.DEBUG)
def foo():"""A utility function that returns True>>> foo()True"""return True
if __name__ == "__main__":import doctestlogging.debug("start of test...")doctest.testmod()logging.debug("end of test...")

测试结果:

root@arch tests: python test_demo.py
DEBUG:root:start of test...
DEBUG:root:end of test...

unittest

这个文档确实有点长,我感觉还是仔细去读一下文档比较好(虽然我也没读完)。

import unittest
class TestStringMethods(unittest.TestCase):def setUp(self):self.alist = []def tearDown(self):print(self.alist)def test_list(self):for i in range(5):self.alist.append(i)
if __name__ == '__main__':unittest.main()
root@arch tests: python test_demo.py
[0, 1, 2, 3, 4]
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

unittest框架配合上Mock,单元测试基本无忧啦。

pytest

上面的单元测试跑起来比较麻烦,当然也可以写一个脚本遍历所有的单元测试文件,然 后执行。不过 pytest 对unittest有比较好的支持。

pytest默认支持的是 函数 风格的测试,但是我们可以不用这一块嘛(而且很多时候 还是很有用的)。走进项目根目录,输入 pytest 就可以啦。它会自动发现 test_ 开头的文件,然后执行其中 test_ 开头的函数和 unittest 的 test_ 开头的 方法。

root@arch tests: pytest
========================================================= test session starts =========================================================
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /root/tests, inifile:
collected 1 items
test_afunc.py .
====================================================== 1 passed in 0.03 seconds =======================================================
root@arch tests:

总结

编译器没给python做检查,就只有靠我们手写测试了

Python和单元测试那些事儿相关推荐

  1. python简单单元测试示范卷_Python 单元测试的简单示例

    这篇文章主要为大家详细介绍了Python 单元测试的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 以前我是不 ...

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

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

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

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

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

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

  5. 字字谏言!Python入门学习教程:关于Python不得不说的事儿

    作为程序员,你肯定遇到过这样的领导: "别人还没走,你先走了不合适吧." "不能确定功劳,总得有苦劳吧!你看别人9点谁走了?" 说到996,这很有可能是诱因之一 ...

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

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

  7. python做单元测试_如何使用python做单元测试?

    很多编程小白不太理解单元测试,为什么要进行单元测试呢?很简单,主要是提高代码的正确,同时确保重构不出错.接下来我们一起学习怎么用python做单元测试吧. python内置了一个unittest,但是 ...

  8. python测试代码怎么写_如何使用python做单元测试?

    很多编程小白不太理解单元测试,为什么要进行单元测试呢?很简单,主要是提高代码的正确,同时确保重构不出错.接下来我们一起学习怎么用python做单元测试吧. python内置了一个unittest,但是 ...

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

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

最新文章

  1. [分享]3秒钟让你的QQ号IP跑到任何地方,哪怕是美国白宫!
  2. Maven常用插件--转
  3. 不重复的随机数JAVA、C#·适合初级人员玩耍。
  4. C#ASP.NET执行BAT批处理代码
  5. 鸿蒙之火是什么意思,鸿蒙突然火了!鸿蒙是什么?
  6. linux内核 默认路由表,Linux 默认路由表 0.0.0.0
  7. Github版本控制——基础操作
  8. Keras——用Keras搭建RNN分类循环神经网络
  9. GIS案例练习-----------第九天
  10. linux密码安全加固文件,LINUX安全加固方案
  11. c语言使用CodeBlocks软件,使用CodeBlocks学习C语言
  12. Spark SQL 之开窗函数
  13. easydarwin 安装_win10安装EasyDarwin并作为流媒体服务器的推流和拉流实例
  14. 没想到吧?快手竟然给厕所上安装了计时器,或许职场从此再无「带薪拉屎」...
  15. 前端追梦人JavaScript教程
  16. STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)
  17. java静态成员和非静态成员的区别
  18. Jquery中$(document).ready()的作用
  19. 写论文的神仙网站推荐!
  20. 强大的U盘启动盘制作工具Rufus

热门文章

  1. 2018.07.11 线段树基本模板复习
  2. python之ORM操作
  3. asp.net超过字数限制用省略号...表示
  4. WebService大讲堂之Axis2(9):编写Axis2模块(Module)
  5. Java:数列排序 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
  6. 笔记本网络计算机和设备不可见,xp电脑不显示无线网络的七种原因和解决方法...
  7. 【数据结构】之算法效率的度量
  8. mysql profiling表_mysql8 参考手册-INFORMATION_SCHEMA PROFILING表
  9. 程序员面试100题之十四:强大的和谐
  10. 学习deercao的正则笔记