之前我写过两篇关于测试人员要不要学编程的文章,有很多朋友留言给我说,我也很想学呀,可是我办不到呀。

前两篇文章链接如下,没看过的可以尽快回顾下:
《做软件测试到底要不要学编程?》
《技术导向下的业务测试何去何从?》

我理解办不到的原因,因为我全部都亲身感受过,现在我把最突出的几个困境汇总了一下,我们来分别聊一聊。

困境一:一学就会,一写就懵。

学过 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 来进行父窗口类中方法的调用,完美解决。

同样的回过头看看解决方法,真的是很简单,而且也确实给人豁然开朗的感觉,但这又明明就是一个稍微进阶了一下的基本用法而已。

不动手时不知道自己有多弱,上手后才追悔莫及。

建议解决方案:多动手实操练习,每一个遇到的问题,都是自我进阶的阶梯

以上,我通过三个简单的例子