登陆注册
71628900000013

第13章 测试与调试

测试是程序中的一个核心概念,从 if 语句的表达式部分就可以见到测试概念的应用与体现。测试是一个过程,是为了检查一个程序的正确性,当然同时也会有另外一个过程,那就是调试(debugging)。调试这个过程是为了追踪一个程序执行时发生了哪些错误。

测试与调试在开发期间是最耗时的工作,虽然都是保证一个软件质量的工作,但却不同。

第一测试:

需要一个详细谨慎的测试计划,这是在写一个程序时不可缺少的一部分内容。虽然实际情况可能与计划有出入,但是能够保证你写程序时有依据可查。

道理上验证一个软件的正确性都是想尽可能针对所有的输入来做测试,但常常是不现实的。我们要针对某一些输入来测试执行程序时的状况,也就是对于输入做分类,会分成不同的子集。

至少我们应该确保一个类的每个方法都要经过测试,这里我们会得到一份方法覆盖率结果。好一点的测试会针对每个语句来进行,这样会得到语句覆盖率结果。

程序常常会在具体的输入情况中导致执行失败,所以要小心谨慎地识别和进行测试。例如,当测试一个方法时,该方法对输入的整数做排序,那么我们会在输入环节考虑一些情况:

1.如果输入时的长度为零,也就是没有任何东西。

2.输入只有一项内容时。

3.输入的内容都是一样的时候。

4.输入的内容已经是排好序的。

5.输入的内容是倒序排列的。

对于一些程序的具体输入来说,也会考虑程序使用的具体结构情况。例如我们用 Python 列表来存储数据的话,我们要考虑索引范围情况会不会越界。因为在插入或删除列表项时要确保正确地完成处理。

当然使用测试套件也是不可缺少的,因为可以提供一些优势来运行程序,尤其在大型的随机生成输入数据方面。在 Python 中会有一个 random 模块,提供了许多有价值的随机数生成,以及随机排序功能。

那么对于一个程序中的类和函数之间的依赖关系,会产生一种等级现象。比如在等级机制中,如果组件 A 依赖组件 B 的话,组件 A 位于组件 B 的上级,又或者当函数 A 调用函数 B 的时候,或者函数 A 需要的一个参数来自一个类的实例。那么测试的思路会有2个,那就是:从上到下,和从下到上。二者的区别在于测试的组件顺序不一样。

从上到下的测试通常体现在 stub 测试中,我们称为存根测试,这是一种测试技术。采用一个存根来代替低层组件,存根的作用是模拟低层组件的原始功能。例如一个函数 A 调用函数 B 是为了得到一个文件的首行内容的话,那么测试 A 的时候,我们可以用一个 stub 函数来代替实际对象函数 B,那么 stub 函数就是返回一个固定的字符串即可。

从下到上执行的是从低层组件到高层组件的测试顺序。例如低层的函数不会涉及其它函数,那么就先要进行对低层函数的测试,然后逐步的测试只会调用低层函数的函数,以此类推。

作为一个类来说,也是类似的,先要测试的类是不依赖任何其它类,然后才会测试与此类有关联的类。

上面所说的这些测试内容常统称为单元测试,在较大的软件项目中会对单独的具体组件功能性进行测试。如果使用正确的话,这种单元测试技术会比测试那些出了问题的组件要好。因为较低层的组件都是经过测试的,测试那些高层组件就会更容易发现问题。

Python 提供了许多自动化测试支持。当函数或类都写在一个模块里的话,测试代码也可以写在这样的模块中。我们把测试代码写在模块的执行区域习语结构中。因为执行区域的代码只会在运行这个模块时执行,而导入模块时不会牵扯到这部分代码块。

更好一点的自动化单元测试会使用 unittest 模块,这是一种测试框架,可以对测试用例进行分组,从而形成更大的测试套件。而且也会提供一些执行测试套件、报告测试结果、分析测试结果的支持。

作为软件的维护来说,会使用回归测试,这会对以前的测试用例进行再次执行,从而确保软件中如果有代码变更的话,都可以发现来防止新 bug 出现在经过测试的组件上。

第二调试:

在 Python 中最直接的调试技术就是使用 print()函数来输出你想查看的变量值。这种方法有一个问题,那就是需要删除或注释掉 print 语句,这样才可以作为软件的最终发布版本。

更好的方法是让程序运行在调试器环境中,Python 提供了 pdb 标准库。调试器支持控制和监视一个运行的程序,最基本的功能就是在你的代码中插入一个断点,作为进入调试器环境的入口点。当程序执行在调试器环境中,会停在含有断点的位置上,那么你就可以查看执行过的变量值了。

Python 的 pdb 模块优势在于可以直接用在解释器环境里。一些其它的 IDE 软件也会提供一种图形化的调试器界面。

