之前我写过两篇关于测试人员要不要学编程的文章,有很多朋友留言给我说,我也很想学呀,可是我办不到呀。
前两篇文章链接如下,没看过的可以尽快回顾下:
《做软件测试到底要不要学编程?》
《技术导向下的业务测试何去何从?》
我理解办不到的原因,因为我全部都亲身感受过,现在我把最突出的几个困境汇总了一下,我们来分别聊一聊。
学过 Python 的同学,肯定都学习过列表、元组,如果是通过菜鸟教程学习的话,肯定都学习过列表和元组的访问、修改和删除操作。
不知道有多少人还记得第一次看这部分内容的感觉,反正我的感觉是「很简单嘛,和想象中差不多」,那几个操作已经很熟悉了。
有一次我在处理一个字符串拼接,我是用的元组,然后我 append 半天,总是报错,我记得很清楚呀,我学习的时候明明是有这个方法的呀,为毛就是不行呢?
等我回去仔细一看,嘿,append 竟然是列表的方法,这知识点简单么?忒简单了,可以信手拈来么?不行。
举例这个已经是最简单的部分了,类似的我还在多个元素拼接上吭哧过半天,才发现元组必须和元组类型进行拼接,不然也是报错。
如果需要两个元组拼接后不是合成一个元组,而是形成一个新的复合型元组,那就更要纠结一会了。
看完我上面说的是不是觉得很简单,请动手写一写,或者回忆下自己当初是怎么解决这些问题的。
古人云「看书如流水,编码如便秘」,甚是。
建议解决方案:多动手实操练习,真的能熟能生巧噢。
我之前很多的脚本都是 python2.6 写的,因为 py2 已经不更新了,所以我正尝试逐步改为 py3。
有一次我拿一个简单的脚本试试效果,脚本功能很简单,就是把一个 PE 文件内容使用文本方式读取出来,然后暴力搜索其中是否存在某指定字符串,并得出搜索结果。
py2 读取文件内容的写法是:
def test_readfile2(filepath): """读取文件内容 Args: filepath:目标文件全路径 Returns: context:读取到的文件内容 """ with open(filepath, 'r') as obj: context = obj.read() return context
同样的写法,在 py3 中执行会报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x90 in position 2: illegal multibyte sequence
根据之前弱弱的经验,一看也知道是编码的问题,但是我反复的 encode 或者 decode,都是无济于事。
明明知道是很简单的问题,但就是搞不定,那种无奈,实在是很无奈。
一次偶然的机会,终于知道了解法,方法果然很简单:
def test_readfile3(filepath): """读取文件内容 Args: filepath:目标文件全路径 Returns: context:读取到的文件内容 """ with open(filepath, 'r', errors='ignore') as obj: context = obj.read() return context
仅仅是加了一个参数 errors,一切都搞定了,是不是有种豁然开朗的感觉。
建议解决方案:只有自己亲自踩过的坑才是真的坑,一定要多动手实操练习,了解每一种变通的可能。
用 Python 写 GUI 的同学,应该有部分是使用的 wxPython 这个库,反正我是用的这个。
如果只是写个主界面,大家都会定义一个主窗口类,比如 MainClass 之类的,其他控件也可以按教程一步步操作实现。
有次我需要在主界面之外加一个设置窗口,同时设置项更新后,主界面要立刻响应。
这个响应函数我是写到主窗口的类里面的,搞了半天,我就是不知道怎么在子窗口类中调用父窗口类里面的方法,网上也搜了很久,就是没找到有类似的问题以及解决方案。
明明知道是很简单的问题,但就是搞不定,那种无奈,实在是很无奈。
后来仔细看了网上的一些实现的例子,发现可以在父窗口类中把 self 作为参数传递给子窗口,子窗口再通过这个 self 来进行父窗口类中方法的调用,完美解决。
同样的回过头看看解决方法,真的是很简单,而且也确实给人豁然开朗的感觉,但这又明明就是一个稍微进阶了一下的基本用法而已。
不动手时不知道自己有多弱,上手后才追悔莫及。
建议解决方案:多动手实操练习,每一个遇到的问题,都是自我进阶的阶梯。
以上,我通过三个简单的例子,说明了自己在学习 Python 编程中碰到的问题,如果是初阶的同学,应该会感同身受,欢迎也留言说说你曾经碰到的那些坑,如果是高阶的同学,可以留言说下自己的学习经验,让我们也学习下。