本文介绍nGrinder测试脚本实现HTTP Post 请求。 html
nGrinder脚本结构 java
[ ... import statements ... ] [ ... header definitions ... ] [ ... url definitions ... ] [ ... request and test definitions ... ] class TestRunner: [ ... method definitions - a method is defined for each recorded page ... ] def __call__(self): [ ... calls to defined methods, which actually runs the requests ... ] [ utility function (I'll go over this later) ] [ ... calls to utility function to wrap/instrument tests (I'll go over this later) ... ]引用语句
from net.grinder.script import Test from net.grinder.script.Grinder import grinder from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest from HTTPClient import NVPair
以上是引用所须要的类。Test 和 grinder均可以访问内部的测试架。HTTPPluginControl, HTTPRequest是操做HTTP请求。NVPair 则是为POST请求提供数据。 spring
Header定义 app
connectionDefaults = HTTPPluginControl.getConnectionDefaults() httpUtilities = HTTPPluginControl.getHTTPUtilities() connectionDefaults.defaultHeaders = \ ( NVPair('Accept-Language', 'en-us,en;q=0.5'), NVPair('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'), NVPair('Accept-Encoding', 'gzip,deflate'), NVPair('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11'), )第一条语句是建立 HTTPPluginConnection 对象来控制链接,然后就是定义了它默认的header。
URL定义 jsp
url0 = 'http://SpringMvc.com'Request and test 定义
在这里须要定义实际请求中用到的Test和Request 测试
request101 = HTTPRequest(url=url0, headers=headers0) request101 = Test(101, 'POST processLogin.jsp').wrap(request101) request102 = HTTPRequest(url=url0, headers=headers0) request102 = Test(102, 'GET home.jsp').wrap(request102) request201 = HTTPRequest(url=url0, headers=headers1) request201 = Test(201, 'GET popUpTask.jsp').wrap(request201)
方法定义 this
# A method for each recorded page. def page1(self): """GET / (requests 101-104).""" result = request101.GET('/') grinder.sleep(307) # Expecting 302 'Moved Temporarily' request102.GET('/slices/infusion-crm.gif') grinder.sleep(29) # Expecting 302 'Moved Temporarily' request103.GET('/login/defaultLogin.jsp') self.token_msg = \ httpUtilities.valueFromLocationURI('msg') # 'Whoa,+easy+there+tiger.+You\'re+gonna+nee...' grinder.sleep(24) request104.GET('/index.jsp' + '?msg=' + self.token_msg) return result def page2(self): """POST processLogin.jsp (requests 201-202).""" # Expecting 302 'Moved Temporarily' result = request201.POST('/login/processLogin.jsp', ( NVPair('username', 'vivin'), NVPair('password', 'abAB12!@'), NVPair('Login', 'Login'), ), ( NVPair('Content-Type', 'application/x-www-form-urlencoded'), )) grinder.sleep(72) request202.GET('/Admin/home.jsp') return result在这里能够看到全部的请求页面,page1和page2
__call__ 方法 url
在Python语言中,调用__call__就意味着全部的test都会别调用。在这个方法里能够看到page1和page2会被调用。
spa
下面就来介绍一个完整的实现POST请求的脚本 code
from net.grinder.script import Test from net.grinder.script.Grinder import grinder from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest from HTTPClient import NVPair connectionDefaults = HTTPPluginControl.getConnectionDefaults() httpUtilities = HTTPPluginControl.getHTTPUtilities() connectionDefaults.defaultHeaders = \ [ NVPair('Accept-Encoding', 'gzip, deflate'), NVPair('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), NVPair('User-Agent', 'Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/15.0 /15.0a1'), NVPair('Accept-Language', 'en-us,en;q=0.5'), ] headers1= \ [ NVPair('Referer', 'http://SpringMvc.com/login'), ] headers2= \ [ NVPair('Referer', 'http://SpringMvc.com/welcome'), ] url0 = 'http://SpringMvc.com' # Create an HTTPRequest for each request, then replace the # reference to the HTTPRequest with an instrumented version. # You can access the unadorned instance using request101.__target__. request101 = HTTPRequest(url=url0) request101 = Test(101, 'GET welcome').wrap(request101) request102 = HTTPRequest(url=url0) request102 = Test(102, 'GET login').wrap(request102) request201 = HTTPRequest(url=url0, headers=headers1) request201 = Test(201, 'POST j_spring_security_check').wrap(request201) request202 = HTTPRequest(url=url0, headers=headers1) request202 = Test(202, 'GET welcome').wrap(request202) request301 = HTTPRequest(url=url0, headers=headers2) request301 = Test(301, 'GET j_spring_security_logout').wrap(request301) request302 = HTTPRequest(url=url0, headers=headers2) request302 = Test(302, 'GET logout').wrap(request302) class TestRunner: # A method for each recorded page. def page1(self): """GET welcome (requests 101-102).""" # Expecting 302 'Moved Temporarily' result = request101.GET('/welcome') request102.GET('/login') return result def page2(self): """POST j_spring_security_check (requests 201-202).""" # Expecting 302 'Moved Temporarily' result = request201.POST('/j_spring_security_check', ( NVPair('j_username', 'test_user'), NVPair('j_password', '123456'), NVPair('submit', 'submit'), ), ( NVPair('Content-Type', 'application/x-www-form-urlencoded'), )) request202.GET('/welcome') return result def page3(self): """GET j_spring_security_logout (requests 301-302).""" # Expecting 302 'Moved Temporarily' result = request301.GET('/j_spring_security_logout') request302.GET('/logout') return result def __call__(self): """Called for every run performed by the worker thread.""" self.page1() # GET welcome (requests 101-102) grinder.sleep(xxxx) self.page2() # POST j_spring_security_check (requests 201-202) grinder.sleep(xxxx) self.page3() # GET j_spring_security_logout (requests 301-302)此场景很简单,page1 为登陆页面,page2为输入名称密码登陆,page3 为退出系统