同类推荐
  • 丧尸的甜蜜恋爱日记

    丧尸的甜蜜恋爱日记

    某日,丧尸基地。“人类一而再再而三的侵犯我们,让我们一起反抗吧!”一个丧尸高举双手,喊的激动异常。然后,丧尸大军便哗啦啦的一涌而出,世界末日降临。然而,目睹了一切的丧尸王百一很懵逼:我是谁,我在哪,他们要干什么。
  • 快穿之男主没有剧本

    快穿之男主没有剧本

    夏梓萌没想到只是在厕所看了一个杂志激动的当场去世,还绑定了一个男神攻略系统。“嘿嘿,女主们,对不住了,男主是我的了”某女嘴角流下了不明液体。
  • 王者基因之系统觉醒

    王者基因之系统觉醒

    一个基因为王的时代........一个神奇世界的突然出现,让人类迎来了史无前例的巨大盛世。猎杀基因兽获取基因,便是这个世界的旋律.......一个名为沐晨的十四岁少年,提前进入了基因世界之中,偶然获得联邦史上从未出现的王者级基因武装,修神秘功法《乱》,提前觉醒人族至高天赋——王者系统.....从此一飞冲天,以势不可挡之势崛起........
  • 末世之空间在手吃喝不愁

    末世之空间在手吃喝不愁

    她,燕芸居然重生了?!重生在末世降临前的一个月前,而且更重要的是,她似乎有了一个挺大的储存空间。前世被抛弃之仇,燕芸发誓要报仇。同时,暗下决心要保护亲人朋友在末世里生存下去。不过光兽?那又是什么?新书求支持~喜欢点亮小星星噢~么么踹~
  • 我北真心帅

    我北真心帅

    一言不合就开穿,余北北很懵逼。这个说要带她浪遍三千世界的狗系统是假的吧?为什么她会去谈恋爱,谈恋爱也就算了,为什么她要被被那个男人一直追?是这个世界玄幻了,还是她玄幻了。单身不好吗?余北北:我要单身……我要浪狗系统:你瞅瞅你身后那位大佬某大佬:哦?我这么好你不愿意和我在一起?(邪笑)余北北:大佬要烟吗?(给大佬递烟)【全文甜甜,专门虐狗。1v1双洁】
热门推荐
  • 冷傲魔君:霸宠绑来妃

    冷傲魔君:霸宠绑来妃

    逛街也能遇到打劫的,林若表示很无语。看着站在面前的男人,林若表示很无奈。不就多管了个闲事么,有必要绑她过来么?“大哥,我没得罪你吧”“有人花钱买你命”...............你确定我们说的是同一件事情?“我介意多个同伴”“我不介意多个娘子”.林若猛翻白眼..........据说谁想与她同行?先问帝邪答不答应。管你是皇家皇子,还是门派掌舵,近她者,先丢出去再说。林若不解,当初冷酷高傲的男神,去了哪里?能否让他回来。
  • 恋爱元素之酸甜苦辣

    恋爱元素之酸甜苦辣

    一次偶然她遇见了他,又一次过失她失去了他;一次意外他遇见了她,又一次错认他失去了她。
  • 残唐三国

    残唐三国

    《残唐三国》以历史上唐末宋初辽兴的时期为背景,写南唐后主此书称唐兴宗李煜励精图治,文臣武将众多。在北宋讨伐期间,得一奇才李碧,乃李世民嫡系,能文能武。与他的兄弟李猛赵圣解了李煜之围。之后,灭宋征辽,再兴大唐!
  • 萌宠冷蛋蛋:反派趴下,跟我走

    萌宠冷蛋蛋:反派趴下,跟我走

    新书《快穿女配:反派boss攻略手册》欢迎大家关注她是万年扑街小说作者,逗比呆萌,任性消灭文中反派,惨遭神秘读者报复,穿越于各种奇葩任务。他位于上古三神之尊,冷傲绝尘,深情强势,统领万神。无奈居于男配,遭遇无良作者毒手。扑街作者遇上文中反派boss,侥幸成为上古神徒弟一只。无奈文中设定太坑爹,前有白莲花女主强势挡道,后有逆天男主亲手坑妈。自食其果的小扑街,该如何逆转局势,打倒白莲花,扑到冷傲上古神,走上修仙巅峰。扑街君:我对帝君是真爱。反派帝:滚
  • 改画

    改画

    某次机缘巧合,少年段藤觉醒了异能,可以进入画里的世界,画的背后是一个个令人惊奇的故事,为了让画再次活过来,他踏上了一条新的道路
  • 盗墓生涯之天机迷踪

    盗墓生涯之天机迷踪

    生命凋零的最终归宿,万年之前的远古,神话传说中的存在,埋葬于历史文明的真相,这是一个盗墓者的故事。诡异未知的迷局,白山黑水间的古墓,吴明一一挖掘,一步一步揭开真相的面纱。喜欢《盗墓笔记》和《鬼吹灯》的往这儿看。【感谢阅文书评团提供书评支持】
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 下载技能就是爽

    下载技能就是爽

    叮!你下载了目标的五虎刀法,成为了武林高手。叮!你下载了目标的医术,成为了一代名医。叮!你下载了目标的血煞功,成为了秘炼修士。叮!你下载了目标的八九玄功,成为了天界战神。叮!流量不足,请充值…………
  • 相信风雨后必有彩虹

    相信风雨后必有彩虹

    一个女孩的一生是往黑道,还是相信风雨后必有彩虹,总会有柳暗花明的一天
  • 终灵之人

    终灵之人

    善人有生命,恶人也有生命,动物植物都有生命,但是这个拥有灵力的世界,生命显得更加的脆弱…人们叹息着无能为力,但又不得不继续向前。屠夫挥舞着屠刀不分善恶收割生命,有人哭喊,有人惊讶,有人恐惧,但是人们却不会跑远而是逐渐会躲避屠刀,更甚,利用屠刀取走了他人生命……但是人们从始至终都没看到屠夫的脸,逐渐的人们开始适应然后熟练,这……真可怕……屠夫无意,但人却有心,是时候取走屠刀让它重新对待自己,这就是我的目的。————终灵人