抽奖活动系统是用户通过参与活动获得奖券,然后刮开奖券查询是否获奖。
项目需求和技术方案:
项目需求是测试抽奖活动的中奖概率:
1、中奖率在定义的概率范围内
2、中奖次数不得大于定义的次数
3、所有奖券的状态显示正常
自动化方案:
1、中奖概率在千万级别不可能用人工进行,需要借助自动化。
2、在自动化测试工具的选择上,用Java代码脚本的形式做到千万级别的次数运行时间太长,需要借助并发测试工具。
3、考虑使用Jmeter的接口测试功能,加上并发的功能和顺序执行的逻辑来实现。
实施方案:
考虑到项目的测试需求是测试中奖率,所以只需要选取主要的三个接口进行测试即可。产生奖券 – 刮奖
每个用户经过这个流程,从产生奖券传入用户名参数,返回奖券ID,生成的ID用到刮奖接口中,返回奖券状态。多用户使用Jmeter的CVSRead方法来生成,刮奖使用的奖券ID参数用正则表达式提取器提取出来,作为刮奖接口的参数。通过多用户并发执行产生奖券和刮奖的接口,完成这个业务逻辑的功能测试。
JMeter实施过程
设置3个全局变量,服务器地址,端口号和活动的ID号
新建一个dat文件,供CVSRead函数调用。Dat文件内容为
每行代表一个用户名和用户ID,在Jmeter的选项中调出函数对话框,选择_CVSRead,在第一行中输入dat文件的路径 c:\t.dat, 第二行输入0,然后生成函数${__CSVRead(c:\t.dat,0)}, 调用这个函数的时候,0表示调用第一列的值,1表示调用第二列的值,依此类推。
(这里补充一下,如果涉及到性能测试的多用户并发,使用配置元件中的CSV Data config会好点,因为这里没有涉及到性能上的问题,所以采用这种方式)
正则表达式提取器
1、在产生奖券的请求下面新建一个正则表达式提取器
2、在测试计划下面新建一个查看结果树
3、点击绿色三件按钮执行测试,查看结果树中影响数据:{“resultCode”:”0000”,”resultMsg”:”抽奖成功!”,”resultData”:{“id”:11566355,”userId”:9000,”userName”:”autotest0”,”activeId”:3,”status”:0,”catalog”:null,”prizeId”:null,”recipient”:null,”contact”:null,”address”:null,”province”:null,”city”:null,”area”:null,”orderNo”:null,”deviceType1”:”123456”,”deviceId1”:”123456”,”source”:”test”,”deviceType2”:null,”deviceId2”:null,”deviceType3”:null,”deviceId3”:null,”endTime”:1448935237000,”openTicketTime”:0,”createTime”:1447232320281,”prizeName”:null,”prizePrice”:0.0,”thumbnail”:null}}
4、需要提取的是id后面的值:11566355, 正则表达式为{“id“(.+?), 匹配的是需要的值。
设置刮奖接口
刮奖接口调用产生奖券接口生成的ID,使用JMeter自带的函数表达式即可${ticketId},注意的是,使用通过正则表达式提取器得到的参数,只能是该请求下面的请求才能使用,逆向不可用。
脚本配置完需要设置并发的线程数和执行的时间来进行测试,在线程组中设置,若测试的中奖概率比较小,比如五百万分之一,想要尽快完成测试,线程数需要设置大一点,这里推荐100(按CPU线程数来算,128个线程比较合理),循环次数勾选永远,即测试会不停执行。