测试函数

  学习测试,得有测试的代码。下面是一个简单的函数:

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类中可以使用很长的方法名,这些方法名必须是描述性的,这样才能明白测试未通过时的输出。

测试函数——python编程从入门到实践的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Python编程从入门到实践笔记——列表简介 #coding=utf-8 #列表——我的理解等于C语言和Java中的数组 bicycles = ["trek","cann ...

随机推荐

  1. Linux OOM一二三

    Linux开发一般会遇到“/proc/sys/vm/overcommit_memory”,即文件/etc/sysctl.conf中的vm.overcommit_memory,Overcommit的意思 ...

  2. poj2398 Toy Storage 计算几何,叉积,二分

    poj2398 Toy Storage 链接 poj 题目大意 这道题的大概意思是先输入6个数字:n,m,x1,y1,x2,y2.n代表卡片的数量,卡片竖直(或倾斜)放置在盒内,可把盒子分为n+1块区 ...

  3. uniapp登录流程详解uni.login

    uni.login(OBJECT)登录 H5平台登陆注意事项: 微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见普通浏览器上实现微信登陆,并非开放API,需要向 ...

  4. ffmpeg结合SDL编写播放器(一)

    ffmpeg 工具是一个高效快速的命令行工具,进行视音频不同格式之间的转换. ffmpeg命令行 ffmpeg可以读取任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,由 -i ...

  5. SpringBoot:缓存注解@Cacheable详解

    1.查看@Cacheable @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @ ...

  6. vlc for mac设置中文的方法

    VLC for mac是一款mac系统下的多媒体播放器,支持播放MPEG-1.MPEG-2.MPEG-4.DivX.MP3和OGG,以及DVD.VCD.等各种流媒体协议在内的多种协议格式,并且能够对电 ...

  7. Zookeeper请求处理原理分析

    Zookeeper是可以存储数据的,所以我们可以把它理解一个数据库,实际上它的底层原理本身也和数据库是类似的. 一.数据库的原理 我们知道,数据库是用来存储数据的,只是数据可以存储在内存中或磁盘中.而 ...

  8. 设计模式概要 & 六原则一法则

    参考文章 http://blog.csdn.net/sinat_26342009/article/details/46419873 继承vs组合:http://www.cnblogs.com/feic ...

  9. pdf 中画虚线

    <?php require('fpdf.php'); class PDF_Dash extends FPDF { function SetDash($black=null, $white=nul ...

  10. 时间管理GTD

    时间管理—重要紧急四象限法则https://www.jianshu.com/p/30b2ab0dc20e<番茄工作法图解>—— 让你的工作高效起来https://www.jianshu.c ...