欢迎来到~ 初识Python 系列文章 “第七回”,大家好呀~ 我是 清汉
时隔半月鄙人再次浮出水面,水深氧少 ~(不写一篇憋得不行)
本系列最后一篇姗姗来迟~
本篇文章内容较少,但也是必不可少的一篇,不管学习哪种编程语言测试是必不可少的,测试可帮助我们找到程序种的BUG,让我们代码更加完美。写一个好的测试需要我们开动脑筋、发散思维,全方面的对我们的代码进行分析。
这里只介绍了再Python中如何编写测试,至于如何写一个好的测试~~
人生苦短,我学Python~
DIY 7
声明:未打广告,全文知识梳理来源于《Python编程 从入门到实践(第2版)》豆瓣评分9.3
注:例中所有 >>> 符号后为输出结果 - -snip- - 为代码省略位置
知识框图
第11章
测试代码
测试
- 前边的几篇文章学习了函数、类,这里我们学习如何测试这些函数、类。
- 通过测试,可确定我们编写的代码在面对各种输入时都能按照要求的运行工作,在用户发现问题前找出BUG。毕竟程序猿都会犯错,因此经常测试代码是一个良好的习惯。
- 着重对自己编写的函数、类的重要行为进行测试,这样你就可以更加确定自己所做的工作不会破坏项目的其他部分,从而自由的改进既有的代码。如果不小心破化了原来的功能,你马上就会知道,而且能够比较轻松的修复问题。
测试函数
- Python标准库中的模块 unittest 提供了代码测试工具。
- 要为函数编写测试用例,可先导入模块 unittest和要测试的函数,再创建一个继承 unittest.TestCase 的类,并编写一系列方法对函数行为的不同方面进行测试。
断言方法
断言方法 | 用途 |
---|
assertEqual(a, b) | 核实 a == b | assertNotEqual(a, b) | assertNotEqual(a, b) | assertTrue(x) | 核实 x 为 真 | assertFalse(x) | 核实 X 为 假 | assertIn(item, list) | 核实 item 在 list 中 | assertNotIn(item, list) | 核实 item 不在 list 中 | assertisinstance(a, b) | 核实 a 是 b 的实例 | assertisNone(x) | 核实 x 是 None |
def get_formatted_name(first_name, last_name, middle=''):
'''返回整洁的姓名'''
if middle:
full_name = f"{first_name} {middle} {last_name}"
else:
full_name =first_name+' '+last_name
return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(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')
def test_first_last_milld(self):
'''能够正确的处理像 Wolfgang Amaeus Mozart 这样的姓名吗?'''
formatted_name = get_formatted_name('wolfgang', 'mozart', 'amaeus')
self.assertEqual(formatted_name, 'Wolfgang Amaeus Mozart')
if __name__ == '__main__':
unittest.main()
已通过的测试
未通过的测试
测试用例未通过时,有两种情况。
- 测试用例中测试的内容有误,不符合函数的行为;如上面未通过的测试例子,这就需要修改测试了。
- 测试用例条件无误,意味着编写的代码有错。此时应修复导致测试不能通过的代码,找出导致函数行为不符合预期的修改。
测试类
- 测试类与测试函数相差不大,也会用到 unittest 模块以及各种断言方法。
- 下例中使用了方法 setUp()
- unittest.TestCase类包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法。这样在你编写的每个测试方法中,都可以使用setUp()中创建的对象。
class AnonymousSurvey:
'''收集匿名调查问卷的答案'''
def __init__(self, question):
'''存储一个问题,并为存储答案做准备'''
self.question = question
self.responses = []
def show_question(self):
'''显示调查问卷'''
print(self.question)
def store_response(self, new_response):
'''存储单份调查问卷'''
self.responses.append(new_response)
def show_results(self):
'''显示收集到的所有答案'''
for respomse in self.responses:
print(f"- {respomse}")
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
'''测试 survey.py ,针对单个类 AnonymousSurvey 进行测试'''
def setUp(self):
'''方法 setUp() 创建一个调查对象和一组答案,供下列方法使用。'''
question = "What language did you first learn to speak?"
self.my_survey = AnonymousSurvey(question)
self.responses = ['English', 'Spanish', 'Mandarin']
def test_store_single_response(self):
'''测试单个答案是否会被妥善储存'''
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_response(self):
'''测试三个答案是否会被妥善储存'''
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
if __name__ == '__main__':
unittest.main()
本篇小结
- 学习了如何使用 unittest 模块编写测试
- 学习了如何编写继承 unittest.TestCase 的类
- 学习了如何编写测试方法
- 学习了如何使用方法setUp()高效的创建实例
作为初学者,并非为你所有的项目编写测试,然而参与工作量较大的项目时,你应该对自己所编写的函数、类的重要行为进行测试。这样你能够确定自己所做的工作不会破坏项目的其他部分,从而自由的改进既有的代码。
感谢,每一位认真阅读到这里的少侠!来个手滑三联吧,不迷路~
下期见,等你哟~
|