测试代码(测试函数、测试类)

2023-11-05

测试函数

def get_name(first,last):
    full_name = first + ' '+last
    return full_name.title()
from name import get_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('\nplease give me a last name:')
    if last == 'q':
        break
    
    formatted_name = get_name(first,last)
    print('\tNeatly formatted name:'+ formatted_name )
    

在这里插入图片描述

1.1 单元测试和测试用例

Python标准库中的模块unittest提供了代码测试工具。
单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入,包含针对所有这些情形的测试。
全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现全覆盖可能很难。通常,最初只要针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。

1.2 可通过的测试

要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。

import unittest
from name import get_name

class NameTestCase(unittest.TestCase):
    '''测试name_function.py'''
    def test_first_last_name(self): 
    #方法名必须以test_打头,这样它才会在我们运行py时自动运行
        '''能够正确地处理像Janis Joplin这样的姓名吗'''
        formatted_name= get_name('Janis','Joplin')
        #调用了要测试的函数,并存储了要测试的返回值
        self.assertEqual(formatted_name,'Janis Joplin')
        #断言方法用来核实得到的结果是否与期望的结果一致。
        
'''运行这个文件中的测试'''        
unittest.main()

输出:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

第1行的句点表明有一个测试通过了。接下来的一行指出Python运行了一个测试,消耗的时
间不到0.001秒。最后的OK表明该测试用例中的所有单元测试都通过了。

1.3 不能通过的测试

测试未通过时结果是什么样的呢?我们来修改get_name(),使其能够处理中间名,但这样做时,故意让这个函数无法正确地处理像Janis Joplin这样只有名和姓的姓名。

def get_name(first,middle,last):
    full_name = first + ' '+ middle+' '+last
    return full_name.title()

输出:

E
======================================================================
ERROR: test_first_last_name (__main__.NameTestCase)
能够正确地处理像Janis Joplin这样的姓名吗
----------------------------------------------------------------------
Traceback (most recent call last):
  File "f:\python练习\python\A基础语法\10_测试代码.py", line 22, in test_first_last_name
    formatted_name= get_name('Janis','Joplin')
TypeError: get_name() missing 1 required positional argument: 'last'

----------------------------------------------------------------------
Ran 1 test in 0.001s            #单元测试

FAILED (errors=1)

第1行输出只有一个字母E,它指出测试用例中有一个单元测试导致了错误。接下来,我们看到
NamesTestCase中的test_first_last_name()导致了错误。测试用例包含众多单元测试时,知道哪个测试未通过至关重要。我们看到了一个标准的traceback,它指出函数调用get_formatted_name(‘janis’, ‘joplin’)有问题,因为它缺少一个必不可少的位置实参。我们还看到运行了一个单元测试。最后,还看到了一条消息,它指出整个测试用例都未通过,因为运行该测试用例时发生了一个错误。

1.4 测试未通过时怎么办

def get_name(first,last,middle=''):
    if middle:
        full_name = first + ' '+middle+ ' '+last
    else:
        full_name = first + ' '+last
    return full_name.title()

输出:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

1.5 添加新测试

import unittest
from name import get_name

class NameTestCase(unittest.TestCase):
    
    '''测试name_function.py'''
    def test_first_last_name(self):
        '''能够正确地处理像Janis Joplin这样的姓名吗'''
        formatted_name= get_name('Janis','Joplin')
        #调用了要测试的函数,并存储了要测试的返回值
        self.assertEqual(formatted_name,'Janis Joplin')
        #断言方法用来核实得到的结果是否与期望的结果一致。
    
    **def test_first_last_middle(self):             #新测试
        '''能够正确地处理像Uzi Theshy Deft这样的姓名吗?'''
        formatted_name = get_name('uzi','deft',middle='theshy')
        self.assertEqual(formatted_name,'Uzi Theshy Deft')**
        
'''运行这个文件中的测试'''        
unittest.main()

输出:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

2 测试类

2.1 各种断言方法

unittest Module中的断言方法unittest Module中的断言方法

2.2 一个要测试的类

class Survey():         #survey.py
    '''收集匿名调查问卷的答案'''
    
    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):
        '''显示收集到的所有答案'''
        print('Survey results:')
        for response in self.responses:
            print('-'+response)

调用程序:

from survey import Survey 
#定义一个问题,并创建一个表示调查的AnonymousSurvey对象
question = "What language did you first learn to speak?" 
my_survey = Survey(question) 
#显示问题并存储答案
my_survey.show_question() 
print("Enter 'q' at any time to quit.\n") 
while True: 
 response = input("Language: ") 
 if response == 'q': 
     break 
 my_survey.store_response(response) 
