【Python】单元测试实践内部指南

明月AI 2021-10-28 16:19:16
Python 测试 单元测试 实践 单元

对于单元测试,我们的总的原则是:

单元测试应该写,因为这样才能保证程序的质量和养成良好的习惯,但是又不能将单元测试搞得太复杂,花太多的精力在这上面,那就本末倒置了

pytest的简单使用


单元测试工具选用pytest(这个工具和go test有点类似),简单的使用:

# 文件: example.py
def func(i: int) -> int:
return i * 2
# 文件: example_test.py
from .example import func
def test_func():
assert func(10) == 20
assert func(20) == 30

在相同的目录下执行命令pytest,该命令会自动找到*_test.py的文件(注意:当前目录需要文件__init__.py)执行测试用例。显然这个单元测试是不通过的,报错信息如下:

 def test_func():
assert func(10) == 20
> assert func(20) == 30
E assert 40 == 30
E + where 40 = func(20)
doctest_example_test.py:7: AssertionError

pytest可以递归自动发现测试文件,在使用过程中,也支持执行指定用例:

  • 指定测试文件路径 pytest /path/to/test/file.py
  • 指定测试类 pytest /path/to/test/file.py:TestCase
  • 指定测试方法 pytest another.test::TestClass::test_method
  • 指定测试函数 pytest /path/to/test/file.py:test_function

关于单元测试的几个规范


关于单元测试,我们定义几个使用规范:

  1. 我们写的函数或者类等,要时刻保持可测试的状态(或者说叫可观测的状态)。
  2. 测试用例文件名要对应,例如文件名为filename.py,则对应的测试用例文件名为filename_test.py。
  3. 测试函数名要对应,例如业务函数名为func_name,则对应的测试函数名为test_func_name。
  4. 测试类名要对应,例如原类名为ClassName,则对应测试类名为TestClassName。
  5. 建议测试用例文件和功能文件放在相同目录下,方便查找,通常不需要一个单独的测试目录。

使用参数化测试来优化测试用例


在实际使用中,我们应该优先考虑使用参数化测试:
# 前面那个测试用例其实应该优化成这样:
import pytest
# 这里数据的部分完全可以定义成一个变量
# 这样就不必重复写很多个assert语句了
@pytest.mark.parametrize("params, expected", [([10], 20), ([20], 30)])
def test_func2(params, expected):
assert func(*params) == expected
同样,执行之后,测试也是不通过的:
 @pytest.mark.parametrize("params, expected", [([10], 20), ([20], 30)])
def test_func2(params, expected):
> assert func(*params) == expected
E assert 40 == 30
E + where 40 = func(*[20])
doctest_example_test.py:18: AssertionError

如果把这个parametrize函数进行封装的话,应该可以做到更加简单,例如单元测试只要描述输入输出即可:

# 只要专注于编写测试用例即可
test_data = [
(func, [10], {}, 20),
(func, [20], {}, 30)
]
@pytest.mark.parametrize("action, args, kwargs, expected", test_data)
def test_all_func(action, args, kwargs, expected):
assert action(*args, **kwargs) == expected
这样,只要专注写好测试用例即可。

20210626

本文分享自微信公众号 - 野生AI架构师(Moon-CV) ,作者:明月AI

原文出处及转载信息见文内详细说明,如有侵权,请联系 [email protected] 删除。

原始发表时间: 2021-06-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[明月AI]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1894321

  1. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
  2. python中一维数组怎么转置
  3. 遇到一个问题,关于Python的复数的
  4. python批量将文件夹里的csv文件转成txt文件
  5. Python 彻底搞懂列表推导式|初级到进阶(实例30+)
  6. python爬虫,遇到urllib.error.URLError: <urlopen error [Errno 11001] getaddrinfo failed>错误
  7. Python程序设计输入五到十之间的整数n,生成并输出一个n位的验证码,不能把大小写字母和数字全写出来
  8. python程序打包之后没运行tkinter
  9. python提取多个Excel文件内目的格内容按一定格式写入新的Excel。
  10. pandas读取csv文件文件末尾都是NaN值,发生了什么?
  11. Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)
  12. 大学生Python实验的列表与元组
  13. python 关于线程的参数args的问题
  14. 如何用python将pdf转成网页html的格式
  15. python基础题 运行后卡在某一步 随后电脑疯狂运转发声 等待无果
  16. 求大神教怎么用python写字
  17. 云计算开发:Python3-expandtabs()方法详解
  18. 9000字深度整理: 全网最详细 Pandas 合并数据集操作总结!
  19. python这个代码有错误,请帮我修改
  20. python redis自带门神 lock 方法
  21. 有关python求众数,中位数和均值的题目
  22. 零基础5天入门Python数据分析:第四课
  23. 零基础5天入门Python数据分析:第三课(上)
  24. 零基础5天入门Python数据分析:第一课
  25. python redis自带门神 lock 方法
  26. 【算法学习】LCP 01. 猜数字(java / c / c++ / python / go)
  27. 【Python量化分析100例】Day2-星期几最容易被割韭菜
  28. python逆推年份,前两问写好了,第三问不会
  29. Python 爬取百度网页如何绕过安全验证
  30. 零基础5天入门Python数据分析:第五课
  31. Python人脸融合时出现关于pybind11的问题
  32. python如何返回除数,公约数,倍数
  33. python 返回多重嵌套列表(多于两层嵌套)的元素
  34. 用Python采集了几千条相亲文案,终于发现了告别单身的秘密
  35. python正负序列题,目前只学到循环,怎么做啊(*꒦ິ⌓꒦ີ)
  36. 拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
  37. Python注释删除代码依然报错
  38. python的pyautogui模块中的pyautogui.scroll()括号中无论写什么值滚动范围都相同
  39. 为什么python在vscode里运行报语法错误,在IDLE里就不会
  40. 请问python如何在将pdf转成word时,去除pdf上的页眉页脚(或者对于每页pdf只取第2行-倒数第二行)
  41. matlab改为python,偏最小二乘回归分析的一个程序
  42. 应该是python基础题希望能用基础方法解决
  43. 想找个会Python的做场外援助,上课没听明白
  44. Python程序,插入不了MySQL的date格式
  45. (初学者)关于Python操作Excel问题
  46. 求人来解答这两道Python题
  47. python中用三引号换行,举例说明
  48. python数码管该怎么用,十四段
  49. python进行中文文本聚类(切词以及Kmeans聚类)
  50. Python - 转换二进制为ASCII码
  51. Python - 在段落中计算令牌
  52. Python - 排序线
  53. Python - 字符串不变性
  54. Python - 文本摘要
  55. Python+微信小程序开发(六)双向绑定和前后端通信
  56. 基于Anaconda搭建Django环境
  57. Django基础篇(2)--视图
  58. 288页的python编程文档,从入门到实践,入门看这一篇就够了
  59. Python Web实战:Flask + Vue 开发一个漂亮的词云网站
  60. 让我深夜十二点催她睡觉,我用 Python 轻松搞定!