zoukankan      html  css  js  c++  java
  • 自动化测试中的那些误解和偏见

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

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

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

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

    有一些公司,比如一些初创公司,对测试人员的考核,非要靠一个硬性的指标,比如: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爱好部落

  • 相关阅读:
    【转】Java操作CSV文件导入导出
    【转】Java压缩和解压文件工具类ZipUtil
    Python之multiprocessing.Pool(创建多个子进程)
    Openstack平台虚拟机疏散失败提示(pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')问题
    kubernetes部署redis主从高可用集群
    Ceph性能测试
    python日志模块
    kubernetes删除pod,pod一直处于Terminating状态
    python执行提示“ImportError: No module named OpenSSL.crypto”
    二进制部署kubernetes集群_kube-apiserver提示"watch chan error: etcdserver: mvcc: required revision has been compacted'
  • 原文地址:https://www.cnblogs.com/finer/p/11895022.html
Copyright © 2011-2022 走看看