# 显示调查结果
print("\nThank you to everyone who participated in the survey!") 
my_survey.show_results()

2.3 测试Survey 类

import unittest
from survey import Survey

class TestSurvey(unittest.TestCase):
    '''针对Survey类的测试'''
    
    def test_store_single_response(self):
        '''测试单个答案会被妥善存储'''
        question = 'What language did you first learn to speak?'
        my_survey = Survey(question)
        my_survey.store_response('English')
        
        self.assertIn('English',my_survey.responses)
        
    def test_store_three_response(self):
        '''测试三个答案会不会被妥善存储'''
        question = 'What language did you first learn to speak?'
        my_survey = Survey(question)
        responses = ['China','English','Spanish']
        for response in responses:
            my_survey.store_response(response)
        
        for response in responses:
            self.assertIn(response,my_survey.responses)
            

unittest.main()

2.4 方法 setUp()

import unittest
from survey import Survey

class TestSurvey(unittest.TestCase):
    '''针对Survey类的测试'''
    
    def setUp(self):
        '''创建一个调查对象和一组答案,供使用的测试方法使用'''
        question = 'What language did you first learn to speak?'
        self.my_survey = Survey(question)
        self.responses = ['China','English','Spanish']
        
    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)
            

unittest.main()

方法setUp()做了两件事情:创建一个调查对象;创建一个答案列表。存储这两样东西的变量名包含前缀self(即存储在属性中),因此可在这个类的任何地方使用。这让两个测试方法都更简单,因为它们都不用创建调查对象和答案。

注意:
运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E;测试导致断言失败时打印一个F。这就是你运行测试用例时,在输出的第一行中看到的句点和字符数量各不相同的原因。如果测试用例包含很多单元测试,需要运行很长时间,就可通过观察这些结果来获悉有多少个测试通过了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试代码(测试函数、测试类) 的相关文章

  • Python正则表达式替换除特定单词之外的所有内容

    我正在尝试执行以下操作用正则表达式 import re x re compile going you words to replace s I am going home now thank you string to modify pri
  • Spyder 和 Jupyter 有什么区别?

    我正在学习Python用于数据科学 但我的问题是我仍然不明白Spyder和Jupyter之间的区别 我希望你们能帮助我理解其中的区别 我将不胜感激 以下只是这两个工具的基本摘要 Jupyter 是一个非常流行的用于数据分析的应用程序 它是一
  • 配置 PIP 以在代理后面工作

    我已经安装了 python 3 4 3 附带pip 我想从代理后面使用 pip 所以我执行了以下操作 Created C Users foo pip pip ini并添加了代理配置部分 proxy export http proxy my
  • 绘制对数轴

    我想使用 matplotlib 绘制一张带有一个对数轴的图 我一直在阅读文档 但无法弄清楚语法 我知道这可能很简单 scale linear 在情节争论中 但我似乎无法正确理解 示例程序 import pylab import matplo
  • 打开文件路径在 python 中不起作用[重复]

    这个问题在这里已经有答案了 我正在编写一个数据库程序 personica 是我的测试主题 我通常在文件路径的位置有一个变量 但出于测试和演示的目的 我只有一个字符串 在我的计算机上的这个确切位置有一个文本文件 顺便说一句 因为我很偏执 所以
  • 以编程方式结束/退出粘合作业

    我正在使用 Glue 书签来处理数据 我的工作是每天安排的 但也可以 手动 启动 由于我使用书签 有时胶水作业可以在没有新数据要处理的情况下启动 然后读取的数据帧为空 在这种情况下 我想好好地结束我的工作 因为它没有什么关系 我试过 if
  • NLTK:包错误?朋克和泡菜?

    基本上 我不知道为什么会收到此错误 只是为了获得更多图像 这里有一个代码格式的类似消息 由于是最新的 该帖子的答案已经在消息中提到 Preprocessing raw texts LookupError Traceback most rec
  • 如何使用Peewee查询多个相似的数据库?

    我遇到了使用 Peewee 查询多个数据库的问题 我有 2 个现有的 mysql 数据库 让我们将它们命名为 A 和 B 结构相似 因为它是两个 Bugzilla 数据库 我使用 Pwiz 生成模型 modelsA py 和 modelsB
  • Python 中 eval("input()") 和 eval(input()) 之间的区别

    我正在尝试以下功能 x eval input 输入为 123 x 的类型也是int 它工作正常 In 22 x eval input enter enter 123 In 24 print type x
  • “DATETIME_INPUT_FORMATS”在 Django Admin 中不起作用,而“DATE_INPUT_FORMATS”和“TIME_INPUT_FORMATS”则可以

    I use 日期时间字段 https docs djangoproject com en 4 2 ref models fields datetimefield 日期字段 https docs djangoproject com en 4
  • 将具有多个时区的 pandas 列转换为单个时区

    Problem 我在 pandas DataFrame 中有一个列 其中包含带有时区的时间戳 此列中有两个不同的时区 我需要确保只有一个 这是该列末尾的输出 260003 2019 05 21 12 00 00 06 00 260004 2
  • Tensorflow `tf.layers.batch_normalization` 不会向 `tf.GraphKeys.UPDATE_OPS` 添加更新操作

    以下代码 复制 粘贴可运行 说明了如何使用tf layers batch normalization import tensorflow as tf bn tf layers batch normalization tf constant
  • 如何仅在按下某个键时触发鼠标单击?在Python中

    我想制作一个程序 或者当我单击某个键时 鼠标会自动单击 只要我单击该键 如果我不单击该键 它就会停止 我不希望只在触摸按键一次时才发生点击 而是只要按住按键就发生点击 也可以像雷蛇突触鼠标一样按下鼠标左键触发点击 任何想法 EDIT 1 这
  • Django - 渲染到字符串无法加载 CSS

    我正在尝试使用 Django 1 8 render to string 通过管理命令将 html 转换为 pdf 而不是使用 View request 以下代码可以将模板转换为 pdf 但它无法将 CSS 加载到模板中 def html t
  • Hoare Partitioning算法讲解

    根据许多网站给出的伪代码 我写了这个Hoare分区算法 它采用一个数组 根据给定的主元来分区子数组的开始和结束索引 它工作得很好 但是有人可以解释一下逻辑 它是如何做到这一点的吗 这是代码 def hoare arr start end p
  • 如何通过异常值检测方法在周期性或基于序列的数据上生成脉冲作为异常值以进行实验?

    我想对一些时间序列数据进行一些实验KM https scikit learn org stable auto examples cluster plot cluster iris html sphx glr auto examples cl
  • 如何从 PyObject 获取指向字符串的 char*

    我怎样才能得到一个char from a PyObject它指向一个字符串 例如 这是 python 脚本 Test Connect 272 22 20 65 1234 这是 C 代码 static PyObject Connect PyO
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • 如何使用 PySpark 预处理图像?

    我有一个项目 需要为 1 设置大数据架构 AWS S3 SageMaker 的概念验证使用 PySpark 预处理图像 2 执行 PCA and 3 训练一些机器或深度学习模型 我的问题是了解如何使用 PySpark 操作图像数据 但无法在
  • 重写 __cmp__ python 函数

    嗨 我是压倒一切的 cmp 如果传递的第二个对象是None 或者如果它不是一个实例someClass 然后返回 1 我不明白这里到底发生了什么 class someClass def cmp self obj if obj None ret

