使用接口测试活动的中奖概率(随机事件测试)

抽奖活动的中奖事件是个随机事件,用大量的手动测试来检验中奖概率的正确性显然不可取,除了手工对中奖流程,后续处理的校验外,可以和开发配合,使用接口来测试中奖的概率是否符合预期的设计要求。

1.思路:

(1)开发提供中奖的接口,get该接口(此处需要向开发详细了解),每次随机返回以下四个结果:

0--表示未抽中

1--表示抽中1等奖

2--表示抽中2等奖

3--表示抽中3等奖

(2)使用for循环,多次请求该接口,并使用testNG框架中自带的设置多次执行方法和处理多线程的方法,使多个方法并发运行,缩短执行时间,来模拟大数据量下的中奖事件。

(3)对(2)中的中奖事件进行数据处理,获取各类中奖事件的概率。

2.代码

用例代码  LotteryTestCase.java 如下:

package com.krplus.api.autotest.testcase;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.Test;

/**
 * Created by wyy on 2016/4/18.
 */
public class LotteryTestCase {

    @Test(invocationCount =10, threadPoolSize = 10)
    //invocationCount----表示执行本方法的次数,在此表示每执行本方法10次
    //threadPoolSize-----表示开启的多线程个数,此处表示开启100个线程,多个方法并发同时执行,节省运行的时间成本

    public  void testLottery() throws Exception {

        int fail = 0;
        int first = 0;
        int second = 0;
        int third = 0;
        float perfail=0;
        float perfirst=0;
        float persecond=0;
        float perthird=0;
        int m=500;       //设置请求接口get的次数

//        循环使用get方法获取中奖接口的数据,获得中奖的类型数据
        for (int i = 0; i <m; i++) {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpGet get = new HttpGet("http://**********")  //第一次中奖接口,先单个在浏览器中运行看结果是否有异常
           // HttpGet get = new HttpGet("http://**********"); //第二次中奖接口
            CloseableHttpResponse response = httpClient.execute(get);

            try {
                HttpEntity entity = response.getEntity();
                String result = EntityUtils.toString(entity);
                int res=Integer.parseInt(result);  //将中奖的类型为 string类型转化为int类型,

                if(res==0){
                    fail=fail+1;
                    perfail=(float)fail/m;//获取中奖失败的概率

                }else if(res==1){
                    first=first+1;
                    perfirst=(float)first/m;

                }else if(res==2){
                    second=second+1;
                    persecond=(float)second/m;
                }else{
                    third=third+1;
                    perthird=(float)third/m;
                }

            } finally {

                response.close();
            }
        }
        System.out.println("-------中奖次数--------");
        System.out.println("中奖失败的次数为"+fail);
        System.out.println("中一等奖的次数为"+first);
        System.out.println("中二等奖的次数为"+second);
        System.out.println("中三等奖的次数为"+third);

        System.out.println("-------中奖概率--------");
        System.out.println("中奖失败的概率为"+perfail);
        System.out.println("中一等奖的概率为"+perfirst);
        System.out.println("中二等奖的概率为"+persecond);
        System.out.println("中三等奖的概率为"+perthird);

    }

}

3.结果

在testNG.xml中设置用例的路径,执行即可。综上可看,请求接口5000次,每个方法执行500次请求,执行10个该方法,每个方法的结果如下:

[TestNG] Running: 

D:\krplus-api-test\testcase\testcase\Lottery\tesNG.XML

-------中奖次数--------

中奖失败的次数为16

中一等奖的次数为2

中二等奖的次数为9

中三等奖的次数为73

-------中奖概率--------

中奖失败的概率为0.16

中一等奖的概率为0.02

中二等奖的概率为0.09

中三等奖的概率为0.73 

之后和设计中的概率进行对比即可!

在实践过程中的确发现通过这种接口测试可以发现概率和接口方面的问题:

1.第一次中奖时,即使运行1000次,一等奖中奖次数也是0,后来是因为开发重写代码不完整所致

2.运行时抛异常,运行单个接口发现有问题,如下:

其实还是蛮有用的是不撒哈~O(∩_∩)O!

当然具体情况需要具体分析,谁知道后面的 抽奖活动会是甚样设计~

时间: 2024-07-31 01:44:58

使用接口测试活动的中奖概率(随机事件测试)的相关文章

Jmeter测试中奖概率

