前一陣和開發的同事一起測試某個系統的性能。此係統是發送Ajax請求到後臺,再調用第三方的某項服務。第三方服務的性能由不得我們控制,因此開發人員做了一下改進,超時則直接返回。於是在loadrunner這邊,結果就好看的多了。當時我並沒在意,後來一琢磨,這豈不是說loadrunner不檢查Ajax內容就通過了?爲了驗證這個論斷,做了個簡單的示例。
首先是寫個前端的html,發送Ajax到後臺,再寫個servlet處理請求,返回不同的內容。然後用loadrunner錄製腳本並回放,以驗證對Ajax內容的檢查狀況。
新建一個web項目,添加一個html文件和一個servlet
html內容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用戶註冊</title>
</head>
<body>
<script language="JavaScript">
var flag;
function createXHR(){
if (window.XMLHttpRequest){
return new XMLHttpRequest();
}else{
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
function checkUser(username){
if(!username==""){
var xhr=createXHR();
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
if (xhr.status == 200){
var text = xhr.responseText;// 接收返回內容
if (text == "Existed"){
flag = false;
document.getElementById("msg").innerHTML = "用戶名重複,無法註冊!";
}else{
flag = true;
document.getElementById("msg").innerHTML = "恭喜!此用戶名可以註冊。";
}
}
}
};
//發送用戶名到servlet
xhr.open("POST","CheckName?username="+username,true);
xhr.send(null);
document.getElementById("msg").innerHTML = "正在驗證……";
}else flag=false;
}
</script>
<form action="CheckName" method="post" οnsubmit="return flag">
用戶名:<input type="text" name="username" οnblur="checkUser(this.value)"><span id="msg"></span><br>
密 碼:<input type="password" name="password"><br>
<input type="submit" value="註冊">
</form>
</body>
</html>
這是一個簡單的模擬註冊的頁面,ajax發送輸入的用戶名到後臺。
servlet處理代碼如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String username = request.getParameter("username");
PrintWriter out=response.getWriter();
if(username.equals("zhangsan")){
out.print("Existed");
}else{
out.print("Registered Successfully");
}
}
當輸入的用戶是zhangsan時,ajax返回用戶名已存在的標誌;除此之外返回可以註冊的提示。(爲了模擬網絡延時,停頓500毫秒)
loadrunner錄製的腳本如下:
Action()
{
web_reg_find("Text=用戶註冊",LAST);
web_url("aaa",
"URL=http://192.168.1.102:8080/aaa/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
//web_reg_find("Text=Existed",LAST);
web_custom_request("CheckName",
"URL=http://192.168.1.102:8080/aaa/CheckName?username=zhangsan",
"Method=POST",
"Resource=0",
"Referer=http://192.168.1.102:8080/aaa/",
"Snapshot=t2.inf",
"Mode=HTML",
"EncType=",
LAST);
//web_reg_find("Text=Registered Successfully",LAST);
web_custom_request("CheckName_2",
"URL=http://192.168.1.102:8080/aaa/CheckName?username=lisi",
"Method=POST",
"Resource=0",
"Referer=http://192.168.1.102:8080/aaa/",
"Snapshot=t3.inf",
"Mode=HTML",
"EncType=",
LAST);
web_submit_data("CheckName_3",
"Action=http://192.168.1.102:8080/aaa/CheckName",
"Method=POST",
"Referer=http://192.168.1.102:8080/aaa/",
"Snapshot=t4.inf",
"Mode=HTML",
ITEMDATA,
"Name=username", "Value=lisi", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
LAST);
return 0;
}
註釋中的兩行是手工加的,加上後就可以對Ajax返回的內容進行檢測了。