自动化测试中的那些误解和偏见

自动化测试是手工测试的唯一出路么?当我想到这个问题时候,我也觉得好笑。医生是护士唯一的出路么?将军是士兵的唯一出路么?

    因为最近混了一些论坛以及群看别人的讨论。发现好多人认为自动化测试是测试人员的唯一出路。

    工人是农民的唯一出路么?也许是,农民工。为什么想到这个问题,因为发现很多人就是这么认为的,而且认为是唯一出路。

对测试和质量认知有误解的,远不止这个。

有一些公司,比如一些初创公司,对测试人员的考核,非要靠一个硬性的指标,比如:Bug 率,Bug 遗漏率,测试开发比,自动化测试率;

    Bug 率:我搜索一下还真有这玩意。

增大基数,增加无意义代码

把定长循环分开写,写成顺序方法

把可配置信息写死到代码中

大量的复制、粘贴代码

重新发明各种轮子

    Bug 遗漏率:

    开发测试比:

    这个比例并不太能说明测试人员的效率,或者公司对质量的重视程度。

    自动化测试率:

OK, 既然把自动化测试抬得如此高,我们来看看自动化测试是何方神圣。

自动化测试的优点:

1、对程序的回归测试更方便。这可能是自动化测试最主要的任务,特别是在程序修改比较频繁时,效果是非常明显的。由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行,可以极大提高测试效率,缩短回归测试时间。

2、可以运行更多更繁琐的测试。自动化的一个明显的好处是可以在较少的时间内运行更多的测试。

3、可以执行一些手工测试困难或不可能进行的测试。比如,对于大量用户的测试,不可能同时让足够多的测试人员同时进行测试,但是却可以通过自动化测试模拟同时有许多用户,从而达到测试的目的。

4、更好地利用资源。将繁琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例(把节省的人力投入到更有意义的用例设计上)

5、测试具有一致性和可重复性。由于测试是自动执行的,每次测试的结果和执行的内容的一致性是可以得到保障的,从而达到测试的可重复的效果。(脚本的复用性)

6、测试的复用性。由于自动测试通常采用脚本技术,这样就有可能只需要做少量的甚至不做修改,实现在不同的测试过程中使用相同的用例。

7、增加软件信任度。由于测试是自动执行的,所以不存在执行过程中的疏忽和错误,完全取决于测试的设计质量。一旦软件通过了强有力的自动测试后,软件的信任度自然会增加。

自动化测试的缺点:

1、不能取代手工测试

2、手工测试比自动测试发现的缺陷更多,自动化测试不容易发现新的BUG

3、对测试质量的依赖性极大(理解:自动化测试脚本的正常运转前,需要先经过功能测试的通过)

4、测试自动化不能提高有效性(理解:主要从维护脚本的花费资源上来看,并不能节省资源)

5、工具本身并无想像力综上所述,可以归结自动化完成不了的,手工测试都能弥补,两者有效的结合是测试质量保证的关键。

自动化测试,说白了,就是监视开发有没有在开发新功能的时候,把老功能弄坏了。自动化测试的本质是发现变化的东西对不变东西的影响。

我们来看几个实际的例子:

2、老大要求每晚都运行一遍自动化用例或者把用例运行100次,因为他觉得自动化用例运行的越多收益越大。这也是没必要的,因为不变的东西证明一次和证明一百次的结果是一样的。

3、某个公司有专门的测试开发职位。其它的业务小组都是独立的。这个测试开发,就没有啥活干。可业务小组的手工测试做不完,回归次次还得手工,业务小组没法指望测试开发帮忙干活,他们不是一个组的,测试开发也不知道哪些业务是可以自动化的,也不会下沉到业务小组里面去。效率一点都没提升,自动化测试就是个花瓶。

4、某个业务小组准备开展UI自动化,测试A担当重任。结果追求代码的完美,每次还需要code review, 层层封装,代码进展特别缓慢,过不久,整个业务全部重新推倒,case完全没法用。对领导可以说实现了多少自动化,有多么漂亮的代码,代码库里面可查。可其他人继续苦逼的做着手工,就连回归也一点没有减轻负担。

5、某个SQA, 对测试开发说,你给我开发一个系统,要方便我统计质量度量数据,需求么,自己想,一个星期交货。结果可想而知。

