最小的測試將包括測試計劃,線程組和一個或多個採樣器。html
功能邏輯:wap官網(a.4399sy.com.hk),每一個用戶登陸一次,發帖2次,發帖成功後註銷退出。java
完整實例結構以下:python
步驟一:添加測試計劃web
步驟二:添加線程組正則表達式
步驟三:添加HTTP Cookie 管理器算法
Cookie管理器會自動管理Cookie信息,在web測試中使用普遍。在本實例中,若是沒有添加Cookie管理器,則登陸後,自動重定向後登陸狀態斷言失敗,發帖失敗。json
步驟四:添加HTTP信息頭管理器數組
本元件進行請求header頭管理,本實例中,使用wap官網,需添加微信
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Mobile Safari/537.36app
若是沒有添加UA,則會形成登陸成功後,頁面重定向到PC官網首頁,形成用戶登陸狀態不正確。
步驟五:添加HTTP請求默認值
本元件配置HTTP請求默認值,在其做用範圍內,其他的HTTP Sampler 若是沒有填寫覆蓋默認值,則能夠直接使用默認值。
本實例的全部請求,均在同一個域名內:a.4399sy.com.hk
步驟六:添加參數化CSV數據配置
本元件從csv文件中讀取參數值到jmeter變量中。本實例將登陸用戶名和密碼存放在user.csv中,jmeter運行時將其迭代讀取到對應變量name,pwd 中,後續引用如${name},${pwd}
Recycle on EOF?:False 不重複迭代
Stop thread on EOF?:True csv迭代完成後,退出線程
其中,csv內容以下:
001@126.com,123456 002@126.com,123456
步驟七:添加邏輯控制器:僅一次控制器
本元件,一個線程只執行一次,本實例用於控制一個用戶只登陸一次
步驟八:添加HTTP Sampler:發送登陸請求
本實例,發送請求參數作了參數化,引用步驟六中的變量${name},${pwd}
步驟九:添加斷言:響應斷言
登陸後,頁面重定向到官網首頁,html內容中顯示登陸用戶名,所以響應斷言以下:
步驟十:添加邏輯控制器:循環控制器
本元件在此例中,用於控制用戶登陸後,發帖2次
步驟十一:添加固定定時器
本元件,主要用於相似思考時間
步驟十二:添加HTTP Sampler:發帖留言請求
本Sampler中,引用步驟十三中的前置處理器中定義的變量${content} 和內置函數助手 ${__time(,)}
步驟十三:添加前置處理器:用戶參數
前置處理器,顧名思義,在Sampler 發送以前執行,本實例中,發帖時,用戶_1 和 用戶_2使用不一樣的發帖內容,而且發帖內容賦予給變量${content}
步驟十四:添加斷言:響應斷言
本實例,發帖成功後,返回json中,code=1,發帖失敗,則返回code=-1。因此發帖成功斷言以下:
步驟十五:添加後置處理器:正則表達式提取器
根據發帖響應,用正則表達式將code值提取出來,賦予變量${code_result},用於後續的if控制器。
步驟十六:添加邏輯控制器:IF控制器
本控制器,用於控制本實例中,若是發帖成功,則進行註銷操做。
步驟十七:添加HTTP Sampler:註銷請求
步驟十八:添加斷言:響應斷言
註銷成功後,頁面中再也不記錄用戶狀態,斷言以下:
步驟十九:添加監聽器:查看結果樹
本元件,用於顯示請求與響應信息
步驟二十:添加Debug Sampler
本元件,用於jmeter調試,顯示jmeter變量值
使用BeanShell,對入參進行md5簽名;使用BeanShell ,進行斷言
測試環境準備,訪問 http://10.1.102.75:8000/mock/location/?ip=171.96.0.127&sign=e23c21efbd7c388f62155b4aa09e1a75 返回
{ code: 1, msg: "success", data: { country: "Thailand", countryCode: "TH", city: "Bankok", ipaddress: "171.96.0.127" } }
def location(request): import hashlib ip = request.GET.get("ip") sign = request.GET.get("sign") key = "Milton_PTQA" m = hashlib.md5(str(key + ip).encode()) re_sign = m.hexdigest() if sign == re_sign: ret = { "code": 1, "msg": "success", "data": { "country": "Thailand", "countryCode": "TH", "city": "Bankok", "ipaddress": ip } } else: ret = { "code": 0, "msg": "sign error", "data": [] } return JsonResponse(ret)
1、準備jar包
package com.ssjj.ptqa; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class md5 { public static String toMD5(String plainText) { try { // 生成實現指定摘要算法的 MessageDigest 對象。 MessageDigest md = MessageDigest.getInstance("MD5"); // 使用指定的字節數組更新摘要。 md.update(plainText.getBytes()); // 經過執行諸如填充之類的最終操做完成哈希計算。 byte b[] = md.digest(); // 生成具體的md5密碼到buf數組 int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } // 32位加密 return buf.toString(); // System.out.println("32位: " + buf.toString());// 32位的加密 // 16位的加密 // return buf.toString().substring(8, 24); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } public static void main(String agrs[]) { String sign = new md5().toMD5("b68f05cd86e6633e9e012663ef4727e3203.151.232.104");// 加密LXD System.out.println(sign); } }
2、定義Jmeter變量
key:Milton_PTQA
ip:171.96.0.127 (隨意填IP便可)
3、使用前置BeanShell處理器,進行簽名,並將簽名值賦予變量${sign}
import com.ssjj.ptqa.md5; String ip = vars.get("ip"); String key = vars.get("key"); String pass = new md5().toMD5(key+ip); //log.info("pass="+ip); vars.put("sign",pass);
4、發送HTTP Sampler,引用前置處理器中的變量 ${sign}
5、BeanShell 斷言
import org.json.*; //測試國家 String test_area = "Thailand"; String country = ""; String city=""; Boolean result = false; // 獲取變量值 String ip = vars.get("ip"); // 獲取返回字符串 String jsonString = prev.getResponseDataAsString(); // 將返回字符串構造爲Json對象 JSONObject responseJson = new JSONObject(jsonString); // 獲取json對象中的值 try{ int code = responseJson.getInt("code"); country = responseJson.get("data").get("country").toString(); city = responseJson.get("data").get("city").toString(); }catch(Exception e){ result = true; } if(result){ log.error("jsonString--------->:"+jsonString); } // 斷言 if(!country.equals(test_area) || result || city.length()==0 ){ Failure=true; FailureMessage="Error Response:"+jsonString; }
6、查看結果樹