《python编程从入门到实践》读书实践笔记(二)
本文是《python编程从入门到实践》读书实践笔记11章的内容,主要包含测试,为体现测试的重要性,独立成文。
11 测试代码
写在前面的话,以下是我这些年开发中和测试相关的血泪史。
- 对于一个bug,发现得越晚,处理它的成本就越高。
- bug在一个复杂系统中时,找到它要比处理它麻烦的多。
- 大多数bug都低级得令人发指。
- 永远无法找到所有bug,成本和安全需要互相妥协,极端一般都不那么美好。
- 测试人员有他们的KPI,自己找的bug才适合自己
11.1函数自测、测试用例和unittest
Python标准库unittest提供了代码测试工具,可以用于代码的单元测试。
如果要用unnitest,需要建一个unittest的类
比如,当前有一个函数,该函数被存在city_function.py中
def city_country(city, country, polulation=None):
"""根据输入的城市,国家,人口,返回特定格式字符串"""
if polulation == None:
city_country_rst = f"{city.title()}, {country.title()}"
elif polulation is not None:
city_country_rst = f"{city.title()}, {country.title()} - polulation {polulation}"
return city_country_rst
再新建一个test_cities.py的文件,以进行对刚才函数的测试
import unittest
from city_function import *
class CityFuncTestCase(unittest.TestCase):
"""测试city_function.py"""
def test_city_country_only_func(self):
"""能够正确地得到结果"""
city_country_rst = city_country('shanghai', 'china')
self.assertEqual(city_country_rst, 'Shanghai, China')
def test_city_country_polulation_func(self):
"""能够正确地得到结果"""
city_country_rst = city_country('shanghai', 'china', 16_0000_0000)
self.assertEqual(city_country_rst, 'Shanghai, China - polulation 1600000000')
if __name__ == '__main__':
unittest.main()
对于CityfuncTestCase类,其中的子函数(每一个测试用例)必须以test_开头,这样才能在运行unitest.main()时自动调用这些测试用例。
如果一个函数的外部交互较少,可以在测试时适当减少用例。比如在这个city_country函数中,就没有增加polulation数值范围的校验。
11.2 类自测
类测试和函数测试几乎一样,都是在unittest中新建一个类,来测试需要的方法或属性
11.2.4 方法setUp()
可以通过在测试类(比如刚才的CityFuncTestCase)中,增加setUp()方法,来在每一个测试用例调用前,增加一些相同的操作。对应的tearDown()方法中的内容会在每一个测试用例调用后执行。
被测试的类,保存在classEmployee.py中
class Employee():
"""记录雇员的信息"""
def __init__(self, name, salary=2000):
self.name = name
self.salary = salary
def give_raise(self, amount=500):
self.salary += amount
测试脚本test_classEmployee.py:
import unittest
from classEmployee import *
class testClassEmployee(unittest.TestCase):
"""针对Employee类的测试"""
def setUp(self):
"""创建一个员工,用于测试"""
self.default_emp = Employee('Zhangsan')
self.sp_emp = Employee('Lisi', salary=5000)
def test_default_new_employee(self):
"""测试默认薪水下的普通员工"""
self.assertEqual(self.default_emp.salary, 2000)
def test_sp_new_employee_with_salary_5000(self):
"""测试特定薪水下的新建员工"""
self.assertEqual(self.sp_emp.salary, 5000)
def test_employee_give_raise_default(self):
"""测试默认薪水下的普通员工"""
self.default_emp.give_raise()
self.assertEqual(self.default_emp.salary, 2500)
def test_employee_give_raise_2000(self):
"""测试默认薪水下的普通员工"""
self.default_emp.give_raise(amount=2000)
self.assertEqual(self.default_emp.salary, 4000)
if __name__ == '__main__':
unittest.main()
通过test_employee_give_raise_default()和test_employee_give_raise_2000()可以发现,单元测试的函数间是不会互相影响的。(这两个函数都对self.default_emp进行了操作,但是这些操作并不互通)
unittest的其他信息
最全面的肯定是python关于unittest的官方文档
其他一些blog也可以看起来,当然最主要的还是:
- 自测的愿望
- 在实践中不断使用
后话
unittest只是python标准库中的自测框架,其实还有一些框架可以选用。
《python编程从入门到实践》读书实践笔记(二)的更多相关文章
- 《python编程从入门到实践》读书实践笔记(一)
本文是<python编程从入门到实践>读书实践笔记1~10章的内容,主要包含安装.基础类型.函数.类.文件读写及异常的内容. 1 起步 1.1 搭建环境 1.1.1 Python 版本选择 ...
- Python编程从入门到实践笔记——异常和存储数据
Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
- Python编程从入门到实践笔记——用户输入和while循环
Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...
- Python编程从入门到实践笔记——字典
Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...
- Python编程从入门到实践笔记——if语句
Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...
- Python编程从入门到实践笔记——操作列表
Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...
随机推荐
- VS Code Remote SSH设置
本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...
- beta事后分析
设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 软件要解决的问题是是开发一个简易方便,为用户带来便捷且功能齐全的表情包管理小程序: 预期的典型用户 ...
- 为什么用于开关电源的开关管一般用MOS管而不是三极管
区别: 1.MOS管损耗比三极管小,导通后压降理论上为0. 2.MOS管为电压驱动型,只需要给电压即可,意思是即便串入一个100K的电阻,只要电压够,MOS管还是能够导通. 3.MOS管的温度特性要比 ...
- Linux有什么可取之处竟如此受欢迎
什么是Linux? Linux是一个操作系统软件.和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统,它是一个支持多用户.多任务.多线程和多CPU的操作系统 ...
- Xpath语法学习记录
高级参考:https://blog.csdn.net/wudaoshihun/article/details/82226122 举例: 1 <!DOCTYPE html> 2 <ht ...
- Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列
题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...
- Downward API —— 在容器内部获取 Pod 信息
我们知道,每个 Pod 在被超过创建出来之后,都会被系统分配唯一的名字.IP地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢? 答案就是使用 ...
- Vue 基础自查——条件渲染和列表渲染
v-if和v-show的区别是什么? v-if和v-for为什么不能一起用? v-for中的key有什么作用? 1 v-if 和 v-show 1.1 作用 都用来控制元素的显示和隐藏 1.2 控制元 ...
- 【Go语言细节】反射
什么是反射 维基百科上反射的定义: 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.用比喻来说,反射就是程序在运行的时候能够"观 ...
- 学信网改绑手机号码,但是忘记了老号码怎么办?利用node.js + puppeteer 跑脚本实现改绑手机号
最近登录学信网发现自己学信网上绑定的手机号码不是目前自己使用的手机号码,于是想改绑手机号,但是发现不记得之前的手机号码了: 于是百度各种方法都无济于事:也不想重新注册账号,最后看见一篇文章通过Pyth ...