我们对自动化测试的各种偏见,是因为我们对它的定位不准确。职位,独立项目组外。要么分配的任务,无法度量并且超过开发的能力。要么追求代码上的数量,而实际没什么效果。

    如果写个小工具,能辅助提高测试效率,算不算自动化测试?

    所以,手工测试和自动化测试是不能分割开的。如果有技术,又做着重复的手工,就一定会思考,如何将其自动化。

    手工测试可以转化为自动化测试,但不是唯一出路。做手工测试的,必须要有将其转化为自动化的能力。做自动化的,必须有项目业务背景。

自动化应该是审视软件研发活动的每一个环节,去发现那些可以被工具化自动化的重复性活动,然后去实现。广义的自动化应该包括但不限于以下环节:

自动化的成本与收益(ROI)

一个过于简化的公式可以这样写:

自动化的收益 = 迭代次数 * 全手动执行成本 - 首次自动化成本 - 维护次数 * 维护成本

或者如果假设迭代次数和维护次数近似相等,这个在某些情况下可以成立,比如一个比较新的产品:

解读:

推论1:什么项目适合自动化

推论2:自动化的介入时间点

推论3:自动化的程度和自动化率

    自动化率同样也要看产品和项目的特性,对于产品的UI部分如果会频繁改动,可以做比较低的自动化。对于接口比较稳定的服务组件可以提高自动化率。

你有什么样的团队,工具和基础设施

管理层的理解程度和支持

自动化测试是一个很专门化的领域,自动化测试又是对工程师的技术广度深度要求很高的工作。对于团队管理和决策者来讲,请不要简单化和孤立看待自动测试。最重要的是确保听取真正理解产品,团队和自动化测试的技术人员的判断。

OK, 以下是用Airtest录制的微信小程序自动化测试。

自动生成的代码如下

# -*- encoding=utf8 -*-
__author__ = "anderson"

from airtest.core.api import *


from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
from airtest.cli.parser import cli_setup

if not cli_setup():
    auto_setup(__file__, logdir=True, devices=[
            "Android:///",
    ])


# script content
print("start...")
poco("android.widget.LinearLayout").offspring("com.tencent.mm:id/dcj").child("android.widget.FrameLayout").child("android.widget.FrameLayout").child("android.widget.FrameLayout").offspring("com.tencent.mm:id/v").child("android.widget.LinearLayout").child("android.widget.RelativeLayout")[1].offspring("com.tencent.mm:id/jq").click()
poco("android.widget.LinearLayout").offspring("com.tencent.mm:id/dcj").child("android.widget.FrameLayout").child("android.widget.FrameLayout").child("android.widget.FrameLayout").offspring("com.tencent.mm:id/v").child("android.widget.LinearLayout").child("android.widget.RelativeLayout")[2].offspring("com.tencent.mm:id/jq").click()
poco("android.widget.LinearLayout").offspring("com.tencent.mm:id/dcj").child("android.widget.FrameLayout").child("android.widget.FrameLayout").child("android.widget.FrameLayout").offspring("com.tencent.mm:id/v").child("android.widget.LinearLayout").child("android.widget.RelativeLayout")[3].offspring("com.tencent.mm:id/jq").click()
poco(text="京豆").click()
poco("android.widget.LinearLayout").offspring("com.tencent.mm:id/dcj").child("android.widget.FrameLayout").child("android.widget.FrameLayout").child("android.widget.FrameLayout")[1].child("android.widget.RelativeLayout").child("android.widget.FrameLayout")[0].offspring("com.tencent.mm:id/ph").click()


# generate html report
# from airtest.report.report import simple_report
# simple_report(__file__, logpath=True)

如何看待这种录制的自动化?个人觉得,在资源缺乏的情况下,这种自动化测试也是很管用的。

为什么对自动化有这么多误解?

作为管理者,就想有个简单的KPI考量机制来考核人。所以会指定一些指标来考核。

    想做有效的管理,就很难绕开度量的问题。在选择度量指标上,大部分管理者总是倾向于关注容易度量的指标,而忽略难以度量的指标。但是容易度量的指标不一定是重要的,难以度量的反而可能是重要的。

说了这么多,提高整个组织的效率才是关键。不管你实现了多少自动化,不论你用何种手段实现自动化,测试的宗旨是在有限的时间和资源内,将可能存在的质量风险尽可能早的暴露出来,并且协助开发尽快解决。

更多精彩,请关注微信公众号:python爱好部落

原文地址:https://www.cnblogs.com/finer/p/11895022.html