历时4个月,从搭建测试框架到给全员培训,再到最终团队内落地,最终效果是整个团队QA测试阶段效率提升60%多。既然有数据就有衡量标准,统计了近2个月的开发阶段/测试阶段的耗时比,比如自动化前,开发阶段/测试阶段耗时比2:1,如今达到5.3:1,简单说开发5人天,测试原来花费2.5人天,现在花费1人天,当然这是平均值。这不仅是单单自动化测试框架的搭建,还需要配合管理手段,如何将自动化测试不单单用于回归测试而是整个QA测试,何时写用例?何时写脚本?何时执行脚本?如何维护脚本?如何给全员培训?(大家代码基础很薄弱,降低学习成本,快速上手很关键)这一整套的配合才能更好的将自动化测试落地。

整个自动化测试框架搭建经历了2个阶段。

第一个阶段:从0到1,提高效率,耗时3个月,主要目标是框架分层以及70多个API接口的几百个场景的覆盖,效果就是上面提到效率提高60%

第二个阶段:核心框架重构和API接口迁移,耗时1个月,主要目标是降低维护和学习成本,通过1,2次培训,可以上手做自动化测试。同时将被测的API接口迁移至新的框架,最终代码量降低了90%,脚本执行时间提高了95%。

框架的作用?

把自动化测试框架比喻成搭积木吧,核心框架的搭建,工具类的封装类似于积木块,按照一定规则写符合各业务需求的用例脚本类似于搭积木,搭积木学习成本较低,只要培训就能上手,按照工具类的方法正确使用,按照框架的层级要求正确拼装,可以使整个团队内自动化测试快速落地。

  • 积木块:

分层大致是    java--base包     作用:获取接口信息并调用接口,ps:具体的接口地址,名称,基础入参存储于数据库里

--driver包   作用:工具类和selenium驱动,包含入参关键词,接口断言,数据库操作等

--operation包   作用:基于 web driver的UI自动化基础操作

以上部分由专人维护,根据业务需要不断补充接口和工具类

  • 搭积木

test--autocase包--bvt   作用:冒烟测试范围的用例脚本,用于回归测试

--api    作用:所有功能测试的用例脚本,用于日常功能测试

这一部分由业务测试人员维护,根据各自负责的需求编写对应的测试脚本,90%以上覆盖手工用例。

对于业务人员如何写脚本呢?以一个BVT级别的脚本为例,测试发红包-抢红包-退红包的场景,整个流程需要6个接口。

脚本分为6步:发红包-发红包查询-抢红包-抢红包查询-退红包-退红包查询。

发红包分为绑卡支付,余额支付2种,退款红包又分为原路退回和退回到余额。针对不同的场景,进行组合,会有4种场景,而脚本的流程是相同的,采用testNG的DataProvider可以参数化,只需要增加测试数据,每个测试数据对应一个用例,随着用例的增加不会显性增加代码数量,大多情况下只需要维护好数据即可。

为了更加清晰,测试数据分为3部分{  用例名称,入参,断言},当然这是比较标准的情况,根据实际接口可以灵活变通。最后脚本如下:

