博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
doctest --- 一个改善python代码质量的工具
阅读量:6589 次
发布时间:2019-06-24

本文共 2976 字,大约阅读时间需要 9 分钟。

简介

  说实话吧,之前一直没有怎么重视给自己的代码加上测试逻辑;也就是说我只是写了代码,但是并没有给自己的代码加上测试代码;

  整个过程就是写完后自己测试一下,看一下跑出来的结果是正确的就心满意足了。过一段时间之后总是对自己的代码有一种陌生感,

  就算有完好的注释,我也不能100%保证它的功能上是OK的。

 

  一方面是对于功能上的细节我已经忘记的差不多了,另一方面就算是有注释我也要看上一会才能回想起自己当初是怎么想的,大声

  的说出我的代码没有问题确实是一件比较难的事。

 

给自己的代码加上测试代码的必要性

  1、一种态度问题,就我现在而言不给自己的代码加上测试代码是对质量的不负责任;我希望自己尽可能的生成出没有Bug的代码

  然而给代码加上测试代码就是一个比较好的解决方案

 

  2、虽然给代码加上测试代码会用到更多的人天,但是对于一个大点的项目来说它更加的可按;也就是说当我改动现有代码或增加

  新的功能的时候是不是会引发bug,我们只要跑一遍测试用例,如果测试用例都能通过那么说明是OK的,如果有用例没有通过这个

  时候开发人员就可以自己查了,不用等到测试发现之后再报给我们。

 

  3、总的来说给自己的代码加上测试代码,这会使我对自己的 代码|项目 更加的放心

 

doctest模块的功能

  doctest模块会读取python代码中的文档字符串,并按文档字符串中的内容来运行测试逻辑;那我们的测试逻辑怎么加到文档字符串

  中去呢?这个doctest已经帮我们想好了,开发工程师只要把python交互式下的内容写入到文档字符串中就行了。

 

doctest使用举例

  一个简单的选择排序算法为例子

def select_sort(lst):    """    选择排序算法    """    for i in range(0,len(lst)):        min_item_index = i        for j in range(i,len(lst)):            if lst[j] < lst[min_item_index]:                min_item_index = j        if min_item_index != i:            lst[min_item_index],lst[i] = lst[i],lst[min_item_index]

  

  可以看到的代码只提供了一个简单的文档字符串,用来说明了一下这个函数的作用。那我们怎么给这个方法加上测试代码呢?

  事实上这个就是从简单的手工测试(工程师自己在python交互式模式下测试自己的代码)演化而来的,假设工程是在交互模式下

  测试了三个用例

>>> from selectsort import select_sort>>> lst = [3,2,1,4,5,6,-1]>>> select_sort(lst)>>> lst[-1, 1, 2, 3, 4, 5, 6]>>> >>> lst = [2,1]>>> select_sort(lst)>>> lst[1, 2]>>> >>> lst = [0]>>> select_sort(lst)>>> lst[0]

  

  doctest只要求我们把复制到文件字符串中就行了,当然啦还是另外加两行代码不过这个是死的,记下来就是了

def select_sort(lst):    """    选择排序算法    >>> lst = [3,2,1,4,5,6,-1]    >>> select_sort(lst)    >>> lst    [-1, 1, 2, 3, 4, 5, 6]    >>>     >>> lst = [2,1]    >>> select_sort(lst)    >>> lst    [1, 2]    >>>     >>> lst = [0]    >>> select_sort(lst)    >>> lst    [0]    """    for i in range(0,len(lst)):        min_item_index = i        for j in range(i,len(lst)):            if lst[j] < lst[min_item_index]:                min_item_index = j        if min_item_index != i:            lst[min_item_index],lst[i] = lst[i],lst[min_item_index]if __name__ == "__main__":    import doctest    doctest.testmod()

 

  可以看到最后三行表示当我们单独运行这个文件的时候就执行测试,那我测试下看看

python3 selectsort.py -vTrying:    lst = [3,2,1,4,5,6,-1]Expecting nothingokTrying:    select_sort(lst)Expecting nothingokTrying:    lstExpecting:    [-1, 1, 2, 3, 4, 5, 6]okTrying:    lst = [2,1]Expecting nothingokTrying:    select_sort(lst)Expecting nothingokTrying:    lstExpecting:    [1, 2]okTrying:    lst = [0]Expecting nothingokTrying:    select_sort(lst)Expecting nothingokTrying:    lstExpecting:    [0]ok1 items had no tests:    __main__1 items passed all tests:   9 tests in __main__.select_sort9 tests in 2 items.9 passed and 0 failed.Test passed.

  

  最后一行的 "Test passed" 表示测试通过了,之所以有这么多输出是因为我们加了 -v 参数,不加这个的话就是真正的linux哲学了

  “没有输出就是最好的输出”

yifengliu-nb:sorts jianglexing$ python3 selectsort.py yifengliu-nb:sorts jianglexing$ yifengliu-nb:sorts jianglexing$

 

总结

  python中还有一个专门用于单元测试的unittest框架,这个相比doctest来说要强大不少,一次再说吧!

     

 

---

转载于:https://www.cnblogs.com/JiangLe/p/10324160.html

你可能感兴趣的文章
java的左移位(<<)和右移位(>>)和无符号右移(>>>)
查看>>
find -exec 与xargs 区别
查看>>
根据osdid 查询磁盘是ssd盘还是sas盘
查看>>
不定期更新的IDEA功能整理
查看>>
struts2 action 返回类型分析
查看>>
【原创】FPGA开发手记(三) PS/2键盘
查看>>
【Algorithm】逆序数的分治求解
查看>>
viewpage滑动查看图片并再有缩略图预览
查看>>
linux统计多个文件大小总和
查看>>
java基础-Eclipse开发工具介绍
查看>>
JS常见的字符串操作
查看>>
洛谷P1069 细胞分裂 数学
查看>>
JAVA中的编码分析
查看>>
【经验心得】弹性布局rem-----模板----320设计稿
查看>>
查看源代码Source not found及在eclipse中配置jdk的src.zip源代码
查看>>
document.all用法
查看>>
knockout.js的学习笔记2
查看>>
eclipse clean 后clease 为空
查看>>
CG, DCG, NDCG
查看>>
BW:对于非法字符的控制
查看>>