Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >测试代码

测试代码

作者头像
清菡
发布于 2020-12-02 09:13:18
发布于 2020-12-02 09:13:18
9510
举报
文章被收录于专栏:清菡软件测试清菡软件测试

文章总览图

使用Python模块unittest中的工具来测试代码。

一,测试函数

函数get_formatted_name()将名和姓合并成姓名,在名和姓之间加上一个空格,并将它们的首字母都大写,再返回结果。

先创建一个脚本:

再创建第二个脚本:

输出:

1.单元测试和测试用例

单元测试用于核实函数的某个方面没有问题。测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。

全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现全覆盖可能很难。最初只要针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。

2.可通过的测试

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

导入了模块unittest和要测试的函数get_formatted_name()。创建一个NamesTestCase的类,用于包含一系列针对get_formatted_name()的单元测试。可随便给这个类命名,取个与这项测试有关的名字,并包含字样Test。这个类必须继承unittest.TestCase类,这样Python才知道如何运行你编写的测试。

NamesTestCase只包含一个方法,用于测试get_formatted_name()的一个方面。

将这个方法命名为:

test_first_last_name()

因为我们要核实的是只要名和姓的姓名能否被正确地格式化。运行testname_function.py时,所有以test打头的方法都将自动运行。

在这个方法中,我们调用了要测试的函数,并存储了要测试的返回值。

使用实参'janis'和'joplin'调用get_formatted_name(),并将结果存储到变量formatted_name中。

使用了unittest类最有用的功能之一:一个断言方法。断言方法用来核实得到的结果是否与期望的结果一致。

get_formatted_name()应返回这样的姓名,即名和姓的首字母为大写,且它们之间有一个空格。

因此我们期望formatted_name的值为Jains Joplin。

为检查是否确实如此,调用unittest的方法 assertEqual(),并向它传递formatted_name和 'Janis Joplin'。

代码行:

self.assertEqual(formatted_name,'Janis Joplin')

意思是说:“将formatteed_name的值同字符串'Janis Joplin'进行比较,如果它们相等,就显示OK,如果它们不相等,就说明一下。

输出:

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

3.不能通过的测试

能正确处理包含中间名的姓名,但对其进行测试时,发现它再也不能正确地处理只有名和姓的姓名。

先创建一个脚本:

再创建第二个脚本:

输出:

因为测试未通过时,第1行输出只有一个字母E,它指出测试用例中有一个单元测试导致了错误。

NamesTestCase中:

test_first_last_name()导致了错误。

测试用例包含众多单元测试时,知道那个测试未通过很重要。

标准的traceback。

它指出函数调用:

get_formatted_name('jains','joplin')有问题,因为它缺少一个必不可少的位置实参。

4.测试未通过咋办

不用修改测试,而应修复导致测试不能通过的代码:检查刚对函数所做的修改,找出导致函数行为不符合预期的修改。

要将中间名设置为可选的,可在函数定义中将形参middle移到形参列表末尾,并将其默认值指定为一个空字符串。还要添加一个if测试,以便根据是否提供了中间名相应地创建姓名。

先创建一个脚本:

再创建第二个脚本:

输出:

在get_formatted_name()的这个新版本中,中间名可选的。向这个函数传递了中间名(if middle:),姓名将包含名、中间名、姓,否则姓名将只包含名和姓。

5.添加新的测试

添加方法名为:

test_first_last_middle_name()

方法名必须以test_打头,这样它才会在运行 test_name_function.py 时自动运行。在TestCase类中使用很长的方法名是可以的。这些方法的名称必须是描述性的,这才能让你明白测试未通过时的输出。这些方法由Python自动调用,根本不用编写调用它们的代码。

测试函数get_formatted_name(),使用名、姓和中间名调用它,再使用asserEqual()检查返回的姓名是否与预期的姓名(名、中间名和姓)一致。

输出:

二,测试类

针对类的测试通过了,就能确信对类所做的改进没有意外地破坏其原有的行为。

1.各种断言方法

Python在unittest.TestCase类中提供了很多断言方法。6个常用的断言方法。使用这些方法可核实返回的值等于或不等于预期的值、返回的值为True或False、返回的值在列表中或不在列表中。

unittest Module中的断言方法

2.一个要测试的类

类的测试,大部分都是测试类中方法的行为。

