注册免费网站,西安高端品牌网站,青海网页设计,自学网站建设哪个网站好Python 基础入门前六篇#xff1a;
Python 基础入门–简介和环境配置Python基础入门_2基础语法和变量类型Python基础入门_3条件语句和迭代循环Python基础入门_4函数Python基础入门_5面向对象基础Python基础入门6_文件和异常
这是第七篇#xff0c;也是这个基础入门系列的最…Python 基础入门前六篇
Python 基础入门–简介和环境配置Python基础入门_2基础语法和变量类型Python基础入门_3条件语句和迭代循环Python基础入门_4函数Python基础入门_5面向对象基础Python基础入门6_文件和异常
这是第七篇也是这个基础入门系列的最后一篇内容简单介绍如何采用 unittest 模型编写测试用例。 测试函数
首先是给出用于测试的代码如下所示这是一个接收姓和名然后返回整洁的姓名的函数
def get_formatted_name(first, last):full_name first lastreturn full_name.title()简单的测试代码
first kobe
last bryant
print(get_formatted_name(first, last)) # 输出 Kobe Bryant在 Python 标准库中的模块 unittest 提供了代码测试工具。这里介绍几个名词的含义
单元测试用于核实函数的某个方面没有问题测试用例一组单元测试它们一起核实函数在各种情形下的行为符合要求。全覆盖式测试用例包含一整套单元测试涵盖了各种可能的函数使用方式。
通常最初只需要对函数的重要行为编写测试即可等项目被广泛使用时才考虑全覆盖。
接下来就开始介绍如何采用 unittest 对代码进行测试。
首先是需要导入 unittest 模块然后创建一个继承 unittest.TestCase 的类并编写一系列类方法对函数的不同行为进行测试如下代码所示
import unittestclass NamesTestCase(unittest.TestCase):测试生成名字函数的类def test_first_last_name(self):formatted_name get_formatted_name(kobe, bryant)self.assertEqual(formatted_name, Kobe Bryant)unittest.main()输出结果如下显示运行的测试样例是 1 个耗时是 0.001s。
.
----------------------------------------------------------------------
Ran 1 test in 0.001sOK上述是给了一个可以通过的例子而如果测试不通过输出是怎样的呢如下所示
# 添加中间名
def get_formatted_name(first, middel, last):full_name first middle lastreturn full_name.title()class NamesTestCase(unittest.TestCase):测试生成名字函数的类# 不能通过的例子def test_first_name(self):formatted_name get_formatted_name(kobe, bryant)self.assertEqual(formatted_name, Kobe Bryant)unittest.main()输出结果如下这里会打印错误发生的地方和错误原因
EERROR: test_first_last_middle_name (__main__.NamesTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):File E:/Python_Notes/Practise/unittest_practise.py, line 39, in test_first_last_middle_nameformatted_name get_formatted_name(kobe, bryant)
TypeError: get_formatted_name() missing 1 required positional argument: middle----------------------------------------------------------------------
Ran 1 test in 0.001sFAILED (errors1)很明显是因为缺少 middle 参数如果希望通过测试可以将原函数进行如下修改
def get_formatted_name(first, last, middle):接收姓和名然后返回完整的姓名:param first::param last::return:if middle:full_name first middle lastelse:full_name first lastreturn full_name.title()然后添加新的测试方法继续运行就可以测试通过。
def test_first_last_middle_name(self):formatted_name get_formatted_name(kobe, bryant, snake)self.assertEqual(formatted_name, Kobe Snake Bryant)测试类
上一小节介绍了给函数写测试的代码接下来介绍如何编写针对类的测试。
断言方法
在 unitest.TestCase 类中提供了很多断言方法上一小节就采用了 assertEqual 这一个判断给定两个参数是否相等的断言方法下面给出常用的 6 个断言方法
方法用途assertEqual(a, b)核实 a bassertNotEqual(a, b)核实 a ! bassertTrue(x)核实 x 是 TrueassertFalse(x)核实 x 是 FalseassertIn(item, list)核实 item 在 list 中assertNotIn(item, list)核实 item 不在 list 中
这些方法都只能在继承了 unittest.TestCase 的类中使用这些方法。
编写针对类的测试
首先编写用于进行测试的类代码如下所示这是一个用于管理匿名调查问卷答案的类
class AnonymousSurvey():收集匿名调查问卷的答案def __init__(self, question)::param question:self.question questionself.responses []def show_question(self):显示问卷:return: print(self.question)def store_response(self, new_response):存储单份调查问卷:param new_response: :return: self.responses.append(new_response)def show_results(self):显示所有答卷:return: print(Survey results:)for response in self.responses:print(- response)
这个类包含三个方法分别是显示问题、存储单份问卷以及展示所有调查问卷下面是一个使用例子
def use_anonymous_survey():question 世上最好的语言是language_survey AnonymousSurvey(question)# 显示问题language_survey.show_question()# 添加问卷language_survey.store_response(php)language_survey.store_response(python)language_survey.store_response(c)language_survey.store_response(java)language_survey.store_response(go)# 展示所有问卷language_survey.show_results()if __name__ __main__:use_anonymous_survey()输出结果如下
世上最好的语言是
Survey results:
- php
- python
- c
- java
- go然后就开始编写对该类的测试代码同样创建一个类继承 unittest.TestCase 然后类方法进行测试代码如下所示
import unittestclass TestAnonmyousSurvey(unittest.TestCase):def test_store_single_response(self):测试保存单份问卷的方法:return:question 世上最好的语言是language_survey AnonymousSurvey(question)language_survey.store_response(php)self.assertIn(php, language_survey.responses)
unittest.main()上述代码采用了 assertIn 断言方法来测试函数 store_response()。
这里还可以继续测试能否存储更多的问卷如下所示测试存储三份问卷 def test_store_three_response(self):question 世上最好的语言是language_survey AnonymousSurvey(question)responses [c, php, python]for response in responses:language_survey.store_response(response)for response in responses:self.assertIn(response, language_survey.responses)最后在 unittest.TestCase 中其实包含一个方法 setUp() 它的作用类似类的初始化方法 __init()__它会在各种以 test_ 开头的方法运行前先运行所以可以在这个方法里创建对象避免在每个测试方法都需要创建一遍所以上述代码可以修改为
class TestAnonmyousSurvey(unittest.TestCase):def setUp(self):创建一个调查对象和一组答案:return:question 世上最好的语言是self.language_survey AnonymousSurvey(question)self.responses [c, php, python]def test_store_single_response(self):测试保存单份问卷的方法:return:self.language_survey.store_response(self.responses[1])self.assertIn(php, self.language_survey.responses)def test_store_three_response(self):for response in self.responses:self.language_survey.store_response(response)for response in self.responses:self.assertIn(response, self.language_survey.responses)
运行后输出结果如下
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOK注意这里运行成功打印一个句号因为是运行两个测试方法成功所以打印了两个句号如果运行出错打印一个 E 测试导致断言失败打印一个 F 。 参考
《Python编程–从入门到实践》 小结
Python 的基础入门系列就介绍到这里最初第一篇初步制定的计划是如下所示
简介和环境配置变量和简单的数据类型列表和元组字典if 条件语句for / while循环语句函数类文件和异常测试代码
刚好基本都介绍上述 10 个方面的知识后续还会有进阶的知识点包括函数和类的高级知识点正则表达式网络编程方面的如进程和线程知识当然还会总结或者翻译一些不错的介绍 Python 技巧的文章以及一些常用库的使用方法比如 numpy、pandas、matplotlib 等等。
当然还有就是努力做一些有趣的项目。
本文的代码例子也都上传到我的 Github 上
https://github.com/ccc013/Python_Notes/blob/master/Practise/unittest_practise.pyhttps://github.com/ccc013/Python_Notes/blob/master/Practise/unitest_class_example.py