最近做个项目需要测试中奖概率,又刚换的mac本win上的工具全不能用了,所以想到用jmeter实现. 实现步骤: 1.使用HTTP请求访问接口 2.添加查看结果器查看测试结果 3.添加聚合报告查看次数统计 2.使用JSON提取器提取json返回信息 3.添加调试取样器查看返回某个值的次数 原文地址:https://www.cnblogs.com/rslai/p/12544072.html

抽卡概率的测试

截取了我最近写的一个文档. 关于抽卡概率 1.先验证策划的概率是否有伪概率和用脚本控制的,以下为例子(pro代表倍率,pro6最高) 例子如下: id gold pro1 pro2 pro3 pro4 pro5 pro6 1 88 0 0 0 0 20 30 2 288 0 0 0 0 30 20 3 988 0 0 20 0 15 5 4 1988 10 20 10 0 2 0 5 3888 15 25 20 5 0 0 花钱越多,pro5和pro6倍率最高的实际无法给转到. 这里选择用脚本控

【微信开发】PHP中奖概率经典算法实例

$arr=array("50","30","20"); //这里简单列出三个数 $pro = array_sum($arr); // 概率数组的总精度 foreach ($arr as $key=>$value){ $randnum = mt_rand(1,$pro); if($randnum<=$value){ $res = $value; //这里是中奖的时候,一般$res会赋值和其概率相对应的奖品 break; }else {

VB6中连续使用Randomize对后续随机数出现概率影响测试

'程序的思路是将a,b分别给一个0到num-1的随机数,循环多次,观察(a,b)的所有组合出现的次数,用来反映其出现的概率'测试结果表明连续使用Randomize,出现的(a,b)组合并不是等概率的 Option Explicit Sub Cal(ByVal num As Integer) Dim a, b, i, j, k, n, c() As Long ReDim c(num * num - 1) For i = 1 To 500000 Randomize a = Int(Rnd * num

计算双色球的中奖概率

1 /** 2 * ClassName: LotteryQuestion 3 * @Description: TODO 4 * @category 听到有人忽悠说双色球二等奖比三等奖好中,还说打电话去福彩中心,人说"Yes!" 5 * 很愤慨 这国家到处都是忽悠只缘于你们高中数学真的不及格 6 * 7 * 例如 我们国家福彩中心规则玩法 : 33个红球里选6,16个蓝球里选1 8 * 忽悠: " 2等奖几率大于3等奖 " 9 * 10 * 事实上这里有一个陷阱 11

软件测试之接口测试基础知识接口类型、测试工具

HTTP,webservice,socket HTTP:分为get和post类型 Webservice也分get和post类型.(一般wsdl结尾,即webservice接口) Socket:少见. Http接口测试工具: Jmeter Firefox插件httprequester 在线工具http://www.atool.org/httptest.php postman soapui loadrunner 原文地址:https://www.cnblogs.com/hisweety/p/1084

php实现中奖概率

同事说的一道面试题 function r($data){ $n = rand(0,100); $temp = 0; foreach ($data as $k => $v) { $temp+=$v; if($n<=$temp) { return $k; } } return false; } $r = r(["t"=>0.1,"1"=>0.5,"2"=>1.5,"3"=>10,"4&

接口测试加解密与多环境测试

加密方法 请求加密:摘要加密 把原文或者原始请求中的部分字段做摘要算法的加密,把加密后的结果也放到原始请求中发送. 响应加密:返回的整个响应或者响应中的部分字段被加密,我们需要找到解密办法,还有一个名字叫摘要算法. 加密与签名的区别 加密通常代表是对称加密,这种加密是可以解密的.比如base64,主要用于的数据传输. 签名通常代表是非对称加密,这种加密不可逆不可解密.比如rsa.md5.通常用于认证内容未被篡改. 解密方式 自己解决通用解密算法 需要研发提供加解密的lib 需要加密方提供远程解析

WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)

 接口测试与数据驱动 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚本读取并执行测试的过程. 2 数据驱动与jmeter接口测试 我们已经简单介绍了接口测试参数录入及测试执行的过程,因为大量的测试脚本与测试数据内聚在一起,使得我们的测试脚本的可移植性及可维护性变得很不好,所以我们接下来采取了csv格式表格保存测试数据来驱动测试的方式. 2.1 新建一个csv文件 新建一个txt文档文件,重命名文件,修改文件后缀名为csv,如test.csv,