一.需求分析

家装节活动需求文档:https://confluence.haohaozhu.me/pages/viewpage.action?pageId=195788812
关于抽奖逻辑的部分:

抽奖基本原则:

仅普通+个人V用户可中奖,具体不可中奖用户限制如下:

B级用户、批量刷交互、设备批量注册、IP批量注册、批量注册、积分反垃圾、被拉黑的设备ID
公司白名单
测试账号
疑似商业用户账号
机器人账号
注册后没有修改过昵称的账号

每人每天1次抽奖机会,每日0点更新抽奖次数,当日抽奖机会仅限当日使用

单个用户活动期间中奖次数不超过2次。

a.首次中奖后,整体心愿商品中奖概率减半
b. 二次中奖后不得中奖
c. 已中奖心愿商品二次中奖概率为0,不存在两次奖品一致的情况

抽奖方式:建立一个动态奖品池,不定时往其中投放奖品,奖池中有奖品时才有机会中奖。

  1. 第一步:运营侧给出每天投放到奖池的商品明细、技术控制分时段随机投放商品(随机后运营需确认大奖投放的时间)
  2. 第二步:用户去抽奖
    1. 若奖池中没有他的心愿商品,直接不中奖
    2. 若奖池中有他的心愿商品,随机取一件他的心愿商品,不同价格的心愿商品中奖概率不同
      1. 200元以下:中奖概率为45%
      2. 201-500元:40%
      3. 501-1000:35%
      4. 1001-2000:30%
      5. 2001-4000:25%
      6. 4000以上:20%
      7. 服务类的(5000元装修基金)中奖概率单独为60%

二.测试用例设计

1.奖品池中的奖品库存不充足

设置抽奖用户10000个 心愿单都只有抱枕 奖品池只有抱枕(数量1) 中奖概率45%

抽奖用户 心愿单 奖品池 设置中奖概率
10000 抱枕 抱枕(1个) 抱枕45%

期望结果:只有一个用户中奖,奖品池为空(已验证)

2.奖品池为空

继续第1条的测试用例用户,后续的抽奖中奖用户为0(已验证)

3.心愿单中的商品与奖品池中商品不重合

抽奖用户 心愿单 奖品池 设置中奖概率
10000 抱枕 冰箱(100个) 抱枕45% 冰箱20%

期望结果:0个用户中奖 (已验证)

4.同一天只能抽奖一次

继续第2条的测试用例用户,当天继续抽奖
期望结果:接口出错,提示“明天再来,今天已用完”(文案待定)(已验证)

5. 第二天中奖概率减半&同一用户不能中两个一样的奖品

抽奖用户 心愿单 奖品池 设置中奖概率
10000 抱枕 电视 冰箱 抱枕(2000个)电视(2000个)冰箱(2000个) 45% 25% 20%

(1)奖品池设置2000个抱枕(中奖概率45%),2000个电视(中奖概率25%),2000个冰箱(20%)
(2)取10000个用户,心愿单设置为:抱枕、电视、冰箱
(3)第一天抽奖预测结果:

中抱枕人数 中电视的人数 中冰箱的人数 未中奖人数
1/345%10000≈1500 1/325%10000≈833 1/320%10000≈667 10000-1500-833-667≈7000

第一天中奖结果

(4)第二天抽奖预测结果:

第一天中奖结果
第二天中奖结果
中抱枕 中电视 中冰箱 未中奖
中抱枕 不可能 1/345%1/2*833≈62 1/345%1/2*667≈50 1/345%7000≈1050
中电视 1/325%1/2*1500≈63 不可能 1/325%1/2*667≈28 1/325%7000≈583
中冰箱 1/320%1/2*1500≈50 1/320%1/2*833≈28 不可能 1/320%7000≈467
未中奖 1500-63-50≈1387 833-62-28≈743 667-50-28≈589 7000-1050-583-467≈4900

第二天中奖结果

6.单个用户中奖不能超过2次

第三天以及以后的抽奖,标黄部分的用户均不能中奖

7. 10个心愿商品都重合的情况

抽奖用户 心愿单 奖品池 设置中奖概率
10000 抱枕 电视 冰箱 椅子 桌子 杯子 窗帘 手机 沙发 服务 抱枕(2000个)电视(2000个)冰箱(2000个)椅子(2000) 桌子(2000) 杯子(2000) 窗帘(2000) 手机(2000) 沙发(2000) 服务(2000) 抱枕45% 电视25% 冰箱20% 椅子40% 桌子35% 杯子30% 窗帘25% 手机20% 沙发35% 服务20%

中其中一个商品的概率 1/1045%10000≈450

8. 5个心愿商品都重合的情况

抽奖用户 心愿单 奖品池 设置中奖概率
10000 抱枕 电视 冰箱 椅子 服务 抱枕(2000个)电视(2000个)冰箱(2000个)椅子(2000) 服务(2000) 抱枕45% 电视25% 冰箱20% 椅子40% 服务20%

中其中一个商品的概率 1/545%10000≈900

三.测试数据准备

  • 数据库hhzhome_member->hhz_token
    1. select * from hhz_token
    2. where uid in (select uid from hhz_token group by uid having count(uid) = 1)
    3. LIMIT 1000
    执行去重结果:
    image.png

将查询的1000个用户导出为csv格式并保存

四.执行过程

jmeter创建线程组:

1.首先,要配置数据库的连接信息,添加setup线程组-添加配置元件 JDBC Connection Configuration,配置上我们用的数据库信息

image.png
添加取样器—JDBC request,创建一个表用来存放提取的结果
image.png
脚本如下:

  1. CREATE TABLE IF NOT EXISTS Springrunresult(
  2. uid varchar(16)
  3. id varchar(16),
  4. name varchar(128)
  5. )ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.模拟一组用户抽奖,设置线程数和Ramp_Up时间:

image.png
2.1添加http请求,并参数化
image.png
2.2.添加配置元件-CSV数据文件设置
image.png
2.3.添加配置元件-查看结果树、响应断言等
image.png

2.4添加后置处理器—JSON提取器
image.png
注意:json提取器一次提取多个,中间用分号隔开,一次提取整个Response的json全部信息,单独用个$即可。

2.5添加取样器—JDBC request,用来向已经创建的表中插入提取的数据:
image.png
脚本如下:

  1. insert into springrunresult values('${uid}','${id}','${name}');

此时数据库中结果如下:
image.png

3.设置tearDown线程组,把数据库中的结果导出:

image.png
脚本如下:

  1. select * from springrunresult into outfile "/var/lib/mysql-files/resul.xlsx" FIELDS TERMINATED BY "\t" ENCLOSED BY '"';

注:数据的插入和导出等 与数据库权限相关,mysql数据库账户要有创建表的权限,没有权限的话第一步就会失败

导出结果,方便统计测试用例中的中奖人数以及中奖次数:
image.png
这样就可以很方便的统计出中奖人数,以及每个人的中奖次数,更有效率的执行测试用例

五. 总结

1.测试执行效率:可以很快速拿到测试用例中每组数据的测试结果,很高效
2.测试用例覆盖:测试用例执行100%覆盖