nGrinder 测试脚本 Post 方法

        本文介绍nGrinder测试脚本实现HTTP Post 请求。

        nGrinder脚本结构

[
...
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请求提供数据。

Header定义

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定义

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)

方法定义

# 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__ 方法

在Python语言中,调用__call__就意味着所有的test都会别调用。在这个方法里可以看到page1和page2会被调用。

下面就来介绍一个完整的实现POST请求的脚本

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 为退出系统


你可能感兴趣的:(post,nGrinder)