`
hugo
  • 浏览: 2702 次
  • 性别: Icon_minigender_1
  • 来自: 上海/柏林
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用JMeter测试Seam+JSF应用

阅读更多

为了从grinder繁琐的script里解脱出来,决定压力测试平台改用JMeter。

 

以测试一个seam login功能为例。基本步骤如下

1. 自动为threadgroup生成request sampler

首先在workbench中加入http proxy server并开启,改browser设置通过http proxy server并访问测试网站的登入页面,之后输入测试账号登入。这时JMeter自动抓取requests,包括对其他resource例如图片,js等的request.这里我们只关心两个requests.一个是开启页面的,第二个是登入时的。所以保留这两个requests,其他统统删除。这个也可以通过在http proxy server中加exlusive filter来完成。

 

2.自动获取viewId

JSF让人火大的一个地方就是它隐藏在代码中的viewId, 在JSF1.2里,request中viewId不对立即会引发view can not be restored exception。而viewId在session里又是时常改变的。解决的方法是创造一个extractor,在每次request后parse 相应,分析出里面的viewId,具体实现可参考http://rfeest.blogspot.com/2008/02/jmeter-und-jsf.html

 

3.增加cookie manager

在threadgroup里添加http cookie manager来保持sessionId

 

这里是完整的testplan,因为request sampler是用proxy产生的,所以非常的冗长

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.1">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Testplan" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="Benutzer definierte Variablen" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread-Gruppe" enabled="true">
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Schleifen-Controller (Loop Controller)" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">1</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">1</stringProp>
        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
        <longProp name="ThreadGroup.start_time">1234863597000</longProp>
        <longProp name="ThreadGroup.end_time">1234863597000</longProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>
      <hashTree>
        <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
          <collectionProp name="CookieManager.cookies"/>
          <boolProp name="CookieManager.clearEachIteration">false</boolProp>
        </CookieManager>
        <hashTree/>
        <OnceOnlyController guiclass="OnceOnlyControllerGui" testclass="OnceOnlyController" testname="Once Only Controller" enabled="true"/>
        <hashTree>
          <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="/sd4/home.seam" enabled="true">
            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
              <collectionProp name="Arguments.arguments"/>
            </elementProp>
            <stringProp name="HTTPSampler.domain">ws029</stringProp>
            <stringProp name="HTTPSampler.port">8080</stringProp>
            <stringProp name="HTTPSampler.protocol">http</stringProp>
            <stringProp name="HTTPSampler.contentEncoding">ISO-8859-1</stringProp>
            <stringProp name="HTTPSampler.path">/sd4/home.seam</stringProp>
            <stringProp name="HTTPSampler.method">GET</stringProp>
            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
            <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
            <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
            <stringProp name="HTTPSampler.mimetype"></stringProp>
            <stringProp name="HTTPSampler.monitor">false</stringProp>
            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          </HTTPSampler>
          <hashTree>
            <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="Browser-derived headers" enabled="true">
              <collectionProp name="HeaderManager.headers">
                <elementProp name="Host" elementType="Header">
                  <stringProp name="Header.name">Host</stringProp>
                  <stringProp name="Header.value">ws029:8080</stringProp>
                </elementProp>
                <elementProp name="Accept-Language" elementType="Header">
                  <stringProp name="Header.name">Accept-Language</stringProp>
                  <stringProp name="Header.value">de</stringProp>
                </elementProp>
                <elementProp name="Accept" elementType="Header">
                  <stringProp name="Header.name">Accept</stringProp>
                  <stringProp name="Header.value">*/*</stringProp>
                </elementProp>
                <elementProp name="User-Agent" elementType="Header">
                  <stringProp name="Header.name">User-Agent</stringProp>
                  <stringProp name="Header.value">Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)</stringProp>
                </elementProp>
                <elementProp name="Accept-Encoding" elementType="Header">
                  <stringProp name="Header.name">Accept-Encoding</stringProp>
                  <stringProp name="Header.value">gzip, deflate</stringProp>
                </elementProp>
                <elementProp name="UA-CPU" elementType="Header">
                  <stringProp name="Header.name">UA-CPU</stringProp>
                  <stringProp name="Header.value">x86</stringProp>
                </elementProp>
              </collectionProp>
            </HeaderManager>
            <hashTree/>
          </hashTree>
          <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="/sd4/home.seam" enabled="true">
            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" enabled="true">
              <collectionProp name="Arguments.arguments">
                <elementProp name="notloggedin:j_id113" elementType="HTTPArgument">
                  <boolProp name="HTTPArgument.always_encode">true</boolProp>
                  <stringProp name="Argument.name">notloggedin:j_id113</stringProp>
                  <stringProp name="Argument.value">notloggedin:j_id113</stringProp>
                  <stringProp name="Argument.metadata">=</stringProp>
                  <boolProp name="HTTPArgument.use_equals">true</boolProp>
                </elementProp>
                <elementProp name="notloggedin:j_id113:j_id117" elementType="HTTPArgument">
                  <boolProp name="HTTPArgument.always_encode">true</boolProp>
                  <stringProp name="Argument.name">notloggedin:j_id113:j_id117</stringProp>
                  <stringProp name="Argument.value">gu</stringProp>
                  <stringProp name="Argument.metadata">=</stringProp>
                  <boolProp name="HTTPArgument.use_equals">true</boolProp>
                </elementProp>
                <elementProp name="notloggedin:j_id113:j_id119" elementType="HTTPArgument">
                  <boolProp name="HTTPArgument.always_encode">true</boolProp>
                  <stringProp name="Argument.name">notloggedin:j_id113:j_id119</stringProp>
                  <stringProp name="Argument.value">test</stringProp>
                  <stringProp name="Argument.metadata">=</stringProp>
                  <boolProp name="HTTPArgument.use_equals">true</boolProp>
                </elementProp>
                <elementProp name="notloggedin:j_id113:j_id121" elementType="HTTPArgument">
                  <boolProp name="HTTPArgument.always_encode">true</boolProp>
                  <stringProp name="Argument.name">notloggedin:j_id113:j_id121</stringProp>
                  <stringProp name="Argument.value">Anmelden</stringProp>
                  <stringProp name="Argument.metadata">=</stringProp>
                  <boolProp name="HTTPArgument.use_equals">true</boolProp>
                </elementProp>
                <elementProp name="javax.faces.ViewState" elementType="HTTPArgument">
                  <boolProp name="HTTPArgument.always_encode">false</boolProp>
                  <stringProp name="Argument.name">javax.faces.ViewState</stringProp>
                  <stringProp name="Argument.value">${jsfViewState}</stringProp>
                  <stringProp name="Argument.metadata">=</stringProp>
                  <boolProp name="HTTPArgument.use_equals">true</boolProp>
                </elementProp>
              </collectionProp>
            </elementProp>
            <stringProp name="HTTPSampler.domain">ws029</stringProp>
            <stringProp name="HTTPSampler.port">8080</stringProp>
            <stringProp name="HTTPSampler.protocol">http</stringProp>
            <stringProp name="HTTPSampler.contentEncoding">ISO-8859-1</stringProp>
            <stringProp name="HTTPSampler.path">/sd4/home.seam</stringProp>
            <stringProp name="HTTPSampler.method">POST</stringProp>
            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
            <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
            <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
            <stringProp name="HTTPSampler.mimetype"></stringProp>
            <stringProp name="HTTPSampler.monitor">false</stringProp>
            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          </HTTPSampler>
          <hashTree>
            <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="Browser-derived headers" enabled="true">
              <collectionProp name="HeaderManager.headers">
                <elementProp name="Content-Type" elementType="Header">
                  <stringProp name="Header.name">Content-Type</stringProp>
                  <stringProp name="Header.value">application/x-www-form-urlencoded</stringProp>
                </elementProp>
                <elementProp name="Host" elementType="Header">
                  <stringProp name="Header.name">Host</stringProp>
                  <stringProp name="Header.value">ws029:8080</stringProp>
                </elementProp>
                <elementProp name="Accept-Language" elementType="Header">
                  <stringProp name="Header.name">Accept-Language</stringProp>
                  <stringProp name="Header.value">de</stringProp>
                </elementProp>
                <elementProp name="Accept" elementType="Header">
                  <stringProp name="Header.name">Accept</stringProp>
                  <stringProp name="Header.value">image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, */*</stringProp>
                </elementProp>
                <elementProp name="User-Agent" elementType="Header">
                  <stringProp name="Header.name">User-Agent</stringProp>
                  <stringProp name="Header.value">Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)</stringProp>
                </elementProp>
                <elementProp name="Accept-Encoding" elementType="Header">
                  <stringProp name="Header.name">Accept-Encoding</stringProp>
                  <stringProp name="Header.value">gzip, deflate</stringProp>
                </elementProp>
                <elementProp name="Referer" elementType="Header">
                  <stringProp name="Header.name">Referer</stringProp>
                  <stringProp name="Header.value">http://ws029:8080/sd4/home.seam</stringProp>
                </elementProp>
                <elementProp name="UA-CPU" elementType="Header">
                  <stringProp name="Header.name">UA-CPU</stringProp>
                  <stringProp name="Header.value">x86</stringProp>
                </elementProp>
                <elementProp name="Pragma" elementType="Header">
                  <stringProp name="Header.name">Pragma</stringProp>
                  <stringProp name="Header.value">no-cache</stringProp>
                </elementProp>
              </collectionProp>
            </HeaderManager>
            <hashTree/>
          </hashTree>
        </hashTree>
        <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true">
          <boolProp name="ResultCollector.error_logging">false</boolProp>
          <objProp>
            <name>saveConfig</name>
            <value class="SampleSaveConfiguration">
              <time>true</time>
              <latency>true</latency>
              <timestamp>true</timestamp>
              <success>true</success>
              <label>true</label>
              <code>true</code>
              <message>true</message>
              <threadName>true</threadName>
              <dataType>true</dataType>
              <encoding>false</encoding>
              <assertions>true</assertions>
              <subresults>true</subresults>
              <responseData>false</responseData>
              <samplerData>false</samplerData>
              <xml>true</xml>
              <fieldNames>false</fieldNames>
              <responseHeaders>false</responseHeaders>
              <requestHeaders>false</requestHeaders>
              <responseDataOnError>false</responseDataOnError>
              <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
              <assertionsResultsToSave>0</assertionsResultsToSave>
              <bytes>true</bytes>
            </value>
          </objProp>
          <stringProp name="filename"></stringProp>
        </ResultCollector>
        <hashTree/>
        <RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Regular Expression Extractor" enabled="true">
          <stringProp name="RegexExtractor.useHeaders">false</stringProp>
          <stringProp name="RegexExtractor.refname">jsfViewState</stringProp>
          <stringProp name="RegexExtractor.regex">&lt;input type=&quot;hidden&quot; name=&quot;javax\.faces\.ViewState&quot; id=&quot;javax\.faces\.ViewState&quot; value=&quot;(.+?)&quot; /&gt;</stringProp>
          <stringProp name="RegexExtractor.template">$1$</stringProp>
          <stringProp name="RegexExtractor.default"></stringProp>
          <stringProp name="RegexExtractor.match_number">0</stringProp>
        </RegexExtractor>
        <hashTree/>
        <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
          <boolProp name="ResultCollector.error_logging">false</boolProp>
          <objProp>
            <name>saveConfig</name>
            <value class="SampleSaveConfiguration">
              <time>true</time>
              <latency>true</latency>
              <timestamp>true</timestamp>
              <success>true</success>
              <label>true</label>
              <code>true</code>
              <message>true</message>
              <threadName>true</threadName>
              <dataType>true</dataType>
              <encoding>false</encoding>
              <assertions>true</assertions>
              <subresults>true</subresults>
              <responseData>false</responseData>
              <samplerData>false</samplerData>
              <xml>true</xml>
              <fieldNames>false</fieldNames>
              <responseHeaders>false</responseHeaders>
              <requestHeaders>false</requestHeaders>
              <responseDataOnError>false</responseDataOnError>
              <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
              <assertionsResultsToSave>0</assertionsResultsToSave>
              <bytes>true</bytes>
            </value>
          </objProp>
          <stringProp name="filename"></stringProp>
        </ResultCollector>
        <hashTree/>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>
 

 

 

 

分享到:
评论

相关推荐

    Jmeter+Jenkins+maven接口自动化集成

    2. Web 应用程序测试:Jmeter+Jenkins+maven 接口自动化集成测试框架可以应用于 Web 应用程序测试,自动化测试和报告生成。 3. API 测试:Jmeter+Jenkins+maven 接口自动化集成测试框架可以应用于 API 测试,自动化...

    Jmeter+Jenkins+maven接口自动化集成.rar

    **JMeter** 是一个开源的性能测试工具,主要适用于Web应用的压力和负载测试,但也可以用于接口测试。JMeter提供了一个图形化的界面,使得测试脚本的编写和执行变得简单易懂。在接口自动化测试中,我们可以创建HTTP...

    JMeter测试教程+badboy铺助

    Jmeter测试,在目前来说也是主流的工具测试方式,这个PPT,以前也是从网上收集的,希望对软件测试的爱好者有帮助。

    基于Jmeter+Ant+SVN+Jenkins实现接口自动化测试

    首先,Apache JMeter是一款强大的性能测试工具,它主要用于测试Web应用,包括接口测试。通过JMeter,我们可以设计各种类型的测试计划,如HTTP请求、SOAP/REST服务测试等,来模拟用户对接口的并发访问,从而评估系统...

    接口自动化测试方案jmeter+ant+jenkins.

    接口自动化测试方案jmeter+ant+jenkins 本文描述了一个基于jmeter、ant和jenkins的接口自动化测试方案,该方案旨在解决手工测试的低效率和不准确性问题。通过搭建自动化测试框架,测试人员可以快速、准确地测试接口...

    jmeter+ant+Jenkins搭建接口自动化测试

    JMeter是一款开源的性能测试工具,主要用于Web应用的负载测试和功能测试。它支持多种协议,包括HTTP、HTTPS、FTP等,并且可以用于测试静态和动态资源(如静态文件、JSP、CGI、HTML、JSON、XML等)。通过JMeter,可以...

    Jmeter+maven+Jenkins构建云性能测试平台

    本文标题“Jmeter+maven+Jenkins构建云性能测试平台”表明了本文的主题,即使用Jmeter、Maven和Jenkins来构建一个云性能测试平台。这个标题涵盖了三个关键技术点:Jmeter、Maven和Jenkins,都是当前IT行业中流行的...

    Jmeter+ant+Jenkins集成接口自动化测试说明.docx

    使用Ant编写build.xml文件,包含JMeter测试计划的执行逻辑,如设置测试计划路径、输出结果文件等。通过`jmeter Ant任务`执行JMeter测试。 五、集成到Jenkins,构建持续化集成 1. 在Jenkins中创建新项目,选择Free...

    基于Prometheus+Grafana搭建JMeter性能测试监控平台.docx

    基于Prometheus+Grafana搭建JMeter性能测试监控平台.docx 做性能测试,如果没有养成良好的保存结果习惯,那么一个业务指标监控平台就必不可少,不仅可以在线监控,还可以用于报告总结,数据持久化的好处就是让人眼前...

    Jenkins+Jmeter+ant接口自动化框架.docx

    本文将介绍如何使用 Jenkins、Jmeter 和 Ant 实现接口自动化测试,并将其应用于实际项目中。 一、准备工作 在开始之前,我们需要下载并安装相关的软件包,包括 Jmeter、Ant 和 Jenkins。Jmeter 是一个开源的性能...

    grafana+influxdb+prometheus+node exporter+jmeter实时监控.docx

    5. 如果使用 jMeter,需要在测试脚本中添加监听器,如“生产概要结果”监听器,将测试结果发送到 InfluxDB。 6. 在 Grafana 中创建新的面板,展示 jMeter 的测试结果和系统的其他监控数据。 这套系统特别适合实时...

    Jmeter+Ant+Jenkins

    用Jmeter编写接口测试用例,把用例保存到svn中,利用Jenkins上实现持续集成,Jenkins中用Ant进行构建操作,Jenkins中加入HTML报告、性能报告、邮件发送等功能。

    jmeter+ant+jenkins接口自动化.pptx

    jmter+ant+jenkins自动化测试pptjmter+ant+jenkins自动化测试pptjmter+ant+jenkins自动化测试ppt,个人总结

    基于jmeter+Java+HttpclientUtil实现的接口测试工具

    基于jmeter+Java+HttpclientUtil实现的接口测试工具,通过Excel表格进行维护接口相关参数信息,借助Jmeter工具通过java请求设计接口测试自动化测试用例。代码重写了JavaSampleClient类,在使用过程中取出了冗余的...

    JAVA开发jmeter测试mysql+jsno+mangodb用到的jar包,三个包都在里面

    在使用这些jar包进行JMeter测试时,你需要将它们添加到JMeter的lib目录下,然后重启JMeter,这样JMeter就能识别并使用这些库。在JMeter的测试计划中,配置JDBC Connection Configuration,填写正确的数据库连接信息...

    JMeter+Standard+Extras+mqtt

    标题 "JMeter+Standard+Extras+mqtt" 指向的是使用Apache JMeter进行MQTT协议测试的主题。Apache JMeter是一款强大的性能测试工具,主要用于Web应用的负载和压力测试,但也可以扩展到其他协议,如MQTT(Message ...

    Jmeter+Ant+Jenkins接口自动化测试平台

    JMeter是一款开源的Java应用,专门用于压力测试和性能测试。它支持多种协议,包括HTTP、FTP、JDBC等,非常适合进行接口自动化测试。在JMeter中,可以通过编写脚本模拟并发用户请求,测试接口的响应时间、吞吐量和...

    jmeter+Badboy+JMeterPlugins-Extras+JMeterPlugins-Standard+ServerAgent

    标题中的"jmeter+Badboy+JMeterPlugins-Extras+JMeterPlugins-Standard+ServerAgent"揭示了这个压缩包集合是一套完整的性能测试工具组合,主要用于Web应用的压力和并发测试。接下来,我会详细讲解这些组件的功能和...

    性能自动化测试(基于jmeter+jenkins+ant+tomcat)

    **JMeter** 是一个开源的、跨平台的性能测试工具,专门用于测试Web应用性能和负载。它可以模拟多个用户并发访问服务,从而测试服务器的响应时间、吞吐量以及资源消耗等关键指标。在【JMeter】中,你可以创建脚本来...

Global site tag (gtag.js) - Google Analytics