@DataProvider(name = "redpacket_bvt")public Object[][] redpacket_bvt_parm(){return new Object[][]{{"*发红包-绑卡,抢红包,原路退回**","BINDCARD","OLDWAY","{'code':'QM000000','message':'受理成功'}"},{"*发红包-绑卡,抢红包,退回余额**","BINDCARD","BALANCE","{'code':'QM000000','message':'受理成功'}"},{"*发红包-余额支付,抢红包,原路退回**","BALANCE","OLDWAY","{'code':'QM000000','message':'受理成功'}"},{"*发红包-余额支付,抢红包,退回余额**","BALANCE","BALANCE","{'code':'QM000000','message':'受理成功'}"},};}    /*** 发红包-抢红包-退红包* @throws Exception*/@Test(dataProvider ="redpacket_bvt" )public void redpacket_bvt(String name,String payTool,String refundWay,String assertjson) throws Exception{System.out.println(name);//发红包String replacejsonA="{'orderAmount':'0.02','merchantUserId':'"+huiyuanA+"','payTool':'"+payTool+"','bindId':'"+A_bindid+"'}";String resultA = YopApiRedpacket.redpacket_consume(merchant,replacejsonA);ToolUtils.AssertEqualfromJson(resultA, assertjson);ToolUtils.AssertExist(resultA, "requestNo,redOrderNo,orderAmount");TimeUnit.SECONDS.sleep(2);//发红包查询String replacejsonB="{'sendRequestNo':'"+ToolUtils.getJsonValue(resultA, "requestNo")+"'}";String resultB = YopApiRedpacket.redpacket_order_query(merchant,replacejsonB);ToolUtils.AssertEqualfromJson(resultB, assertjson);ToolUtils.AssertExist(resultB, "total,trxTime,effectiveTime,redOrderNo,state,fromUserNo,lastAmount");//抢红包String replacejsonC = "{'trxAmount':'0.01','merchantUserId':'"+huiyuanA+"','redOrderNo':'"+ToolUtils.getJsonValue(resultB, "redOrderNo")+"'}";String resultC = YopApiRedpacket.redpacket_grab(merchant,replacejsonC);ToolUtils.AssertEqualfromJson(resultC, assertjson);ToolUtils.AssertExist(resultC, "requestNo,redOrderNo,grabOrderNo");//抢红包查询String replacejsonD = "{'grabRequestNo':'"+ToolUtils.getJsonValue(resultC, "requestNo")+"'}";String resultD = YopApiRedpacket.redpacket_grab_query(merchant,replacejsonD);ToolUtils.AssertEqualfromJson(resultD, assertjson);ToolUtils.AssertExist(resultD, "requestNo,redOrderNo,grabOrderNo,amount,ppMerchantNo,toUserNo,status,grabTime");//退红包String replacejsonE = "{'redOrderNo':'"+ToolUtils.getJsonValue(resultC, "redOrderNo") +"','refundWay':'"+refundWay+"'}";String resultE = YopApiRedpacket.redpacket_refund(merchant, replacejsonE);ToolUtils.AssertEqualfromJson(resultE, assertjson);ToolUtils.AssertExist(resultE, "requestNo,redOrderNo,refundAmount");TimeUnit.SECONDS.sleep(2);String replacejsonF = "{'redOrderNo':'"+ToolUtils.getJsonValue(resultE, "redOrderNo")+"'}";String resultF = YopApiRedpacket.redpacket_refund_query(merchant, replacejsonF);ToolUtils.AssertEqualfromJson(resultF, assertjson);ToolUtils.AssertExist(resultF, "requestNo,redOrderNo,refundWay,ppMerchantNo,refundAmount,merchantUserId,status,createTime,updateTime,refundTime");}

入参技巧:

1、保存一组基础入参,比如一个接口有5个字段,3个必填项,2个非必填。那么3个必填项是基础入参,存在数据库里,2个非必填根据用例需要在业务层测试数据传入。

2、无论是不是必填项,根据用例场景需要变化的入参在业务层传入,没有传入的取自数据库的基础入参,这样可以减少测试数据的维护成本。

3、定义一些关键词,比如随机数,当前日期等等,看业务需要,作用就不多说了,做过自动化基本都知道。

关键词 含义 示例
@random 随机字符串10位 txt@random = txt1234567890
@date 当前时间 @date = yyyy-MM-dd HH:mm:ss
@merchant 所选测试钱麦商编,如1247 @merchant = BM12345678901247

4、入参格式:统一json形式传递。

{"requestNo":"redf@random","orderAmount":"0.02","merchantOrderDate":"@date","merchantExpireTime":"","serverCallbackUrl":"@serverCallbackUrl","merchantUserId":"qianmai3610","payTool":"BINDCARD","totalNumber":"2","bindId":"262531657","userIp":"10.1.1.1"
}

基于testNG的数据驱动测试的自动化测试实践(一)相关推荐

  1. python 基于ddt实现数据驱动测试

    这篇文章主要介绍了python 基于DDT实现数据驱动测试的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下 简单介绍 ​ ddt(date driver test),所谓数据驱 ...

  2. python数据驱动:基于ddt的数据驱动测试

    一.yaml文件的调用 二.csv文件的数据驱动 三.基于ddt的数据驱动测试 方法1: from selenium import webdriver import unittest from tim ...

  3. mysql数据驱动测试_自动化测试框架-数据驱动(2)

    5.使用Excel进行数据驱动测试 测试逻辑: (1)打开百度首页,从Excel文件中读取测试数据作为搜索关键词 (2)在搜索输入框中输入读取出搜索关键词 (3)单击搜索按钮 (4)断言搜索结果页面中 ...

  4. python数据驱动测试设计_GitHub - 13691579846/DataDriverTestFrameWork: python+selenium+pageobject数据驱动测试框架...

    DataDriverTestFrameWork 一.说明 ``本实例为数据驱动测试框架搭建实践`` 二.框架分析 注意!注意!注意!重要的示请说3遍,本项目只用于学习使用,为了你能够成功执行本项目 e ...

  5. 好代码是管出来的——.Net Core集成测试与数据驱动测试

    软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...

  6. 基于TestNG 与Selenium 的自动化测试设计与实施

    1.引言 软件测试是关系到软件开发和维护成本的重要环节.任何软件产品在正式发布之前都必须经过严格的测试.随着计算机技术的迅速发展,软件的结构越来越复杂,同业竞争越来越激烈.为了保证软件产品的高度可靠性 ...

  7. 【Web自动化测试——代码篇十二】自动化测试模型——数据驱动测试和关键字驱动测试...

    自动化测试模型可以看作自动化测试框架与工具设计的思想.随着自动化测试技术的发展,演化为以下几种模型: 线性测试 模块化驱动侧式 数据驱动测试 关键字驱动测试 数据驱动测试 前一篇所讲的模块化驱动测试能 ...

  8. 基于CNN的自动化测试实践

    基于CNN的自动化测试实践 ReLuQ 交叉学科就像交叉特征一样有趣 已关注 2 人赞同了该文章 写在开头: 本篇是笔者在公司的一个项目,主要与公司测试部一位经验丰富的老哥(曾在华为腾讯任职十年)合作 ...

  9. 基于功能安全的测试实践:ESCL功能安全测试

    概述 整车电子电器软硬件复杂性越来越高,电子系统失效可能导致的安全风险也随之提高,车辆的安全性受到了更大的挑战.本文依据ISO 26262从功能安全测试的角度出发,以ESCL为测试对应,阐述符合功能安 ...

最新文章

  1. Codeforces 671E Organizing a Race (贪心、线段树)
  2. 使用 gpg 加密文件 - 通过 shell 或 php
  3. ABAP Development Tool如何配置代码自动完成的快捷键
  4. PS2019进阶笔记(二)
  5. K8S Learning(2)——集群环境搭建
  6. Linux 设备驱动开发思想 —— 驱动分层与驱动分离
  7. dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用
  8. [转载] jstl获取Parameter参数及switch使用
  9. 微软、谷歌、百度等公司经典面试100题[第1-60题]——自己的实现[转]
  10. Have Fun with Numbers及循环链表(约瑟夫问题)
  11. 平衡二叉树(AVL Tree)
  12. paip. dsl 编程语言优点以及 常见的dsl
  13. uni-app 使用高德地图
  14. TextCNN代码解读及实战
  15. win10网络计算机删除,手把手教你彻底删除win10系统自带的微软拼音输入法-网络教程与技术 -亦是美网络...
  16. 【VMware】VMware Workstation 未能启动 VMware Authorization Service
  17. 动态规划之最大非空子段和
  18. iOS使用百度地图定位,关掉系统定位服务该怎么提示用户打开
  19. 你的博客赚钱了吗?博告网详细介绍
  20. 2018年下半年系统集成项目管理工程师金色考点暨历年真题解析(09年到18年上半年)---软考中级最新

热门文章

  1. 【php学习之路】微信公众帐号
  2. 聊一聊我在移动平台混合开发的经验
  3. 物理机ping通Centos虚拟机,但虚拟机ping不通物理机的解决方法
  4. GD32E230开发笔记-GD32选型
  5. 用“等待-通知”机制优化循环等待
  6. 【懒懒的Python学习笔记二】
  7. 中大型公司的开发流程
  8. 目前安卓模拟器哪个比较好?
  9. 玩客云刷机(2022-3-19亲测)
  10. densefusion代码