首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 测试与调试

先给出上次的小测试答案,如图:

提醒大家,我会将这些代码等资料,还包括中英文Python资料,陆续发到QQ群,名字也叫(Mark学编程),请进群下载使用。

注意,使用了一个相对复杂一点的列表解析式。所谓列表解析就是从一个旧的列表生成一个新的列表。我们今后会专门讨论列表解析和其他什么解析的。

本次测试题目如下:

Question 8

Level 2

Question:

Write a program that accepts a comma separated sequence of words as input and prints the words in a comma-separated sequence after sorting them alphabetically.

Suppose the following input is supplied to the program:

without, hello, bag, world

Then, the output should be:

bag, hello, without, world

编写一程序,接收用逗号隔开的单词序列,然后将其按照字母表排序。比如,现在输入下列单词:

without, hello, bag, world

得出的排序应该是:

bag, hello, without, world

这个测试比较简单,希望独立完成。

今天,我们学习《编程导论》的第六章

测试和调试

这些概念和做法很重要,但初学者了解一下即可,一般用不到。到了真正的程序员阶段,大概就需要掌握这些内容了。作者特别提示,虽然是用Python代码谈这个问题,其核心思想其实是适用于其他语言的。

测试是指运行一个程序并试着检测它是否能正常运行。而调式则是指修复一个已经知道的无法正常工作的程序。测试和调试并不是只有在程序构建完成后才需要思考的问题。优秀的程序员在设计程序时就会让它易于测试和调式。其秘诀就是将程序分解成可以相互独立的进行实现、测试和调式的部件。我们已经学习了函数和类,他们就是模块化的方法。

关于测试,最重要的目的,是要发现程序的错误,是展示程序的错误的。而不是说明它没有错误。比如这个程序: def isBigger(x, y): ‘’‘假定 x, y 是整数,如果 x 小于 y 返回 True, 否则返回 False’’’; 如果在所以整数上运行它,显然是不可能的。但是,我们可以将 x, y 涉及的整数分成若干子集,像下面一样,看完你会有启发的。

x是正数, y是正数;

x是负数,y是负数;

x 是正数,y是负数;

x 是负数,y是正数;

x=0 y=0

x=0 y=/ 0(不等于的意思)

x=/0, y = 0

当然,多数程序,划分输入子集并不容易,但这毕竟是一个方法,希望你意识到。

黑盒测试

基于需求路径的启发式探索成为黑盒测试。一般的来说,黑盒测试并不需要查看测试的代码,这个测试的思想,是从使用者角度来考虑问题的,比如选择另外的人群来测试,而不是程序员本身。因为程序员编写代码时可能是有某种假设的,用另外的人来测试,就容易发现问题。当然,这个黑盒测试,作者还讲了不少,不太好懂,我们略过。

白盒测试

作者提到,永远不要跳过黑盒测试,但仅有黑盒测试是不够的,如果不查看代码的内部结构,就无法判断哪些测试用例能够提供新信息。白盒测试套件通常比黑盒测试套件更容易构建,因为需求通常不太容易完整描述,有时候需求又是不清晰的。所以,我们很难判断一个黑盒测试覆盖了所有重要的输入。相比之下,代码路径是明确定义的,相对来说,容易判断是否覆盖了所有情况。当然,这个有时候又是难以完成的。作者提到循环和递归等,就难以完成的。

执行测试

真正的项目软件测试,工业化的测试,相信都有成熟和固定的做法,据说一个代码测试员工是相对待遇一般的,因为,大体上,你只要执行就行。具体的,我也不清楚。咱们知道书上的这些概念就行。

调试

修复软件错误为何叫调试,有一个美丽的传说,大家应该都知道。但作者提出来更新的版本。我们通常认为,当初里面包含大量继电器的计算机出现错误,是因为一只虫子让继电器短路了。所以,用了debug这个词。就是去除虫子的意思。

现在我们知道,代码错误,不可能是虫子之类的东西主动让你错误的,肯定是你自己造成的,这个毋容置疑。

学习调试

调式是一项需要学习的技能,没有人天生会调试。现在大家常用的编辑器都有调试功能,可以尝试使用使用。当然,据作者,许多有经验的程序员甚至根本不使用调试工具。很多程序员说,最重要的调式工具就是print语句。这可正是笔者的嗜好。要是不是用print语句来理解程序在做什么。

说一千道一万,我们还是调试一下书中的例子吧。以下是个回文的例子,所谓回文就是从左读到尾和从尾读到头顺序都是一样的。如图

作者不愧为MIT牛教授,这么短的代码,也是用了系统的方法来调式。他用的是二分法。

首先在silly函数的大体中间,写了一个print,看结果。具体是放在 if 的前面,你现在将代码写上,运行看看。

显然,错误已经发生,那么继续向上找,将print放到循环的中间,所谓循环中间,可以理解成两次循环中间。运行。还是有错误,只出现一个字符串的列表,这时候,可以考虑 result = [ ] 它了,也很显然,每次循环,它都初始化为空列表,所以,将它移出循环上面。这次,列表到是打印出来了,是输入的三个字符列表,但后面仍然是 yes,就意味着不是回文竟然也 ‘yes’. abc 明显不是回文呀。这时候要往下找了,这次是看看调用的函数 isPal是否有问题。

然后你在 isPal 的里面,在中间放一个print, 比如在 if temp 上面,也许,你如果语法扎实的话,上面的函数调用是有问题的,没有括号。貌似找到问题所在了,然而当你运行时,仍然还是yes。一次打印两个 temp 和 x 发现它们竟然是一样的。啊哈,原来是深copy浅copy的问题。如果你还没有听说这个深浅copy。请反馈信息,我们会专门讨论的。现在将正确的代码附上,供参考。你一定不要先看正确的呀。

春节期间,如果有时间,我会仍然群发微信公众号文章的。请关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190201G10TNU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券