测试函数——python编程从入门到实践
测试函数
学习测试,得有测试的代码。下面是一个简单的函数:
name_function.py
def get_formatted_name(first, last): """Generate a neatly formatted full name.""" full_name = first + ' ' + last return full_name.title()
为核实get_formatted_name()像期望的那样工作,编写一个使用这个函数的程序:
names.py
from name_function import get_formatted_name print("Enter 'q' at any time to quit.") while True: first = input("\nPlease give me a first name: ") if first == 'q': break last = input("Please give me a last name: ") if last == 'q': break formatted_name = get_formatted_name(first, last) print("\tNeatly formatted name: " + formatted_name + ".")
运行:
Enter 'q' at any time to quit. Please give me a first name: janis Please give me a last name: joplin Neatly formatted name: Janis Joplin. Please give me a first name: bob Please give me a last name: dylan Neatly formatted name: Bob Dylan. Please give me a first name: q
从输出可知,合并得到的姓名正确无误。现在假设要修改get_formatted_name(),使其还能够处理中间名。确保不破化这个函数处理只有名和姓的方式,为此可在每次修改get_formatted_name()后都进行测试:运行names.py,并输入像Janis Joplin这样的姓名。但python提供了一种自动化测试函数输出的高效方式,对get_formatted_name()进行自动化测试,就可信心满满,确信函数提供测试过的姓名时,都能正确工作。
1 单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。单元测试——合适函数某个方面没有问题;测试用例——一组单元测试,这些单元测试一起核实函数在各种情况下的行为都符合要求。良好的测试用例考虑到函数可能收到的各种输入,包含针对所有这些测试情形的测试。。。全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。
2 可通过的测试
编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。
下面时一个只包含一个方法的测试用例,检查函数get_formatted_name()在给定名和姓时能否正确工作:
test_name_function.py
import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): # 创建包含针对 get_formatted_name() 的单元测试的类;最好包含字样Test;必须继承unittest.TestCase """测试name_function.py""" def test_first_last_name(self): """能够正确地处理像Janis Joplin这样的姓名吗?""" formatted_name = get_formatted_name('janis', 'joplin') self.assertEqual(formatted_name, 'Janis Joplin') # unittest类中的一个断言方法,判断是否相等 if __name__ == '__main__': # 在pycharm中运行时需要这行代码,IDLE运行则不需要 unittest.main() # 让python运行这个文件中的测试
运行test_name_function.py时,所有以test打头的方法都将自动运行。
3 不能通过的测试
修改get_formatted_name(),使其能够处理中间名,但这样做时,故意让函数无法处理只有名和姓的名字。
get_formatted_name()的新版本,通过一个实参指定中间名:
name_function.py
def get_formatted_name(first, middle, last): """Generate a neatly formatted full name.""" full_name = first + ' ' + middle + ' ' + last return full_name.title()
此时运行test_name_function.py,运行结果:
Ran 1 test in 0.003s FAILED (errors=1) Error Traceback (most recent call last): File "C:\Program Files\Python 3.7\lib\unittest\case.py", line 59, in testPartExecutor yield File "C:\Program Files\Python 3.7\lib\unittest\case.py", line 615, in run testMethod() File "C:\Users\yxf\Desktop\python_pycharm\test_names_function.py", line 10, in test_first_last_name formatted_name = get_formatted_name('janis', 'joplin') TypeError: get_formatted_name() missing 1 required positional argument: 'last' Process finished with exit code 1 Assertion failed Assertion failed Assertion failed
运行结果中给出了详细的错误信息。
4 测试未通过时怎么办
由测试代码运行得到的错误信息可知get_formatted_name()少一个实参,修改get_formatted_name():
def get_formatted_name(first, last, middle=''): """Generate a neatly formatted full name.""" if middle: full_name = first + ' ' + middle + ' ' + last else: full_name = first + ' ' + last return full_name.title()
再次运行test_name_function.py:
Ran 1 test in 0.002s OK
5 添加新测试
再编写一个测试用例,用于测试包含中间名字的测试,即在NamesTestCase类中再添加一个方法:
def test_first_last_middle_name(self): """能够正确地处理像Wolfgang Amadeus Mozart这样的名字吗?""" formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus') self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')
***调用函数时,可选实参,即本段代码中中间名在最后。
方法名必须以test_打头,这样它才会在运行test_name_function.py时自动运行。
在TestCase类中可以使用很长的方法名,这些方法名必须是描述性的,这样才能明白测试未通过时的输出。
原文地址:https://www.cnblogs.com/shirley-yang/p/11173321.html
- java学习:日期的运算
- ORACLE:写Function时,传入参数变量名的注意事项
- spring boot 登录注册 demo (二) -- 数据库访问
- spring boot 登录注册 demo (三) -- 前后端传递
- python装饰器大详解
- spring boot 登录注册 demo (四) -- 体验小结
- jenkins 时区设置
- 什么样的密码才是安全的?
- MAC本遭遇ARP攻击的处理办法
- nodejs 语法学习(持续更新)
- Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
- - Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side
- Django - - - -视图层之视图函数(views)
- fiddler mock ==> AutoResponder
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii2.0框架实现带分页的多条件搜索功能示例
- 定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
- PHP APP微信提现接口代码
- thinkPHP5.1框架路由::get、post请求简单用法示例
- Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
- Python爬虫实例——scrapy框架爬取拉勾网招聘信息
- php实现微信企业转账功能
- Laravel框架模型的创建及模型对数据操作示例
- Python环境管理virtualenv&virtualenvwrapper的配置详解
- Matplotlib自定义坐标轴刻度的实现示例
- Python基于time模块表示时间常用方法
- ITK 实现多张图像转成单个nii.gz或mha文件案例
- 一文轻松掌握python语言命名规范规则
- php原生数据库分页的代码实例
- python对一个数向上取整的实例方法