首先编写一个AnonymousSurey类。这个类首先存储了一个指定的调查问题,并创建了一个空列表,用于存储答案。这个类包含打印调查问题的方法,在答案列表中添加新答案的方法以及存储在列表中的答案都打印出来的方法。

要创建这个类的实例,只需提供一个问题即可。有了表示调查的实例后,就可使用show_question()来显示其中的问题,可使用store_response()来存储答案,并使用show_results()来显示调查结果。

编写一个脚本:

编写第二个脚本:

输出:

根据问题创建了一个AnonymousSurvey对象。

AnonymousSurvey类可用于进行简单的匿名调查。

3.测试AnonymousSurvey类

对AnonymousSurvey类的行为的一个方面进行验证:如果用户面对调查问题时只提供了一个答案,这个答案也能被妥善地存储。将这个答案被存储后,使用方法assertIn()来核实它包含在答案列表中。

对于这个方法,一个描述性名称是test_store_single_response()。如果测试未通过,通过输出中的方法名得知,在存储单个调查方案方面存在问题。

输出:

4.方法setUp()

在test_survey.py中,在每个测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了答案。unittest.TestCase类包含方法setUp(),只需创建这些对象1次,并在每个测试方法中使用它们。如果在TestCase类中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法。编写的每个测试方法中都可使用在方法setUp()中创建的对象了。

方法setUp()做了2件事:创建1个调查对象。创建1个答案列表。存储这两样东西的变量名包含前缀self(即存储在属性中),因此可在这个类的任何地方使用。

方法setUp()根据类高效地创建实例并设置其属性,以便在类的所有测试方法中都可使用它们。

输出:

运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点。测试引发错误时打印一个E。测试导致断言失败时,打印一个F。这就是运行测试用例时,在输出的第一行中看到的句点和字符数量各不相同的原因。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于“Python”的核心知识点整理大全27
用户10920956
2024/01/19
1370
关于“Python”的核心知识点整理大全27
第一章 简单测试代码
        函数get_formatted_name()将名和姓合并成姓名,在姓和名之间加上一个空格,并将它们的首字母大写,再返回结果。为核实get_formatted_name()像期望中的那样工作,我们比编写一个使用这个函数的程序。程序names.py让用户输入名和姓,并显示整洁的全名。
