php编写一个学生类_Python零基础入门之编写测试实例
测试函数
首先是给出用于测试的代码,如下所示,这是一个接收姓和名然后返回整洁的姓名的函数:
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 unittest
class 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.001s
OK
上述是给了一个可以通过的例子,而如果测试不通过,输出是怎样的呢,如下所示:
# 添加中间名
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()
输出结果如下,这里会打印错误发生的地方和错误原因:
E
======================================================================ERROR: 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.001s
FAILED (errors=1)
很明显是因为缺少 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 个断言方法:
这些方法都只能在继承了 unittest.TestCase 的类中使用这些方法。
编写针对类的测试
首先,编写用于进行测试的类,代码如下所示,这是一个用于管理匿名调查问卷答案的类:
class AnonymousSurvey():'''收集匿名调查问卷的答案'''def __init__(self, question):''':param question:'''self.question = question self.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 unittest
class 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.000s
OK
注意,这里运行成功,打印一个句号,因为是运行两个测试方法成功,所以打印了两个句号;如果运行出错,打印一个 E ;测试导致断言失败,打印一个 F 。
关注+转发。私信小编“零基础”获取全套Python零基础资料大礼包。
来源:本文为第三方转载,如有侵权请联系小编删除。
php编写一个学生类_Python零基础入门之编写测试实例相关推荐
- 编写一个学生类 student,包含的属性有学号、姓名年龄,将所有学生存储在一个数组中
编写一个学生类 student,包含的属性有学号.姓名年龄,将所有学生存储在一个数组中,自拟数据,用数组的初始化方法给数组赋值,并实现如下操作: ①将所有学生年龄增加一岁 ②按数组中顺序显示所有学生信 ...
- 计算机最低分怎么英语,编写一个学生类 有年龄 英语、数学、计算机三门成绩 求平均分、最高分、最低分...
/*编写一个学生类 有年龄 英语.数学.计算机三门成绩 求平均分.最高分.最低分 */ package test; class Student{ private String name; privat ...
- java编写一个学生类和教师类_JAVA:1、编写一个学生类,类名为Student,包含如下成员:...
1.编写一个学生类,类名为Student,包含如下成员:成员变量:1)变量名:name:类型:String:访问权限:private2)变量名:ID:类型:String:访问权限:private3) ...
- 编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、数学课(Math)和平均值(avg),方法包括求三门课的平
问题: 编写一个学生类(Students),包括姓名(name).性别(sex).学号(num).语文课(Chinese).英语课(English).数学课(Math)和平均值(avg),方法包括求三 ...
- //编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg)
//编写一个学生类(Students),包括姓名(name).性别(sex).学号(num).语文课(Chinese).英语课(English). //数学课(Math)和平均值(avg),方法包括求 ...
- 编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg),方法包括求三门
//编写一个学生类(Students),包括姓名(name).性别(sex).学号(num).语文课(Chinese).英语课(English). //数学课(Math)和平均值(avg),方法包括求 ...
- 编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 数学课(Math)和平均值(avg),方法包括求
/编写一个学生类(Students),包括姓名(name).性别(sex).学号(num).语文课(Chinese).英语课(English). //数学课(Math)和平均值(avg),方法包括求三 ...
- 编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg),方法包括求
题目:编写一个学生类(Students),包括姓名(name).性别(sex).学号(num).语文课(Chinese).英语课(English). //数学课(Math)和平均值(avg),方法包括 ...
- //编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg),方法包括求
//编写一个学生类(Students),包括姓名(name).性别(sex).学号(num).语文课(Chinese).英语课(English). //数学课(Math)和平均值(avg),方法包括求 ...
最新文章
- DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)
- iOS SEL类型和创建
- iterator与const_iterator及const iterator区别
- 【STM32】窗口看门狗
- MySql错误1045 Access denied for user 'root'@'localhost' (using password:YES)
- koa --- [MVC实现之四]Router、Controller、Service的实现
- php reader oleread,请问用phpExcelReader方式,excel文件名字可以是中文吗?
- Java SE作业:判断一个字符串是否是视频文件
- 双机热备、双机互备与 双机双工的区别
- xp每天定时关机命令
- Vue .sync 语法糖
- 安卓虚拟摄像头_谷歌AR新推强大功能:虚拟对象无缝嵌入,可与现实环境交互...
- 关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
- vue3 集成西瓜视频播放器xgplayer
- 一张30年前的大学排行榜!
- Blender:导入obj渲染及导出图片+深度图+法向图
- Python编程运算符 ——算数运算符
- EMQ X 与物联网平台的关系是什么
- 推荐系统之Airbnb推荐:Real-time Personalizaton using Embeddings for Search Ranking at Airbnb
- Unity打包安卓如何存储本地游戏数据?
热门文章
- l298n电机哪一端为正_一文详解电机倒顺开关接法!
- 12道Python基础字符编码数据类型练习题
- php sqlserver jdbc,jdbc sqlserver 分页
- 什么是长连接和短连接?(长链接、短链接)什么时候使用长连接、短链接?
- D455启用IMU后的RGB流故障报错
- opencv python cv2.imdecode()函数报错 :TypeError: Expected cv::UMat for argument 'buf'
- python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)
- python matplotlib绘制等高线,plt.contour(),ax3.contour()和plt.contourf(),ax3.contour(), 同名函数
- 这篇 LaTeX 简单介绍的文章艺术含量很高哒!
- 初学__Python——Python数据类型之数字