本文是《python编程从入门到实践》读书实践笔记11章的内容,主要包含测试,为体现测试的重要性,独立成文。

11 测试代码

写在前面的话,以下是我这些年开发中和测试相关的血泪史。

  • 对于一个bug,发现得越晚,处理它的成本就越高。
  • bug在一个复杂系统中时,找到它要比处理它麻烦的多。
  • 大多数bug都低级得令人发指。
  • 永远无法找到所有bug,成本和安全需要互相妥协,极端一般都不那么美好。
  • 测试人员有他们的KPI,自己找的bug才适合自己

11.1函数自测、测试用例和unittest

Python标准库unittest提供了代码测试工具,可以用于代码的单元测试。

如果要用unnitest,需要建一个unittest的类

比如,当前有一个函数,该函数被存在city_function.py中

  1. def city_country(city, country, polulation=None):
  2. """根据输入的城市,国家,人口,返回特定格式字符串"""
  3. if polulation == None:
  4. city_country_rst = f"{city.title()}, {country.title()}"
  5. elif polulation is not None:
  6. city_country_rst = f"{city.title()}, {country.title()} - polulation {polulation}"
  7. return city_country_rst

再新建一个test_cities.py的文件,以进行对刚才函数的测试

  1. import unittest
  2. from city_function import *
  3. class CityFuncTestCase(unittest.TestCase):
  4. """测试city_function.py"""
  5. def test_city_country_only_func(self):
  6. """能够正确地得到结果"""
  7. city_country_rst = city_country('shanghai', 'china')
  8. self.assertEqual(city_country_rst, 'Shanghai, China')
  9. def test_city_country_polulation_func(self):
  10. """能够正确地得到结果"""
  11. city_country_rst = city_country('shanghai', 'china', 16_0000_0000)
  12. self.assertEqual(city_country_rst, 'Shanghai, China - polulation 1600000000')
  13. if __name__ == '__main__':
  14. unittest.main()

对于CityfuncTestCase类,其中的子函数(每一个测试用例)必须以test_开头,这样才能在运行unitest.main()时自动调用这些测试用例。

如果一个函数的外部交互较少,可以在测试时适当减少用例。比如在这个city_country函数中,就没有增加polulation数值范围的校验。

11.2 类自测

类测试和函数测试几乎一样,都是在unittest中新建一个类,来测试需要的方法或属性

11.2.4 方法setUp()

可以通过在测试类(比如刚才的CityFuncTestCase)中,增加setUp()方法,来在每一个测试用例调用前,增加一些相同的操作。对应的tearDown()方法中的内容会在每一个测试用例调用后执行。

被测试的类,保存在classEmployee.py中

  1. class Employee():
  2. """记录雇员的信息"""
  3. def __init__(self, name, salary=2000):
  4. self.name = name
  5. self.salary = salary
  6. def give_raise(self, amount=500):
  7. self.salary += amount

测试脚本test_classEmployee.py:

  1. import unittest
  2. from classEmployee import *
  3. class testClassEmployee(unittest.TestCase):
  4. """针对Employee类的测试"""
  5. def setUp(self):
  6. """创建一个员工,用于测试"""
  7. self.default_emp = Employee('Zhangsan')
  8. self.sp_emp = Employee('Lisi', salary=5000)
  9. def test_default_new_employee(self):
  10. """测试默认薪水下的普通员工"""
  11. self.assertEqual(self.default_emp.salary, 2000)
  12. def test_sp_new_employee_with_salary_5000(self):
  13. """测试特定薪水下的新建员工"""
  14. self.assertEqual(self.sp_emp.salary, 5000)
  15. def test_employee_give_raise_default(self):
  16. """测试默认薪水下的普通员工"""
  17. self.default_emp.give_raise()
  18. self.assertEqual(self.default_emp.salary, 2500)
  19. def test_employee_give_raise_2000(self):
  20. """测试默认薪水下的普通员工"""
  21. self.default_emp.give_raise(amount=2000)
  22. self.assertEqual(self.default_emp.salary, 4000)
  23. if __name__ == '__main__':
  24. unittest.main()

