基于testNG的数据驱动测试的自动化测试实践(一)
历时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的数据驱动测试的自动化测试实践(一)相关推荐
- python 基于ddt实现数据驱动测试
这篇文章主要介绍了python 基于DDT实现数据驱动测试的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下 简单介绍 ddt(date driver test),所谓数据驱 ...
- python数据驱动:基于ddt的数据驱动测试
一.yaml文件的调用 二.csv文件的数据驱动 三.基于ddt的数据驱动测试 方法1: from selenium import webdriver import unittest from tim ...
- mysql数据驱动测试_自动化测试框架-数据驱动(2)
5.使用Excel进行数据驱动测试 测试逻辑: (1)打开百度首页,从Excel文件中读取测试数据作为搜索关键词 (2)在搜索输入框中输入读取出搜索关键词 (3)单击搜索按钮 (4)断言搜索结果页面中 ...
- python数据驱动测试设计_GitHub - 13691579846/DataDriverTestFrameWork: python+selenium+pageobject数据驱动测试框架...
DataDriverTestFrameWork 一.说明 ``本实例为数据驱动测试框架搭建实践`` 二.框架分析 注意!注意!注意!重要的示请说3遍,本项目只用于学习使用,为了你能够成功执行本项目 e ...
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...
- 基于TestNG 与Selenium 的自动化测试设计与实施
1.引言 软件测试是关系到软件开发和维护成本的重要环节.任何软件产品在正式发布之前都必须经过严格的测试.随着计算机技术的迅速发展,软件的结构越来越复杂,同业竞争越来越激烈.为了保证软件产品的高度可靠性 ...
- 【Web自动化测试——代码篇十二】自动化测试模型——数据驱动测试和关键字驱动测试...
自动化测试模型可以看作自动化测试框架与工具设计的思想.随着自动化测试技术的发展,演化为以下几种模型: 线性测试 模块化驱动侧式 数据驱动测试 关键字驱动测试 数据驱动测试 前一篇所讲的模块化驱动测试能 ...
- 基于CNN的自动化测试实践
基于CNN的自动化测试实践 ReLuQ 交叉学科就像交叉特征一样有趣 已关注 2 人赞同了该文章 写在开头: 本篇是笔者在公司的一个项目,主要与公司测试部一位经验丰富的老哥(曾在华为腾讯任职十年)合作 ...
- 基于功能安全的测试实践:ESCL功能安全测试
概述 整车电子电器软硬件复杂性越来越高,电子系统失效可能导致的安全风险也随之提高,车辆的安全性受到了更大的挑战.本文依据ISO 26262从功能安全测试的角度出发,以ESCL为测试对应,阐述符合功能安 ...
最新文章
- Codeforces 671E Organizing a Race (贪心、线段树)
- 使用 gpg 加密文件 - 通过 shell 或 php
- ABAP Development Tool如何配置代码自动完成的快捷键
- PS2019进阶笔记(二)
- K8S Learning(2)——集群环境搭建
- Linux 设备驱动开发思想 —— 驱动分层与驱动分离
- dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用
- [转载] jstl获取Parameter参数及switch使用
- 微软、谷歌、百度等公司经典面试100题[第1-60题]——自己的实现[转]
- Have Fun with Numbers及循环链表(约瑟夫问题)
- 平衡二叉树(AVL Tree)
- paip. dsl 编程语言优点以及 常见的dsl
- uni-app 使用高德地图
- TextCNN代码解读及实战
- win10网络计算机删除,手把手教你彻底删除win10系统自带的微软拼音输入法-网络教程与技术
-亦是美网络...
- 【VMware】VMware Workstation 未能启动 VMware Authorization Service
- 动态规划之最大非空子段和
- iOS使用百度地图定位,关掉系统定位服务该怎么提示用户打开
- 你的博客赚钱了吗?博告网详细介绍
- 2018年下半年系统集成项目管理工程师金色考点暨历年真题解析(09年到18年上半年)---软考中级最新