<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Altentee » Performance &#38; Test Automation Experts &#187; jmeter</title>
	<atom:link href="http://altentee.com/blogs/tag/jmeter/feed/" rel="self" type="application/rss+xml" />
	<link>http://altentee.com</link>
	<description>Performance and Test Automation Experts</description>
	<lastBuildDate>Fri, 04 Nov 2011 03:17:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>A year in review and a consolidated approach</title>
		<link>http://altentee.com/blogs/2010/a-year-in-review-and-a-consolidated-approach/</link>
		<comments>http://altentee.com/blogs/2010/a-year-in-review-and-a-consolidated-approach/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 21:53:02 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[loadrunner]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[watir]]></category>

		<guid isPermaLink="false">http://altentee.com/blogs/?p=1144</guid>
		<description><![CDATA[Wow, wasn&#8217;t that long ago when I was promising things that were harder, better, faster and stronger. I think I got part of the way there. The core reason I set up Altentee was to provide reliable (and potentially cheaper) alternatives to traditional licensed performance testing tool sets. There&#8217;s no doubt Altentee can test at [...]]]></description>
			<content:encoded><![CDATA[<p>Wow, wasn&#8217;t that long ago when I was promising things that were <a href="http://altentee.com/blogs/blogs/2010/harder-better-faster-stronger-and-cheaper/">harder, better, faster and stronger</a>. I think I got part of the way there. The core reason I set up Altentee was to provide reliable (and potentially cheaper) alternatives to traditional licensed performance testing tool sets. There&#8217;s no doubt Altentee can test at the limits of your typical web app using tools that cost zilch. The bigger challenge I&#8217;ve found this year is convincing potential clients that they really don&#8217;t need to spend that much. I&#8217;ve even offered a <a href="http://altentee.com">free load test on our homepage</a> to help illustrate this point.</p>
<p>We were lucky to be selected by the development team at <a href="http://www.cordelta.com/">Cordelta</a> to help them automate and performance test a high profile public website called <a href="http://www.myhospitals.gov.au/">MyHospitals</a>. We were able to test millions of hits per hour from domestic and international locations in a wide variety of load scenarios. The success of this approach was underpinned by the following:</p>
<ol>
<li>An open minded project / development team not coupled to a &#8216;must-have-most-expensive-toolset-to-do-job&#8217; mentality</li>
<li>An open minded performance test analyst (me!) who believes Excel really is the grandpa of charting, R is the grandma of stats, Sparklines are the only way to present time series data to management, ANY tool can simulate load via HTTP/S and that there is no real distinction between good software testers or developers (only hard work separates the best from the worst).</li>
<li>That 2010 come-no-doubt 2011 buzz word&#8230; Cloud</li>
</ol>
<p>As I sit here pluggin&#8217; our alternative approach at Altentee, I can see the rise of other more <a href="http://browsermob.com">successful</a> <a href="http://loadstorm.com">punters</a> taking on the <a href="http://loadstorm.com/2010/price-right-loadrunner">big kids</a>. I sit and [continue to] chuckle at the reaction to LR pricing and LR zealots who will fall on their swords over LR itself. I have come to realise one thing though, it is not about the tool, or even the alternate tool like perhaps I first thought. It is more about the <span style="color: #008000;"><strong>freedom of choice</strong></span>.</p>
<p>To tackle MyHospitals I was free to choose and implement the following tools:</p>
<ol>
<li><a href="https://github.com/90kts/watirgrid">WatirGrid</a> to orchestrate a small flotilla of IE and FireFox based browsers based on <a href="http://watir.com">Watir</a></li>
<li><a href="http://jakarta.apache.org/jmeter/index.html">JMeter</a> to add more at the protocol level of performance testing</li>
<li><a href="http://www.hpl.hp.com/research/linux/httperf/">httperf</a> to do some basic benchmarking, similar to my front page</li>
<li><a href="https://github.com/90kts/numbrcrunchr">numbrcrunchr</a> to pull together system metrics and make for easier analysis</li>
<li>A <a href="https://www.zettagrid.com/index.php/about-news/157-altentee-benchmark-comparisons-between-australian-cloud-providers">variety of Australian cloud providers </a>and of course <a href="http://aws.amazon.com/ec2/pricing/">Amazon EC2</a> to host the test environment</li>
</ol>
<p>It has been a great year. I&#8217;m not entirely free of the commercial chains just yet and am still needing the LR type work to prop up this approach, but I hope 2011 brings about some fresh thinking in performance and test automation with hopefully me somewhere amidst that space.</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2010/a-year-in-review-and-a-consolidated-approach/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to spoof Google Analytics traffic with JMeter</title>
		<link>http://altentee.com/blogs/2010/how-to-spoof-google-analytics-traffic-with-jmeter/</link>
		<comments>http://altentee.com/blogs/2010/how-to-spoof-google-analytics-traffic-with-jmeter/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 01:25:53 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>

		<guid isPermaLink="false">http://altentee.com/?p=933</guid>
		<description><![CDATA[Recently a client asked Altentee to generate some load against their subscription to Google Analytics (GA). Calls to GA and other 3rd party monitoring tools are typically requests we blacklist or consider out of scope. So it was unusual to think the other way around, how would you performance test GA? The solution as it [...]]]></description>
			<content:encoded><![CDATA[<p>Recently a client asked Altentee to generate some load against their subscription to Google Analytics (GA). Calls to GA and other 3rd party monitoring tools are typically requests we blacklist or consider out of scope. So it was unusual to think the other way around, how would you performance test GA?</p>
<p><a href="http://altentee.com/blogs/wp-content/uploads/2010/08/Screen-shot-2010-08-06-at-10.28.24-AM.png"><img class="alignnone size-full wp-image-934" title="Screen shot 2010-08-06 at 10.28.24 AM" src="http://altentee.com/blogs/wp-content/uploads/2010/08/Screen-shot-2010-08-06-at-10.28.24-AM.png" alt="" width="886" height="167" /></a></p>
<p>The solution as it turns out is quite simple. Google Analytics is well documented <a href="http://code.google.com/apis/analytics/docs/tracking/gaTrackingTroubleshooting.html">here</a> in terms of what query parameters constitute the GIF request that registers traffic.</p>
<p>The key parameters which need to be catered for when spoofing traffic are:<br />
utmn =&gt; Unique ID generated for each GIF request to prevent caching of the GIF image.<br />
utmhid =&gt; Another unique ID not documented but I think is related to AdSense<br />
plus all the GA cookies including utma, utmb, utmc and utmz</p>
<p>The best way to parametize this is to observe real traffic with a tool like FireBug in the Net(work) panel. That way you can make a copy of a real GIF request. Essentially you are going to fake the call to __utm.gif. An example request looks like this:</p>
<p>http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&amp;utmn=123456789&amp;utmhn=www.altentee.com&amp;utmcs=UTF-8&amp;utmsr=1920&#215;1200&amp;utmsc=24-bit&amp;utmul=en-us&amp;utmje=1&amp;utmfl=10.0%20r45&amp;utmdt=AlteneeBlog&amp;utmhid=1697634062&amp;utmr=-&amp;utmp=%2F&amp;utmac=UA-12345678-3&amp;utmcc=__utma%3D199946558.28502083.1280297456.1280637882.1281056979.6%3B%2B__utmz%3D199946558.1280297456.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&amp;gaq=1</p>
<p>All you need to do to spoof traffic or generate page views to your GA account is make repeated calls to this URL after parametizing key fields previously mentioned. An example request in JMeter with corresponding parametized functions in bold (random and time) looks like this:</p>
<p>/__utm.gif?utmwv=4.7.2&amp;utmn=<strong>${__Random(10000000,60000000,utmn)}</strong>&amp;utmhn=www.altentee.com&amp;utmcs=UTF-8&amp;utmsr=1366&#215;768&amp;utmsc=24-bit&amp;utmul=en-us&amp;utmje=1&amp;utmfl=10.1%20r53&amp;utmdt=<strong>PerformanceTest</strong>&amp;utmhid=<strong>${__Random(100000000,900000000,utmhid)}</strong>&amp;utmr=-&amp;utmp=%2F&amp;utmac=UA-12345678-3&amp;utmcc=__utma%3D199946558.1448353202.<strong>${__time()}.${__time()}.${__time()}</strong>.4%3B%2B__utmz%3D199946558.<strong>${__time()}</strong>.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&amp;gaq=1</p>
<p>You could also build this URL from scratch although it&#8217;s much easier to copy and modify the target URL for the site you&#8217;re actually testing. Please don&#8217;t use the URLs above as I&#8217;ve faked other things like the Google Analytics account code (utmac). It&#8217;s also worth changing the page title (utmdt) so you can separate real traffic from the fake traffic generated during performance testing.</p>
<p>Build a simple test plan in JMeter with a HTTP sampler generating requests to the aforementioned URL, put in a constant timer (or similar) so you don&#8217;t spam GA&#8217;s servers and away you go. You can then measure response time to this service for as many threads as you like. I generated 10K page views in 5 minutes which was more than sufficient to satisfy the client&#8217;s requirements.</p>
<p><a href="http://altentee.com/blogs/wp-content/uploads/2010/08/Screen-shot-2010-08-06-at-10.27.48-AM.png"><img class="alignnone size-full wp-image-935" title="Screen shot 2010-08-06 at 10.27.48 AM" src="http://altentee.com/blogs/wp-content/uploads/2010/08/Screen-shot-2010-08-06-at-10.27.48-AM.png" alt="" width="896" height="324" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2010/how-to-spoof-google-analytics-traffic-with-jmeter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Data from JMeter JDBC Requests</title>
		<link>http://altentee.com/blogs/2010/dynamic-data-from-jmeter-jdbc-requests/</link>
		<comments>http://altentee.com/blogs/2010/dynamic-data-from-jmeter-jdbc-requests/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 06:45:17 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[jdbc]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://altentee.com/?p=731</guid>
		<description><![CDATA[A common requirement when load testing is to populate subsequent requests with dynamic data from previous requests. If you&#8217;re thinking about using a database to store static test data, such as usernames, paswords, credit card numbers etc then read on to find out how to extract this data at runtime and populate JMeter variables. In [...]]]></description>
			<content:encoded><![CDATA[<p>A common requirement when load testing is to populate subsequent requests with dynamic data from previous requests. If you&#8217;re thinking about using a database to store static test data, such as usernames, paswords, credit card numbers etc then read on to find out how to extract this data at runtime and populate JMeter variables.</p>
<p><span id="more-731"></span>In this example we&#8217;ll need to add a JDBC Connection Configuration to our test plan. This will define and control the way in which JMeter will access your database.</p>
<p><a href="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.28.18-PM.png"><img class="alignleft size-full wp-image-732" title="Screen shot 2010-01-05 at 5.28.18 PM" src="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.28.18-PM.png" alt="" width="647" height="423" /></a></p>
<p>Notice I&#8217;ve left the defaults for connection pool properties, although you may need to tweak this depending on how you&#8217;ll access the data. I&#8217;ve used a JDBC connection URL that accesses a local mysql server listening on port 3306. The database in use is called watirgrid</p>
<p>I&#8217;ve also defined the JDBC Driver class and specified the username / password to connect with.</p>
<p>Now we can make a JDBC request using the JDBC Request sampler. It will look something like this:<a href="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.31.52-PM.png"><img class="alignleft size-full wp-image-733" title="Screen shot 2010-01-05 at 5.31.52 PM" src="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.31.52-PM.png" alt="" width="646" height="442" /></a></p>
<p>The Variable Name matches the JDBC Connection Config Variable Name i.e. mysql</p>
<p>I&#8217;m using a select statement that will print out results in a JSON-like format. That query is as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
CONCAT<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;[&quot;</span><span style="color: #66cc66;">,</span>
GROUP_CONCAT<span style="color: #66cc66;">&#40;</span>
CONCAT<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;{email:'&quot;</span><span style="color: #66cc66;">,</span>email<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
CONCAT<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;,login_count:'&quot;</span><span style="color: #66cc66;">,</span>login_count<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;'}&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;]&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">AS</span> json <span style="color: #993333; font-weight: bold;">FROM</span> users</pre></div></div>

<p>In doing this, it will return a result set that looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------------+</span>
<span style="color: #66cc66;">|</span> json                                            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#123;</span>email:<span style="color: #ff0000;">'tim.koops@gmail.com'</span><span style="color: #66cc66;">,</span>login_count:<span style="color: #ff0000;">'1'</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------------+</span>
<span style="color: #cc66cc;">1</span> row <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Now we need to add a Post Processor Regex Extractor to the JDBC request as follows:</p>
<p><a href="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.34.39-PM.png"><img class="alignleft size-full wp-image-734" title="Screen shot 2010-01-05 at 5.34.39 PM" src="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.34.39-PM.png" alt="" width="172" height="40" /></a></p>
<p>The reason we do this is so we can extract the results from the JSON string returned by the database query. For example, to extract and populate a variable called ${email} our PPRE would look like this:</p>
<p><a href="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.36.45-PM.png"><img class="alignleft size-full wp-image-735" title="Screen shot 2010-01-05 at 5.36.45 PM" src="http://altentee.com/blogs/wp-content/uploads/2010/01/Screen-shot-2010-01-05-at-5.36.45-PM.png" alt="" width="652" height="236" /></a></p>
<p>Now we&#8217;re cooking! Add a Debug Sampler to confirm everything works as you&#8217;d expect. You should see results like this in the response data</p>
<pre>email=tim.koops@gmail.com
email_g=1
email_g0=email:'tim.koops@gmail.com'
email_g1=tim.koops@gmail.com
mysql=org.apache.jmeter.protocol.jdbc.config.DataSourceElement$DataSourceComponentImpl@10d69502
</pre>
<p>Attached is a demo test plan: <a href="http://altentee.com/blogs/wp-content/uploads/2010/01/jdbc_example.jmx_.zip">jdbc_example.jmx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2010/dynamic-data-from-jmeter-jdbc-requests/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>A Framework for JMeter using GitHub and Ruby</title>
		<link>http://altentee.com/blogs/2009/a-framework-for-jmeter-using-github-and-ruby/</link>
		<comments>http://altentee.com/blogs/2009/a-framework-for-jmeter-using-github-and-ruby/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 04:44:05 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/a-framework-for-jmeter-using-github-and-ruby/</guid>
		<description><![CDATA[Version control is not something you often associate with performance testing scripts. The reasons generally vary. A significant one is the lack of any version control support in commercial toolsets like LoadRunner. Another reason is the perceived short-term shelf life of test scripts. You tend to write them once and throw them away right? If [...]]]></description>
			<content:encoded><![CDATA[<p>Version control is not something you often associate with performance testing scripts. The reasons generally vary. A significant one is the lack of any version control support in commercial toolsets like LoadRunner. Another reason is the perceived short-term shelf life of test scripts. You tend to write them once and throw them away right?</p>
<p>If you work with more agile teams/developers you will probably start to require a lot of re-use out of your scripts, especially when the release cycle increases in terms of frequency. It starts to make sense to use version control and some form of scripting framework.</p>
<p>In this post I&#8217;m going to use JMeter as the tool of choice here and I&#8217;m going to re-introduce concepts which I normally force upon others whilst contracting. That is, use of Application Simulation Models (ASMs) to hep define the load and use of the Application Performance Index (Apdex) to help present results. I&#8217;m also going to use GitHub (or git) as my tool for maintaining version control and implementing a wiki as a dashboard replacement for other test management tools.<br />
<span id="more-246"></span></p>
<p>In short, I&#8217;m hosting version controlled scripts on GitHub. You can view my repository here:<br />
<a href="http://wiki.github.com/90kts/performance_test"><strong>http://wiki.github.com/90kts/performance_test</strong><br />
</a><br />
I&#8217;m using Google Documents to store my ASMs. You can see an example <a href="http://spreadsheets.google.com/ccc?key=0AuXn6ttUcRvbdERrd0lVWFNfLWJEc3RJdXVqenNTSVE&#038;hl=en"><strong>here</strong></a>.</p>
<p>I&#8217;m also using the Wiki functionality of GitHub plus some Ruby scripts as my test runners. In other words, a scripted version of a controller, driven by data from the ASMs.</p>
<p>GitHub can be quite useful. Not only can you version control all your scripts, you can also implement  concepts based around a &#8220;<a href="http://www.satisfice.com/presentations/dashboard.pdf"><strong>low-tech testing dashboard</strong></a>&#8221;  first explored by James Bach. The use of a wiki to support this was recently explored by Matthew at <a href="http://xndev.blogspot.com/2009/09/test-management-tools.html"><strong>Socialtext</strong></a>.  Coupled with that you also get an Issues database which is perfect for tracking those performance defects during test execution. Google Docs is also very useful in that it allows you to centrally store test artifacts like your ASMs which has plenty of <a href="http://roo.rubyforge.org/">neat APIs</a> for programatically accessing content. Start working more with GitHub and less with QualityCentre and watch your circle of geek friends change. <img src='http://altentee.com/blogs/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Dashboard</strong><br />
So my <a href="http://wiki.github.com/90kts/performance_test/dashboard"><strong>dashboard</strong></a> is really just a broad sweep of major system and application components that present some level of risk to application stability and performance. It&#8217;s represented in the GitHub wiki as follows:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/09/dashboard1.png' title='dashboard 2'><img src='http://90kts.com/blog/wp-content/uploads/2009/09/dashboard1.png' alt='dashboard 2' /></a></p>
<p>Main elements are the areas I wish to test, the estimated effort required to script/prepare those areas, an indication of risk to production stability (carried out separately in risk assessments with appropriate technical/business teams), day to day comments on test readiness and a link to the online ASM. I use the keywords &#8220;run&#8221; or &#8220;draft&#8221; to distinguish between ASM status&#8217;. This helps the test runner determine which tests to execute.</p>
<p><strong>Test Runner</strong><br />
The <a href="http://github.com/90kts/performance_test/blob/master/scripts/test_runner.rb"><strong>test runner</strong></a> is a Ruby script which when executed, queries the Dashboard for ASMs to execute (based on the keyword &#8220;run&#8221;) then fetches the appropriate ASM via Google Documents to parse out relevant volumetrics for the test. Finally, it launches thread groups within JMeter to execute the test according to the ASM. Results are stored in the corresponding logs directory.</p>
<p><strong>Apdex</strong><br />
If you&#8217;d like to find out more about the Application Performance Index please see <a href="http://apdex.org/"><strong>here</strong></a>. I&#8217;ve found Apdex to be a very useful format to communicate application performance consistently to non-tech-heads. There&#8217;s plenty of room to geek out at low level later, but for a 20,000&#8242; view on things, Apdex is often a good start. I&#8217;ve implemented Apdex support for this framework using a <a href="http://github.com/90kts/performance_test/blob/master/scripts/apdex.rb"><strong>Ruby script</strong></a> to parse the results. The <a href="http://googlecharts.rubyforge.org/"><strong>Google chart API for Ruby</strong></a> is used to present sparklines. You can do this during or after a test run has complete. It basically picks up results from the logs directory and parses them against response time targets specified in the ASM. The output of the Apdex script is a html page which looks like this:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/09/apdex.png' title='apdex ruby'><img src='http://90kts.com/blog/wp-content/uploads/2009/09/apdex.png' alt='apdex ruby' /></a></p>
<p><strong>Application Simulation Models</strong><br />
The <a href="http://spreadsheets.google.com/ccc?key=0AuXn6ttUcRvbdERrd0lVWFNfLWJEc3RJdXVqenNTSVE&#038;hl=en"><strong>ASM</strong></a> is really the brains behind the JMeter test plan. It looks like this:<br />
 <a href='http://90kts.com/blog/wp-content/uploads/2009/09/asm.png' title='ASM'><img src='http://90kts.com/blog/wp-content/uploads/2009/09/asm.thumbnail.png' alt='ASM' /></a><a href='http://90kts.com/blog/wp-content/uploads/2009/09/asm2.png' title='asm2'><img src='http://90kts.com/blog/wp-content/uploads/2009/09/asm2.thumbnail.png' alt='asm2' /></a></p>
<p>It has two worksheets. The ASM worksheet is intended for business stakeholders. It&#8217;s geared more towards their understanding. I encourage these groups to articulate load in terms of transaction distribution (how many and what types of transactions groups) and user distribution (who are your user groups and what do they consist of). The key metrics I get these groups to enter are highlighted in yellow. Things like different user groups, percentage breakdowns of transactions and transaction/concurrent user quantities. Have a play, it&#8217;s pretty easy to follow. Coincidentally in every contract I&#8217;ve worked, I make this a mandatory test artifact for both my testers and the teams they&#8217;ve engaged with. No ASM = No Performance test&#8230;</p>
<p>The Scenario worksheet is really just the reverse of the first. It breaks down all the metrics that the business have provided into a worksheet to help you plug figures into your test scenarios. It helps cut down user-errors when calculating transaction rates etc and makes it much easier to chop and change figures. Want to do a test run with less concurrent users or higher transaction throughput? Just muck around with the percentages in yellow. I&#8217;ve used this format for both LoadRunner and JMeter gigs, so the terminology is meant to be familiar to both those types of users.</p>
<p><strong>JMeter Test Plan</strong><br />
Through the beauty of JMeter -J command line parameters I&#8217;m able to pass all the relevant metrics from the ASM such as number of threads (vusers), duration, throughput, rampup and action(transaction) distribution percentages. I use this <a href="http://github.com/90kts/performance_test/blob/master/plans/template_load_test.jmx"><strong>template format</strong></a> quite often and have explained some of these concepts previously.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/09/jmeter_template.png' title='jmeter template'><img src='http://90kts.com/blog/wp-content/uploads/2009/09/jmeter_template.png' alt='jmeter template' /></a></p>
<p>The test plan gets the required parameters from the command line at run time. You can see the User Defined Variables look something like this:<br />
<code>DURATION = ${__P(duration,60) </code></p>
<p>Which basically sets the ${DURATION} JMeter variable based on the -Jduration command line variable, or defaults to 60 seconds if it is not passed. Other variables are also defined here and get loaded into the main Thread Group.</p>
<p>I use a Runtime Controller to control how long the test plan executes for. I also keep a separate Transaction Controller called Init to execute login actions etc or things I only want to execute once in the test plan.</p>
<p>Nested inside the Runtime Controller I use Throughput Controllers with percent executions tied to action percentages defined in the ASM. For example, action 1 might be a &#8220;view product&#8221; sequence of requests which I execute 50% of the time and so forth. Similar to weighted percentages for transaction blocks in LoadRunner. It is best to calculate these percentages using the Per User mode in JMeter for more accurate results.</p>
<p>Nested inside Throughput Controllers will be further Transaction Controllers, with Generate Parent Sample checked to enable similar functionality to transaction timers in LoadRunner around groups of requests.</p>
<p>The whole Thread Group has its throughput limited with a Constant Throughput Timer which basically tries to make all active threads in the thread group stay at a constant rate (defined by samples per minute). This eliminates the need to figure out pacing or sleep times as you might in LoadRunner.</p>
<p>The Summary Report and Gaussian Random Timers are just used for debugging so don&#8217;t normally include those in the final script&#8230;</p>
<p><strong>Git</strong><br />
Want to get started? Well first you will need a copy of a git client. Have a look at various how-to guides out there to get you started. I&#8217;ve found this <a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/index.html"><strong>site</strong></a> pretty useful for understanding and working with git basics. My public clone URL for all the code used in this post is available here:<br />
git://github.com/90kts/performance_test.git</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2009/a-framework-for-jmeter-using-github-and-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testing SAP Web Portals with JMeter</title>
		<link>http://altentee.com/blogs/2009/testing-sap-web-portals-with-jmeter/</link>
		<comments>http://altentee.com/blogs/2009/testing-sap-web-portals-with-jmeter/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 21:13:01 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/testing-sap-web-portals-with-jmeter/</guid>
		<description><![CDATA[A colleague recently asked me if it was possible to test SAP portals using JMeter. The short answer is yes. Some people get confused with the additional protocols that LoadRunner sports for SAP, particularly the SAP GUI. But if your SAP portal uses plain old HTTP (or HTTPS) then JMeter can do the job. There [...]]]></description>
			<content:encoded><![CDATA[<p>A colleague recently asked me if it was possible to test SAP portals using JMeter. The short answer is yes.</p>
<p>Some people get confused with the additional protocols that LoadRunner sports for SAP, particularly the SAP GUI. But if your SAP portal uses plain old HTTP (or HTTPS) then JMeter can do the job.</p>
<p>There are a few gotchas which I will continue to update on this post, namely around correlation. In JMeter, correlation is particularly *easier* because you don&#8217;t have to worry about where to position a correlation rule. The equivalent function to use is a <strong>Post Processor -> Regular Expression Extractor</strong>.<br />
<span id="more-243"></span><br />
I used the following rules to help correlate the SAP portal:</p>
<p>Response Field to check: <strong>Body</strong><br />
Reference Name: <strong>sap-ext-sid</strong><br />
Regular Expression: <strong>sap-ext-sid=&#8221;(.+?)&#8221;</strong><br />
Template: <strong>$1$</strong><br />
Match No.: <strong>1</strong></p>
<p>Response Field to check: <strong>Body</strong><br />
Reference Name: <strong>sap-wd-tstamp</strong><br />
Regular Expression: <strong>name=&#8221;sap-wd-tstamp&#8221; value=&#8221;(.+?)&#8221;</strong><br />
Template: <strong>$1$</strong><br />
Match No.: <strong>1</strong></p>
<p>Response Field to check: <strong>Body</strong><br />
Reference Name: <strong>sap-ep-iviewhandle</strong><br />
Regular Expression: <strong>name=&#8221;sap-ep-iviewhandle&#8221; value=&#8221;(.+?)&#8221;</strong><br />
Template: <strong>$1$</strong><br />
Match No.: <strong>1</strong></p>
<p>Just scope those globally in your thread group and they will find and populate the necessary variables with <strong>${variable_name}</strong><br />
All you need to do to your final script is find and replace all instances of those variables with the JMeter variable in your favourite text editor. On windows I find SciTE is free (normally installed with Ruby) and powerful. e.g.</p>
<p>Replace:<br />
7QQ8jk_TEknhboPm9fmgqw&#8211;Mce5By08HC1RDy9m4LImcA&#8211;<br />
With:<br />
${sap-ext-sid}</p>
<p>In our particular portal a cookie value is used in the context of a query parameter (or form value). So to read a cookie value from the <strong>HTTP Cookie Manager </strong>element at run time (make sure you include it in your Thread Group) you just use another regular expression extractor:</p>
<p>Response Field to check: <strong>Header</strong><br />
Reference Name: <strong>MYSAPS02</strong><br />
Regular Expression: <strong>MYSAPSSO2=(.+?);</strong><br />
Template: <strong>$1$</strong><br />
Match No.: <strong>1</strong></p>
<p>Note in this case I am checking the header rather than the body for this value. Then use the variable as before.</p>
<p>Another tip when recording SAP portals, you might want to use the <a href="http://www.badboy.com.au/">BadBoy </a>recorder which can export to JMeter test plans. I had more success using this over the traditional recording proxy in JMeter.</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2009/testing-sap-web-portals-with-jmeter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JMeter Non HTTP response message: Unconnected sockets not implemented</title>
		<link>http://altentee.com/blogs/2009/jmeter-non-http-response-message-unconnected-sockets-not-implemented/</link>
		<comments>http://altentee.com/blogs/2009/jmeter-non-http-response-message-unconnected-sockets-not-implemented/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 02:26:46 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/jmeter-non-http-response-message-unconnected-sockets-not-implemented/</guid>
		<description><![CDATA[If you&#8217;re testing HTTPS with JMeter 2.3.2 and a current version of Java greater than 1.5 e.g. java -version java version "1.6.0_11" Java(TM) SE Runtime Environment (build 1.6.0_11-b03) Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) Then you are likely to encounter this error when using the standard HTTP Request sampler: Response code: Non [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re testing HTTPS with JMeter 2.3.2 and a current version of Java greater than 1.5 e.g.</p>
<p><code>java -version<br />
java version "1.6.0_11"<br />
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)<br />
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)</code></p>
<p>Then you are likely to encounter this <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6771432">error</a> when using the standard <strong>HTTP Request</strong> sampler:</p>
<p><code>Response code: Non HTTP response code: java.net.SocketException<br />
Response message: Non HTTP response message: Unconnected sockets not implemented</code></p>
<p>If you have the opportunity, use the <strong>HTTP Request HTTPClient</strong> sampler instead and this problem should be resolved. Otherwise use Java 1.5 instead. If you&#8217;ve already recorded your test plan in JMeter or other tools (like <a href="http://www.badboy.com.au/">BadBoy</a>) then some simple regular expressions on the jmx file will fix the problem manually.</p>
<p>Windows:<br />
<code><br />
ruby -pi.bak -e "gsub(/<httpsampler guiclass="\""HttpTestSampleGui"\"" testclass="\""HTTPSampler"\""/, '<httpsampler2 guiclass="\""HttpTestSampleGui2"\"" testclass="\""HTTPSampler2"\""')" *.jmx</p>
<p>ruby -pi.bak -e "gsub(/HTTPSampler>/, 'HTTPSampler2>')" *.jmx<br />
</code></p>
<p>Mac:<br />
<code><br />
ruby -pi.bak -e "gsub(/<httpsampler guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSampler\"/, '<httpsampler2 guiclass=\"HttpTestSampleGui2\" testclass=\"HTTPSampler2\"')" *.jmx</p>
<p>ruby -pi.bak -e "gsub(/HTTPSampler>/, 'HTTPSampler2>')" *.jmx</code><br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2009/jmeter-non-http-response-message-unconnected-sockets-not-implemented/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Performance Testing MQ with JMeter</title>
		<link>http://altentee.com/blogs/2008/performance-testing-mq-with-jmeter/</link>
		<comments>http://altentee.com/blogs/2008/performance-testing-mq-with-jmeter/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 05:45:58 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[MQ]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2008/performance-testing-mq-with-jmeter/</guid>
		<description><![CDATA[This is a relatively new example of how to use JMeter with WebSphere MQ. This approach is a clever way of inserting messages into MQ using a JMS sampler (point to point) with a JNDI binding within MQ. I had not heard of this approach before and am sure it will be useful in future, [...]]]></description>
			<content:encoded><![CDATA[<p>This is a relatively new example of how to use <a href="http://www.ibm.com/developerworks/websphere/library/techarticles/0808_vandekuil/0808_vandekuil.html"><strong>JMeter with WebSphere MQ</strong></a>. This approach is a clever way of inserting messages into MQ using a JMS sampler (point to point) with a JNDI binding within MQ.</p>
<p>I had not heard of this approach before and am sure it will be useful in future, provided you have sufficient access to create the bindings in the first place.</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2008/performance-testing-mq-with-jmeter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Why do I get an &quot;Error 501/505 &#8211; Not implemented or not supported&quot; in JMeter?</title>
		<link>http://altentee.com/blogs/2008/why-do-i-get-an-error-501505-not-implemented-or-not-supported-in-jmeter/</link>
		<comments>http://altentee.com/blogs/2008/why-do-i-get-an-error-501505-not-implemented-or-not-supported-in-jmeter/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 21:51:49 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2008/why-do-i-get-an-error-501505-not-implemented-or-not-supported-in-jmeter/</guid>
		<description><![CDATA[This is most likely because the JMeter recording proxy does not support the https protocol. If it&#8217;s a screen you can live without, you can just stop/start the proxy recorder around that page (I use the Firefox plugin called FoxyProxy to quickly switch between different proxy configurations). However, if it is vital to your script [...]]]></description>
			<content:encoded><![CDATA[<p>This is most likely because the JMeter recording proxy does not support the https protocol. If it&#8217;s a screen you can live without, you can just stop/start the proxy recorder around that page (I use the Firefox plugin called <a href="http://foxyproxy.mozdev.org/downloads.html"><strong>FoxyProxy</strong></a> to quickly switch between different proxy configurations).</p>
<p>However, if it is vital to your script (for example, a login page) then you can use an alternative recording tool called <a href="http://www.badboy.com.au/"><strong>Badboy Software</strong></a>. I frequently use this to record HTTPS then export the test plan to JMeter. Alternatively you can manually create the HTTPS request sample yourself.</p>
<p>JMeter can run HTTPS request samplers, it just can&#8217;t record them using the native proxy recorder.</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2008/why-do-i-get-an-error-501505-not-implemented-or-not-supported-in-jmeter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JMeter Tips and Tricks &#8211; Correlating with Regular Expressions</title>
		<link>http://altentee.com/blogs/2008/jmeter-tips-and-tricks-correlating-with-regular-expressions/</link>
		<comments>http://altentee.com/blogs/2008/jmeter-tips-and-tricks-correlating-with-regular-expressions/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 00:02:05 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2008/jmeter-tips-and-tricks-correlating-with-regular-expressions/</guid>
		<description><![CDATA[Another post in this current theme of JMeter tips and tricks&#8230; You will hear LoadRunner consultants preaching to the converted about the requirement to correlate data accurately. What they&#8217;re referring to, is making sure that dynamic data received by the client from the server (typically in a response body, header or url), which changes from [...]]]></description>
			<content:encoded><![CDATA[<p>Another post in this current theme of JMeter tips and tricks&#8230; You will hear LoadRunner consultants preaching to the converted about the requirement to correlate data accurately. What they&#8217;re referring to, is making sure that dynamic data received by the client from the server (typically in a response body, header or url), which changes from request to request, is accurately correlated. If you don&#8217;t, you will probably &#8216;break&#8217; the application logic with most obvious signs during replay being things like HTTP Server 500 errors.</p>
<p>In practice, correlation requirements relate to things like session ids, viewstate, cookies, date time stamps and other transactional information. So more often than not you will see this data changing following a post back or response from the server. With the introduction of AJAX calls, correlation requirements probably increase (per page) as the number of transactional requests probably increases as well.</p>
<p>In LoadRunner, you typically correlate data manually using the web_reg_save_param function. This in effect is a prepared statement, placed before the request that will return the data in the response you are looking for. For example, your function will specify a left and right boundary of the data that it is looking for before you make the request. Then the request is made and if a match is found, then the data is saved in a parameter which you can later call as a variable in subsequent requests. LoadRunner also has a feature called Correlation Studio which takes affect during recording of your script, using a similar approach (left and right boundaries) and then dynamically swapping corresponding matches with the variabilzed data. All this is quite painful though, and whenever I&#8217;m specifying primitive left and right boundaries or using the flaky Correlation Studio (I can explain if you like), I&#8217;m left wishing I could just use regular expressions &#8230;</p>
<p>The trick to correlating data easily with JMeter is to first know what data it is that needs correlating! (duh&#8230;) Experience will make this easier as a lot of common web apps have common dynamic data requirements as already mentioned. Another trick is to <strong>always</strong> record the script twice (and diff to see differences between unique user sessions), then <strong>more often than not</strong> record 2+ iterations of an action within a single script (and diff to see differences between user transactions/actions). If you do this before anything else, and diff the results, you will save bucketloads of heartache in getting your script harnesses running, no matter which tool you choose.</p>
<p>But back to JMeter, once you do know what data you need to correlate, simply create a Post Processor -> Regular Expression Extractor to &#8216;variablize&#8217; that data. Huh? Read on for a more detailed explanation of this.<br />
<span id="more-189"></span></p>
<p>In my following example, I have 4 dummy pages that return unique jsessionid&#8217;s for each page as follows:</p>
<li>jsessionid=111_CATSNDOGS!50775&#038;</li>
<li>jsessionid=222_BATSNCATS!021278&#038;</li>
<li>jsessionid=333_SHEEPNGOATS!140679&#038;</li>
<li>jsessionid=444_FISHNCHIPS!120880&#038;</li>
<p>I&#8217;ve done this to simulate the changing session information typically found in any jsp based web app. To look for a jsessionid I simply add a new <strong>Post Processor</strong> called the <strong>Regular Expression Extractor</strong>. The following screenshot shows an example:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/07/regex_extractor.png' title='regex extractor'><img src='http://90kts.com/blog/wp-content/uploads/2008/07/regex_extractor.png' alt='regex extractor' /></a></p>
<p>In the example provided, the reference name is what I can later call upon as a variable within the script, for example, ${jsessionid_trans}. The regular expression is the pattern I am looking for. Note in using a parenthesis I&#8217;m specifying a subexpression which I can get to with the match result number of n(1). If you&#8217;re new to regex, my example is equivalent to saying look for a left boundary of jsessionid= then match any character until you hit an ampersand. Even if you know nothing about regex, this will probably get you out of hot water 90% of the time. The real power in regex though is the ability to manipulate and narrow in on search results, or search for varying patterns (like telephone numbers, alphanumeric sequences and so on). I still find the Perl regular expression tutorials the best:<br />
<a href="http://perldoc.perl.org/perlretut.html">http://perldoc.perl.org/perlretut.html</a></p>
<p>So that&#8217;s it, you&#8217;ve found the jsessionid and to use it later on in your script, you simply call on it as a variable i.e. ~koops/test_jmeter/page2.html?value=${jsessionid}<br />
I often find it is easier to open up your test plan (.jmx) in your favourite text editor and then use the same regular expression to search and replace all instances of that pattern with your newly set variable.</p>
<p>However there is a twist to all this, which I refer to as scope. You really need to understand the scope of your regular expression extractors and how they are applied. By scope I&#8217;m loosely referring to variable scope in a normal programming language (which JMeter is not). I think the best way to understand the scope of your extractors, is to identify which &#8216;container&#8217; they are placed in. For a JMeter test plan, there are multiple containers you might place these extractors in:</p>
<li>The overall Test Plan, which I call &#8216;global&#8217; in scope</li>
<li>An individual Thread Group, which I call &#8216;thread&#8217; in scope</li>
<li>An individual Transaction Controller, which I call &#8216;local&#8217; in scope</li>
<li>An individual Request Sampler, which I call &#8216;trans&#8217; in scope</li>
<p>If you&#8217;re familiar with programming languages and scoping, then you&#8217;ll probably identify the pecking order of the scope I&#8217;ve just mentioned, from global right down to transaction level (I&#8217;ve made up a few names there). Global variables will override local variables and so on down the chain. So you need to be careful where you place your regular expression extractors and what reference (variable) names you use, as these can interfere with each other. Sometimes it is useful to limit your extractor in scope to a particular transaction, thread group or test plan.</p>
<p>In my example listed above, I&#8217;ve written a test plan to explore the different scopes identified. Using the debug sampler, you can see that the <em>trans</em> scope is limited to single request sampler, because it is added as a child element. This means the variable <em>jsessionid_trans</em> gets set only once. The <em>local</em> scope is limited to a transaction controller. I placed it before the second request sampler but not as a child to the first, to highlight how it sets the variable <em>jsessionid_local</em> twice (once for each request contained in that transaction controller). The <em>thread</em> scope is limited to the entire thread group, so you will see the <em>jsessionid_thread</em> variable set three times as each page is requested. The same applies to the <em>global</em> scope in which case the <em>jsessionid_global</em> variable is set on each occurrence of the pattern. I&#8217;ve also added a second thread group with its own debug sampler to highlight how only global variables are accessible by this thread group. You can run <a href='http://90kts.com/blog/wp-content/uploads/2008/07/regex_testjmx.zip' title='regex_test.jmx'>this test plan <strong>(regex_test.jmx)</strong></a> yourself and check out the results as shown below:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/07/regex_scope.png' title='regex_scope'><img src='http://90kts.com/blog/wp-content/uploads/2008/07/regex_scope.png' alt='regex_scope' /></a></p>
<p>Finally, here are some example regular expressions which have worked well for me for different types of web apps:<br />
<code>jsessionid=(.+?)&#038;<br />
jsessionid=(.+?)'<br />
id="__VIEWSTATE" value="(.+?)"<br />
jsd=(\d+)<br />
strEntry=(.+?)'<br />
CdzSession' value='(.+?)'<br />
WebiSession' value='(.+?)'<br />
DOCTOKEN VALUE='(.+?)'<br />
etc ...</code></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2008/jmeter-tips-and-tricks-correlating-with-regular-expressions/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>JMeter Tips and Tricks &#8211; Better (More Pretty) Graphs</title>
		<link>http://altentee.com/blogs/2008/jmeter-tips-and-tricks-better-more-pretty-graphs/</link>
		<comments>http://altentee.com/blogs/2008/jmeter-tips-and-tricks-better-more-pretty-graphs/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 08:58:07 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[jmeter]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2008/jmeter-tips-and-tricks-better-more-pretty-graphs/</guid>
		<description><![CDATA[This plugin has been around for a while and it&#8217;s definitely worth including in your JMeter library if you want to go for a glossy finish! The StatAggVisualizer will transform your graphs from this to this If you roll-up your transactions into separate transaction controllers as I demonstrated in a previous post, you will get [...]]]></description>
			<content:encoded><![CDATA[<p>This <strong><a href="http://rubenlaguna.com/wp/better-jmeter-graphs/">plugin</a></strong> has been around for a while and it&#8217;s definitely worth including in your JMeter library if you want to go for a glossy finish! The  <strong><a href="http://rubenlaguna.com/wp/wp-content/uploads/2007/01/stataggvisualizer.zip">StatAggVisualizer</a></strong> will transform your graphs<br />
from this<a href='http://90kts.com/blog/wp-content/uploads/2008/07/old_graph.png' title='old_graph.png'><img src='http://90kts.com/blog/wp-content/uploads/2008/07/old_graph.thumbnail.png' alt='old_graph.png' /></a> to this<a href='http://90kts.com/blog/wp-content/uploads/2008/07/new_graph.png' title='new_graph.png'><img src='http://90kts.com/blog/wp-content/uploads/2008/07/new_graph.thumbnail.png' alt='new_graph.png' /></a></p>
<p>If you roll-up your transactions into separate transaction controllers as I demonstrated in a <a href="http://90kts.com/blog/2008/jmeter-tips-and-tricks-application-simulation-models/">previous post</a>, you will get useful summary views for all your transactions:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/07/transaction_summary.png' title='transaction_summary.png'><img src='http://90kts.com/blog/wp-content/uploads/2008/07/transaction_summary.png' alt='transaction_summary.png' /></a></p>
<p>Alternatively, drop a stat agg visualizer listener under a single controller to get a graph for a single transaction, useful if clients are only interested in certain transactions.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/07/stat_add_individual.png' title='stat_add_individual.png'><img src='http://90kts.com/blog/wp-content/uploads/2008/07/stat_add_individual.png' alt='stat_add_individual.png' /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/blogs/2008/jmeter-tips-and-tricks-better-more-pretty-graphs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