py3study
2020/01/16
4770
用单元测试让你的python代码更靠谱测试函数单元测试和测试用例测试类
要学习测试,得有要测试的代码。下面是一个简单的函数,它接受名和姓并返回整洁的姓名:
章鱼喵
2018/09/26
1.2K0
用单元测试让你的python代码更靠谱测试函数单元测试和测试用例测试类
关于“Python”的核心知识点整理大全28
用户10920956
2024/01/19
1160
关于“Python”的核心知识点整理大全28
Python入门三部曲(三)
在函数greet_user()中,变量username是一个形参—-函数完成其工作所需要的一项信息.在代码greet_user(‘kobe’)中,值’kobe’是一个实参。
龙哥
2018/10/22
1.2K0
Python基础入门7--编写测试用例
这是第七篇,也是这个基础入门系列的最后一篇内容,简单介绍如何采用 unittest模型编写测试用例。
kbsc13
2019/08/16
5700
python unittest使用基本过程
前言 unittest是python的标准的单元测试框架,能够很好的和自动化测试相结合,并有独立的测试报告框架。 unittest提供了一系列类让测试变得更加容易,下面我们看下unittest的主要构
苦叶子
2018/04/04
1.7K0
python unittest使用基本过程
pytest测试框架和unittest_python性能测试框架
单元测试是开发者编写的一小段代码,用于经验被测代码的一个很小的,很明确的功能是否正确,通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
全栈程序员站长
2022/11/04
6860
测试代码
编写函数或类时,还可为其编写测试。通过测试,可确定代码面对各种输入都能够按要求的那样工作。测试让你信心满满,深信即使有更多的人使用你的程序,它也能正确地工作。在程序中添加新代码时,你也可以对其进行测试,确认它们不会破坏程序既有的行为。程序员都会犯错,因此每个程序员都必须经常测试其代码,在用户发现问题前找出它们。使用Python模块unittest中的工具来测试代码,你将学习编写测试用例,核实一些列输入都将得到预期的输出。你将看到测试通过了是什么样子,测试未通过又是什么样子,还将知道测试未通过如何有助于改进代码。你将学习如何测试函数和类,并将知道应该为项目编写对少个测试。
狼啸风云
2019/01/18
1.3K0
python如何对类进行测试
下面介绍针对类的测试,很多程序中都会用到类,因此能够证明你的类能够正确地工作会大有裨益。如果针对类的测试通过了,你就能确信对类所做的改进没有意外地破坏其原有的行为。
狼啸风云
2019/03/19
4.5K0
python接口自动化测试 - unittest框架基本使用
这是比较常见的断言方式,当然还有一些比较容易理解的断言方式就没有一一举例啦,具体可以看看下面列表
小菠萝测试笔记
2020/06/09
6290
Python单元测试框架unittest使用全解析(文末赠书)
unittest是Python语言自带的单元测试框架,不仅适用于单元测试,还可以适用于web自动化测试,提供了很多断言方法,可以组织执行测试用例,生成测试结果等。
吾非同
2021/11/16
1.4K0
Python单元测试框架unittest使用全解析(文末赠书)
程序员必备技能之单元测试
单元测试,就是对单元进行测试,英文叫 unit testing,是指对软件中的最小可测试单元进行检查和验证,比如一个函数,一个类。
somenzz
2020/11/25
8660
Python 单元测试(unittest
项目的整体结构可以参考“软件目录开发规范”,这里单说测试目录。一般都是在项目里单独创建一个测试目录,目录名就是“tests”。 关于目录的位置,一种建议是,在项目名(假设项目名是Foo)的一级子目录下创建二级子目录 “Foo/foo/tests” 。但是这样可能是因为用起来不方便,有很多是按下面的做法。不过下面的示例我还是用这个方法来创建测试目录。 还可以把测试目录向上移一层,作为一级子目录,直接创建在项目之下 “Foo/tests”。参考django、scrapy、flask都是这样的做法。
py3study
2020/01/03
8330
Python模块——unittest 单
之所以称为框架是它代替开发人员完成了一些调用、IO等与单元测试无直接关系的支撑代码,让开发人员可以专注与测试用例的编写,简化单元测试工作。
py3study
2020/01/10
5630
Python单元测试
#单元测试 import unittest def get_formatted_name(first,laster): a = first + " " + laster return a class NamesTestCase(unittest.TestCase): #继承测试类 '''测试name_function.py''' def setUp(self): '''这里填写公用的调用类,后面直接进行测试即可''' def test_first_last_name(self): #tes
陈不成i
2021/06/21
6110
python接口自动化测试 - unittest框架suite、runner详细使用
前三个文件是包含了单元测试类的文件,第四个文件是负责运行所有单元测试类,不包含测试用例
小菠萝测试笔记
2020/06/09
7130
python接口自动化测试 - unittest框架suite、runner详细使用
unittest自动化测试框架_unittest批量加载用例
测试框架-unittest,相当于是一个 python 版的 junit。python 里面的单元测试框架除了 unittest,还有一个 pytest 框架,这个实际上用的比较少,后面有空再继续介绍和分享。unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测
全栈程序员站长
2022/11/04
8440
单元测试方法以及实例
Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]。其中测试阶段通过人工或自动来运行测试某个系统的功能。目的是检验其是否满足需求,并得出特定的结果,以达到弄清楚预期结果和实际结果之间的差别的最终目的。
汪凡
2019/02/22
9900
UnitTest测试框架全栈详解
从软件架构的⻆度来说,测试最重要的步骤是在软件开发的时候界入比较好,所以在早期测试的界入,从软件经济学的⻆度上来说,发现的问题解决成本低,投入的资源比较少。因此,对一个测试的系统,开始最佳的测试就是源代码级别的测试,也就是单元测试阶段,这个过程也被成为白盒测试。单元测试是最基本也是最底层的测试类型,单元测试应用于最基本的软件代码,如类,函数。方法等,单元测试通过可执行的断言检查被测单元的输出是否满足预期结果。在测试金字塔的理论上来说,越往下的测试投入资源越高,得到的回报率越大,⻅测试金字塔模型:
无涯WuYa
2021/11/16
7620
UnitTest测试框架全栈详解
相关推荐
关于“Python”的核心知识点整理大全27
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档