通过test_employee_give_raise_default()和test_employee_give_raise_2000()可以发现,单元测试的函数间是不会互相影响的。(这两个函数都对self.default_emp进行了操作,但是这些操作并不互通)

unittest的其他信息

最全面的肯定是python关于unittest的官方文档

其他一些blog也可以看起来,当然最主要的还是:

  1. 自测的愿望
  2. 在实践中不断使用

后话

unittest只是python标准库中的自测框架,其实还有一些框架可以选用。

《python编程从入门到实践》读书实践笔记(二)的更多相关文章

  1. 《python编程从入门到实践》读书实践笔记(一)

    本文是<python编程从入门到实践>读书实践笔记1~10章的内容,主要包含安装.基础类型.函数.类.文件读写及异常的内容. 1 起步 1.1 搭建环境 1.1.1 Python 版本选择 ...

  2. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  3. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  4. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  5. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  6. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

  7. Python编程从入门到实践笔记——字典

    Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...

  8. Python编程从入门到实践笔记——if语句

    Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...

  9. Python编程从入门到实践笔记——操作列表

    Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...

随机推荐

  1. JBOSS未授权访问漏洞利用

    1. 环境搭建 https://www.cnblogs.com/chengNo1/p/14297387.html 搭建好vulhub平台后 进入对应漏洞目录 cd vulhub/jboss/CVE-2 ...

  2. Sequence Model-week1编程题3-用LSTM网络生成爵士乐

    Improvise a Jazz Solo with an LSTM Network 实现使用LSTM生成音乐的模型,你可以在结束时听你自己的音乐,接下来你将会学习到: 使用LSTM生成音乐 使用深度 ...

  3. kivy画板

    from kivy.app import App from kivy.graphics import Line, Color # 引入绘图线条,颜色 from kivy.uix.widget impo ...

  4. freemarker中使用String字符串作为模板

    在日常开发中,我们有时候需要发送短信.邮件等通知,但是这些通知的内容通常都是动态的,而且可能会发生变动,为了程序的灵活性,我们通常会将通知的内容配置在页面上,然后后台通过渲染这些模板,来获取具体的内容 ...

  5. CSP2021 翻车记

    DAY - INF 日常模拟赛被吊打,不知道为啥总是出一些小问题导致正解gg,成绩的话也就是中游吧,不过方差不小 DAY - 2 感冒了,头疼得很,签到题甚至也签到失败了,烦得很 DAY -1 全真体 ...

  6. 外网访问vm虚拟机

    目录 一.准备 二.外网访问主机电脑 三.外网访问VM虚拟机 一.准备 外网ip:39.189.8.5 访问https://www.ip138.com 可以查询外网ip 内网主机ip:192.168. ...

  7. hdu 2830 Matrix Swapping II(额,,排序?)

    题意: N*M的矩阵,每个格中不是0就是1. 可以任意交换某两列.最后得到一个新矩阵. 问可以得到的最大的子矩形面积是多少(这个子矩形必须全是1). 思路: 先统计,a[i][j]记录从第i行第j列格 ...

  8. 第01课 OpenGL窗口(4)

    下面的代码处理所有的窗口消息.当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息. LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄 UINT uMsg ...

  9. js实现日期格式化封装--八种

    封装一个momentTime.js文件,包含8种格式. 需要传两个参数: 时间戳:stamp 格式化的类型:type, 日期补零的方法用到es6语法中的padStart(length,'字符'): 第 ...

  10. Vue&Element开发框架中增加工作流处理,查看申请单中整合多个处理类型的处理

    关于我在Winform框架.混合框架.Bootstrap开发框架中的简易审批性工作流模块,我写过不少文章,有兴趣可以参考<工作流模块>的随笔进行了解,本篇随笔在完成了Vue&Ele ...