随机推荐

  • HashMap多个构造方法的理解

    1 创建HashMap除了常用的空方法 Map map new HashMap 2 还有一个入参的 这个入参并不是指创建大小为3的HashMap 而是创建大于3的最小2的n次方大小的HashMap 比如3 实际创建的长度为2 2 4 以此类
  • 一文打通ER图(手把手教你画)

    目录 什么是er图 什么是实体类型 什么是属性 什么是联系 一对一 一对多 多对多 注意点 例题解答 期末了 E R图也是大学课程设计中经常用到的 也是期末考的重点 毕竟大学生也没什么好考的 最近也有不少同学问 不少单子也扯到E R图 但是
  • 你还好吗

    最近突发奇想 假如某一天 我不在 这一行干了 那我又该去找什么样的工作 又该何去何从 活了二十几年 也没培养出什么兴趣爱好 也没什么特长优点 迷茫的人生 迷茫的我 我想听听你们的意见
  • openGauss学习笔记-09 openGauss 简单数据管理-创建数据库

    文章目录 openGauss学习笔记 09 openGauss 简单数据管理 创建数据库 9 1 语法格式 9 2 参数说明 9 3 示例 openGauss学习笔记 09 openGauss 简单数据管理 创建数据库 数据库安装完成后 默
  • 【爬虫进阶】猿人学任务六之回溯(难度3.0)

    目录 前言 分析 扣代码 Js改写 代码过程 结果 前言 本文讲解猿人学web题目第6题 内容难点如下 颜文字 JSUnFuck 分析 打开题目网站 F12 点击XHR 找出数据接口 看到请求参数这里 m是加密的 q是两个时间戳 全局搜索加
  • FindBugs错误修改指南

    1 EC UNRELATED TYPES Bug Call to equals comparing different types Pattern id EC UNRELATED TYPES type EC category CORRECT
  • 圆盘找数

    任务 三 圆盘找数 一 目的与要求 1 目的 使学生掌握数组的概念 阅读 编写和调试数组的要领 通过本实训可加深对于数组 最大值 最小值的理解和加强数组处理 分类求值 最大 小 值得求法等比较技术编程能力的训练 2 要求 1 根据问题域设计
  • VBA中的Application.Calculation,公式的计算方式

    VBA经典应用69例 10178981 是我推出的第九套教程 教程是专门针对初级 中级学员在学习VBA过程中可能遇到的案例展开 这套教程案例众多 紧贴 实战 并做 战术总结 以便大家能很好的应用 教程的目的是要求大家在实际工作中要利用好VB
  • 目标检测论文解读复现之六:基于YOLOv5的遥感图像舰船的检测方法

    目标检测论文解读复现 文章目录 目标检测论文解读复现 前言 一 摘要 二 网络模型及核心创新点 三 应用数据集 四 实验效果 五 实验结论 六 投稿期刊介绍 前言 此前出了目标改进算法专栏 但是对于应用于什么场景 需要什么改进方法对应与自己
  • 【实战】Python爬虫之代理使用详解

    在Python爬虫中 代理的使用非常常见 代理的主要作用是隐藏客户端的真实IP地址 从而实现更高的网络访问速度和更好的访问隐私保护 下面我们将通过Python爬虫的实例 带你详细了解Python爬虫中代理的使用方法 目录 1 代理原理和作用
  • 随机生成小球(万家灯火的感觉)

    事发年前 新冠之前 拿到一张psd 全部静态 老板说想让他动起来 在我们这种老板吃死技术的小公司只能自己想办法 你想要ui no我们只有美工哈哈哈 独立自强的我瞬间想到transition enter leave cubic bezier之
  • 利用Python进行心脏病患者特征分析

    今天要跟大家说到的一个数据集分析 是关于心脏病的 心脏病作为全球第一大杀手 是我们不得不提前防御的疾病 今天我们利用Python从一份心脏病数据集中找出一些规律 看下哪些特征对于确诊心脏病影响比较大 从而提醒我们注意平时的生活规律 数据集介
  • 解决报错error resource androidattrdialogCornerRadius not found

    解决报错error resource android attr dialogCornerRadius not found 1 问题描述 运行Android Studio程序 产生报错error resource android attr d
  • 计算机大三学生怎么找实习工作?学了计算机很迷茫怎么办?

    学了计算机很迷茫怎么办呢 很多计算机大三学生找不到实习工作 也不知道从哪找实习工作 甚至常常怀疑自己的学习有没有意义 今日就由小编为大家简要介绍下吧 学了计算机很迷茫怎么办 学了计算机很迷茫怎么办呢 经常有很多学生发生这样的感慨 事实上绝大
  • sklearn中的fit_transform和transform以及什么时候使用

    在使用sklearn对数据进行预处理的时候很有可能会遇到fit transform和transform 网上不少资料写的模棱两可 在这里我回答几个核心问题 也许看完我写的这篇文章 一些疑惑就会豁然开朗 为什么在训练集进行fit而不在测试集f
  • c++的并归排序怎么写

    答 C 的并归排序的写法如下 1 如果数组只有一个元素 则返回该元素 2 否则 将数组分成两半 3 使用递归 对每一半进行并归排序 4 将排序后的两个子数组合并 5 返回排序后的结果
  • C语言回调函数一个简单的例子

    回调函数通俗的解释 普通函数 你所写的函数调用系统函数 你只管调用 不管实现 回调函数 系统调用你所写的函数 你只管实现 不管调用 以下是使用 语言实现回调函数的一个例子 代码 include
  • Microsoft Excel 无法插入新的单元格,因为这会将非空单元格推送到工作表的末尾...的问题解决

    这个问题的出现应该是最后一行或一列有数据 按以下步骤操作 1 选中文字表格最后一列空白列 随后按ctrl shift 向右 选中整列 点击右键删除 2 选中文字表格最后一行空白列 随后按ctrl shift 向右 选中整行 点击右键删除
  • Springboot 集成 Groovy Script 完整示例

    Springboot 集成 Groovy Script 完整示例 使用Spring Boot集成Groovy Script来实现动态规则解析和执行的Demo 以下是实现步骤 1 创建Spring Boot项目 首先 创建一个Spring B
  • 测试代码(测试函数、测试类)

    测试函数 def get name first last full name first last return full name title from name import get name print Enter q at any