登陆注册
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,群聊:311172133】
  • 末世只愿生存下去

    末世只愿生存下去

    2019年9月25日末世来临,唐安安只愿在这残酷,危机四伏的末世里生存下去。
  • 锦鲤男神住隔壁

    锦鲤男神住隔壁

    八荒神域开天辟地至今最倒霉的妖,虽然上有疼爱她的爹娘兄长保驾护航,可还是改变不了她随时随地能表演平地摔跤神技。作为第一个能把自己腿摔断的妖,她承包了八荒神域近千年的笑话。为了改变她的气运值,父母耗费修为帮她得到了一个能转变气运值的机会。史上最倒霉的妖开始在各个界域表演自创杂技。天生自带锦鲤气运的转世锦鲤,好巧不巧总在身边转悠。倒霉妖最大的理想是什么?靠自己的本事完成任务,绝不走捷径!可是谁能告诉她为什么锦鲤还会黑化?假的吧!说好的福运的象征呢?
  • 解忧空间

    解忧空间

    忘忧者,一份古老而神秘的职业,获得这份工作的人便会拥有无尽的寿命,从此不死不灭,唯有自杀才能解脱痛苦,他们存在的意义便是替人忘忧,将他人的忧愁化为一个个酒中世界,并让麾下解忧人服下此酒,在酒中世界替人将原本的忧愁抹去,而现实中忧愁者的忧愁也将消散,忘却忧愁。但第103代忘忧者赵河经营忘忧酒馆,却硬生生把酒馆打造成主神空间……
  • 从超神学院开始的万界行走

    从超神学院开始的万界行走

    推书!《火影之云起传说》,新书起征,求收藏,求支持!!!曾见证盘古开天劈地时的无上伟力,也见证了他的死亡。荒天帝一跃,独断万古之时,我也曾陪伴身边。我行走于诸天万界,见证一个个神话或者传说……我建了一个群,有兴趣的可以加一下,没事可以一起组队游戏???群号:623992558验证答案是:超神学院
热门推荐
  • 你逝在我的青春年华

    你逝在我的青春年华

    有人说,“十五岁的年纪如果遇到对的人便好好珍惜”同样是十五岁的年纪遇到了十五岁的他我的结局会和故事里一样吗。?
  • 情陷太子妃

    情陷太子妃

    我是相府嫡小姐,也是命定太子妃,我想要挣脱命运的锁,可一杯媚酒将我送进深宫,我在他的恨里成了他的妃。谁是藏在暗处推了我一把的人?人前耳鬓厮磨,恩爱缠绵,人后针锋相对恶斗心机,一朝情浓身心交付时才知,情爱于他从来都是一场戏。既如此,你允诺得到你想要的,便放我自由远去,那为何,又霸道的锁住我,留下你的烙印?“颜轻歌,给本王生个孩子就放你离开。”“呸,给你生个老子。”“你又占我便宜!”
  • 罗汉花

    罗汉花

    讲述一个痴迷与武学的青年快意江湖的旅程。
  • 在斗罗重生

    在斗罗重生

    闪电划破天空,带走了一个落寞的灵魂,斗罗大陆上多了一个初生的婴孩。
  • 阿尔的河流

    阿尔的河流

    我因耳鸣而获得了倾听过去的超能力,又因角膜痰而获得了透视内心的能力。但这并末让我解脱,反而成了真正的病。
  • 天行

    天行

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

    兽噬天下

    原本已经无望成为一名兽灵师,只能甘心的做一名普通人……一次际遇,一个村落家族来一直保守着的秘密,让他重新有了希望……可是,际遇的出现并不是想象的那般美好……大陆的消沉,万年之密,万年谋划,万年的等待……都将因为他的改变而揭晓……【新人新书不易,请大家支持下!】
  • 天行

    天行

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

    世界精灵时

    每个人的心中,都有一个梦。我的梦,是希望它,精灵们能来到我们的世界。当一切如梦初醒,世界精灵的时代……已悄悄然开始。欢迎各位来到——《世界精灵时》
  • 山东灵异鬼事

    山东灵异鬼事

    鬼,一个扎眼的字眼,随着现代科技的发展,越来越少的鬼出现,从而现代人渐渐淡忘了这个字眼。许多人会问:鬼真正存在吗?答案是肯定的,只是有极少的一部分人遇到罢了。现在就让我带你们一起追寻屌丝的撞鬼笔记吧!!!!!!!