有一個抽獎活動抽到一等獎的概率是萬分之一,您知道怎么測試這個概率嗎?
抽獎活動的中獎事件是個隨機事件,用大量的手動測試來檢驗中獎概率的正確性顯然不可取,除了手工對中獎流程,后續處理的校驗外,可以和開發配合,使用接口來測試中獎的概率是否符合預期的設計要求。
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 = 5) //invocationCount----表示執行本方法的次數,在此表示每執行本方法10次 //threadPoolSize-----表示開啟的多線程個數,和方法執行次數有關, 此處表示開啟5個線程,每2個方法共用同一個線程,多個方法並發同時執行,節省運行的時間成本///不過使用該設置一般用於下面為單個方法執行,此處使用了for循環,所以此處設置不是很有效,可忽略 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=100; //設置請求接口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;//獲取中獎失敗的概率,放在此處會導致每次for循環都執行一次,所以應該放到for循環外 }else if(res==1){ first=first+1; }else if(res==2){ second=second+1; }else{ third=third+1; } } finally { response.close(); } } perfail=(float)fail/m;//獲取中獎失敗的概率 perfirst=(float)first/m; persecond=(float)second/m; perthird=(float)third/m; 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中設置用例的路徑,執行即可。綜上可看,請求接口1000次,每個方法執行100次請求,執行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!
當然具體情況需要具體分析,誰知道后面的 抽獎活動會是甚樣設計~
另外附加一個使用tesNG設置多線程的很好例子,參考 http://blog.csdn.net/manchester117/article/details/7867940