<?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 &#187; Performance &#38; Test Automation Experts &#187; tools</title>
	<atom:link href="http://altentee.com/tag/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://altentee.com</link>
	<description>Performance and Test Automation Experts</description>
	<lastBuildDate>Sat, 12 Jun 2010 00:35:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Instant Website Tests with BrowserMob</title>
		<link>http://altentee.com/2010/instant-website-tests-with-browsermob/</link>
		<comments>http://altentee.com/2010/instant-website-tests-with-browsermob/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 00:40:28 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[Altentee]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://altentee.com/?p=782</guid>
		<description><![CDATA[<p>Can you afford a slow landing page?</p>
<p>Google AdWords page quality criteria are many, a prominent check being your landing page load time. A slow load time can lead to a lower quality score.</p>
<p>Make sure you&#8217;re not wasting effort on advertising campaigns. Altentee uses BrowserMob to help check website performance for clients from multiple locations. You [...]]]></description>
			<content:encoded><![CDATA[<p>Can you afford a slow landing page?</p>
<p>Google AdWords page quality criteria are many, a prominent check being your <a href="http://adwords.google.com/support/aw/bin/answer.py?hl=en&amp;answer=87144">landing page load time</a>. A slow load time can lead to a lower quality score.</p>
<p><a href="http://altentee.com/wp-content/uploads/Screen-shot-2010-01-06-at-9.11.48-AM.png"><img class="size-full wp-image-784 alignleft" title="Screen shot 2010-01-06 at 9.11.48 AM" src="http://altentee.com/wp-content/uploads/Screen-shot-2010-01-06-at-9.11.48-AM.png" alt="" width="274" height="95" /></a>Make sure you&#8217;re not wasting effort on advertising campaigns. <strong>Altentee </strong>uses <a href="http://browsermob.com">BrowserMob</a> to help check website performance for clients from multiple locations. You can run a free check using the form below.</p>
<form id="InstantTest" action="http://browsermob.com/instant-website-test" method="post">
<input id="InstantTest_url" class="urlTextBox default_value" name="url" type="text" value="yoursite.com" />
<input type="submit" value="go" /> (redirects to BrowserMob)<br />
</form>
<p>If you need help optimizing your landing page, or help with performance testing in general feel free to <a href="http://altentee.com/corporate/contact/">contact</a> <strong>Altentee</strong> today.</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2010/instant-website-tests-with-browsermob/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Favourite SCiTE settings &#8230;</title>
		<link>http://altentee.com/2009/my-favourite-scite-settings/</link>
		<comments>http://altentee.com/2009/my-favourite-scite-settings/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 20:05:16 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/?p=260</guid>
		<description><![CDATA[<p>Well the subject goes without saying. I&#8217;ve been working on WinXP again lately and when I&#8217;m not around my favourite text editor on the mac (TextMate) I opt for SCiTE on windows. The following settings I find useful for this simple but powerful text editor. YMMV.</p>
<p>
# auto complete word
autocompleteword.automatic=1</p>
<p># advanced find and replace
find.replace.advanced=1</p>
<p> </p>
<p># force [...]]]></description>
			<content:encoded><![CDATA[<p>Well the subject goes without saying. I&#8217;ve been working on WinXP again lately and when I&#8217;m not around my favourite text editor on the mac (TextMate) I opt for SCiTE on windows. The following settings I find useful for this simple but powerful text editor. YMMV.</p>
<p><code><span id="more-260"></span><br />
# auto complete word<br />
autocompleteword.automatic=1</code></p>
<p><code># advanced find and replace<br />
find.replace.advanced=1</code></p>
<p><code> </code></p>
<p><code># force monospaced fonts<br />
font.base=$(font.monospace)<br />
font.small=$(font.monospace)<br />
font.comment=$(font.monospace)<br />
font.text=$(font.monospace)<br />
font.text.comment=$(font.monospace)<br />
font.embedded.base=$(font.monospace)<br />
font.embedded.comment=$(font.monospace)<br />
font.vbs=$(font.monospace)<br />
font.monospace=font:DejaVu Sans Mono,size:8</p>
<p># split horizontal instead of vertical<br />
split.vertical=0</p>
<p># Wrapping of long lines<br />
wrap=1</p>
<p># one instance of SciTE only<br />
check.if.already.open=1</p>
<p># save on deactivate<br />
save.on.deactivate=1</p>
<p># full path in title<br />
title.full.path=1</p>
<p># indentation<br />
tabsize=2<br />
indent.size=2<br />
use.tabs=1</p>
<p># max number of tabs<br />
buffers=20</p>
<p># reload file and prompt on activation<br />
load.on.activate=1</p>
<p># prompt me for any suspicous action<br />
are.you.sure.on.reload=1</p>
<p></code></p>
<p><code># show the status bar<br />
statusbar.visible=1<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/my-favourite-scite-settings/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why Load Testing Does Not Work for the Web `Date::today &gt;&gt; 36`</title>
		<link>http://altentee.com/2009/why-load-testing-does-not-work-for-the-web-datetoday-36/</link>
		<comments>http://altentee.com/2009/why-load-testing-does-not-work-for-the-web-datetoday-36/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 21:20:50 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/why-load-testing-does-not-work-for-the-web-datetoday-36/</guid>
		<description><![CDATA[<p>I was going to write why LoadRunner does not work for the web as it is today and into the foreseeable future, but decided against that because I don&#8217;t think the following points are necessarily limited to a specific toolset.</p>
<p>Load testing does not work for web as it is today primarily because&#8230;

1. Load testing tool [...]]]></description>
			<content:encoded><![CDATA[<p>I was going to write why LoadRunner does not work for the web as it is today and into the foreseeable future, but decided against that because I don&#8217;t think the following points are necessarily limited to a specific toolset.</p>
<p>Load testing does not work for web as it is today primarily because&#8230;<br />
<span id="more-259"></span><br />
<em>1. Load testing tool languages are not flexible enough. </em><br />
Load testing tools are in need of a major overhaul. Consider <a href="https://h10078.www1.hp.com/cda/hpms/display/main/hpms_content.jsp?zn=bto&#038;cp=1-11-126-17%5E8_4000_100__"><strong>LoadRunner</strong></a>, the majority of your scripts will be specified in C or proprietary API calls such as lr_ statements. String manipulation for example, whilst possible is extremely clunky and requires oodles of C code. <strong><a href="http://90kts.com/blog/2009/regex-search-and-replace-in-loadrunner/">Lack of proper regex</a></strong> or xpath support limits script flexibility in terms of parsing the necessary contents of web page and ajax calls. Don&#8217;t even get me started on ajax! Similar complaints for <a href="http://jakarta.apache.org/jmeter/"><strong>JMeter</strong></a>. Although better support for regex you can really only edit test plans via the GUI. You&#8217;ll go cross-eyed looking at test plans in xml. I think <a href="http://grinder.sourceforge.net/"><strong>the Grinder</strong></a> is the closest product I&#8217;ve seen that supports flexibility as you can write tests in Jython which provides more flexibility in terms of scripting.</p>
<p><em>2. We&#8217;re still stuck in record and playback mode.</em><br />
We really haven&#8217;t advanced like our automation brethren. Part of the big sell by commercial load testing companies is &#8220;Look it&#8217;s easy, just hit the red button and play it back when you&#8217;re finished!&#8221;. Bollocks to that, we know that never works. A dream load testing tool would support the ability to hand-code your statements and be editable in a text editor! In a similar fashion to <a href="http://watir.com"><strong>watir</strong></a>.</p>
<p>The dream tool would look like:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">vusers.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  browser.<span style="color:#9900CC;">goto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'url'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  browser.<span style="color:#9900CC;">button</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:text</span>, <span style="color:#006600; font-weight:bold;">/</span>Continue<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">click</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Instead load testing scripts in LoadRunner look something like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">web_submit_data<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;transaction&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;Action=https://someurl/I/have/to/keep/correlating/damn/it&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;Method=POST&quot;</span>
<span style="color: #ff0000;">&quot;RecContentType=&quot;</span>text<span style="color: #339933;">/</span>html<span style="color: #ff0000;">&quot;,
&quot;</span>Mode<span style="color: #339933;">=</span>HTML<span style="color: #ff0000;">&quot;,
&quot;</span>ITEMDATA<span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;Name=L_3_0_0_1_0_1&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Value={another_value_I_have_to_correlate}&quot;</span><span style="color: #339933;">,</span>
<span style="color: #ff0000;">&quot;Name=L_3_0_0_2_0_1&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Value={maybe_paramatize_this_one}&quot;</span><span style="color: #339933;">,</span>
ENDITEM<span style="color: #339933;">,</span>
LAST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>We are of course talking about very different technologies. Watir automation scripts driving real browsers with win32ole, whereas most load testing tools are injecting traffic at the protocol layer. If a typical end to end scenario has 30 steps, this can amount to some 2000+ lines of code thanks to the extra verbosity of having to specify all the form values and so forth. This also means you have oodles of code to correlate and parametize. It&#8217;s not something you want to hand code, the quickest path is to record (unfortunately). <a href="http://browsermob.com"><strong>BrowserMob</strong></a> is the closest online provider I&#8217;ve seen that overcomes this, supporting load tests written as selenium scripts. Problem is, we need a solution for all those non-public facing companies, the bulk of where I do my work at!</p>
<p><em>3. No real code versioning. </em><br />
Changes to the UI will break your script! One can implement their own code versioning as I have recently begun to do with git but there really should be built in support for this. That aside, you revision your code but effectively blast it away every time you hit the red record button. Reason? Each recording can look vastly different to the last. It only takes one form value L_3_0_0_1_0_1 to change to L_3_0_0_1_0_2 or one block of code executed by an ajax call to shift to cause mass confusion. Versioning your code *may* pick this change up, but only if you got the power of the diff! Diffing just got a little harder. Shoot back 10 years ago and diffing for correlation would have been a cinch. Wind forward to today with hundreds of ajax or json calls and correlation can be a nightmare. Windiff struggles. <a href="http://code.google.com/p/daisydiff/"><strong>Daisydiff</strong></a> does a much better job highlighting differences by line and by column. This approach kind of works in a waterfall test environment. Throw in a twice weekly code drop in your performance test environment and watch your scripts break. Agile anyone?</p>
<p>So if I was an uber-elite programmer what would I do to move loadtesting into the current decade?<br />
<em>1. Develop a load-testing tool that is based on a flexible scripting language such as Ruby.<br />
2. Get rid of the record button and provide free text editors to the world!<br />
3. Provide a framework that can be versioned and easily detect changes in the system under test.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/why-load-testing-does-not-work-for-the-web-datetoday-36/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Vim Cheat Sheets on a Mug</title>
		<link>http://altentee.com/2009/vim-cheat-sheets-on-a-mug/</link>
		<comments>http://altentee.com/2009/vim-cheat-sheets-on-a-mug/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 07:39:27 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/vim-cheat-sheets-on-a-mug/</guid>
		<description><![CDATA[<p>I&#8217;ve been thinking about some promotional material for the company I work for. What inspired me was seeing a vi coffee mug&#8230; Unfortunately only available in the US. I&#8217;ve been endeavouring to wean myself off textmate and the like so thought this was a brilliant idea. But with limited space, what essential commands should go [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking about some promotional material for the company I work for. What inspired me was seeing a vi coffee mug&#8230; Unfortunately only <a href="http://nostarch.com/frameset.php?startat=mug">available</a> in the US. I&#8217;ve been endeavouring to wean myself off textmate and the like so thought this was a brilliant idea. But with limited space, what essential commands should go on a vim cheat sheet? What other cheat sheets would you like to see in this format?</p>
<p><span id="more-242"></span><br />
<code><br />
:e filename 	Open a new file.<br />
:w filename 	Save changes to a file.<br />
:q 	Quit Vim.<br />
:q! 	Exit Vim without saving changes.<br />
:wq 	Write the file and exit. <img src='http://altentee.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' />  	Exits without writing the file.<br />
j  	Move the cursor up one line.<br />
k  	Down one line.<br />
l  	Right one character.<br />
h  	Left one character.<br />
e 	To the end of a word.<br />
E 	To the end of a whitespace-delimited word.<br />
b 	To the beginning of a word.<br />
B 	To the beginning of a whitespace-delimited word.<br />
0 	To the beginning of a line.<br />
^ 	To the first non-whitespace character of a line.<br />
$ 	To the end of a line.<br />
H 	To the first line of the screen.<br />
M 	To the middle line of the screen.<br />
L 	To the the last line of the screen.<br />
:n 	Jump to line number n.<br />
i 	Insert before cursor.<br />
I 	Insert to the start of the current line.<br />
a 	Append after cursor.<br />
A 	Append to the end of the current line.<br />
o 	Open a new line below and insert.<br />
O 	Open a new line above and insert.<br />
C 	Change the rest of the current line.<br />
r 	Overwrite one character.<br />
R 	Enter insert mode but replace characters.<br />
x 	Delete characters under the cursor.<br />
X 	Delete characters before the cursor.<br />
dd  	Delete the current line.<br />
v 	Start highlighting characters.<br />
V 	Start highlighting lines.<br />
~ 	Change the case of characters.<br />
> (V) 	Shift right.<br />
< (V) 	Shift left.<br />
c (V) 	Change the highlighted text.<br />
y (V) 	Yank the highlighted text.<br />
d (V) 	Delete the highlighted text.<br />
yy  	Yank the current line.<br />
p 	Put characters after the cursor.<br />
P 	Put characters before the cursor.<br />
u 	Undo the last action.<br />
U 	Undo all the latest changes.<br />
Ctrl + r 	Redo.<br />
/pattern 	Search the file for pattern.<br />
n 	Scan for next search match<br />
N 	Scan for next search match opposite direction.<br />
:%s/foo/bar/a 	Substitute foo with bar.<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/vim-cheat-sheets-on-a-mug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sparklines</title>
		<link>http://altentee.com/2009/sparklines/</link>
		<comments>http://altentee.com/2009/sparklines/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 07:17:45 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/sparklines/</guid>
		<description><![CDATA[<p>&#8220;Sparklines: Intense, Simple, Word-Sized Graphics&#8221;</p>
<p>If you&#8217;ve been reading this blog for sometime, you will know I&#8217;ve got a certain penchant for sparklines, a term coined by Edward Tufte and referred to in his book titled &#8220;Beautiful Evidence&#8221;</p>
<p>True sparklines are meant to be word-like graphics, such that they fit inline with the body of the text, [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Sparklines: Intense, Simple, Word-Sized Graphics&#8221;</p>
<p>If you&#8217;ve been reading this blog for sometime, you will know I&#8217;ve got a certain penchant for sparklines, a term coined by Edward Tufte and referred to in his book titled &#8220;Beautiful Evidence&#8221;</p>
<p>True sparklines are meant to be word-like graphics, such that they fit inline with the body of the text, however I&#8217;ve had difficulty implementing this with tools such as Excel or custom chart libraries like JFreeChart. The Google Chart API makes this relatively simple.</p>
<p>To that end, my choice of implementation is to present inline with a paragraph. Say for example I wanted to display the amount of jobs advertised over 4 months, then my version of a sparkline would look like this:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/09/sparkline_jobs.png' title='sparkline jobs'><img src='http://90kts.com/blog/wp-content/uploads/2008/09/sparkline_jobs.png' alt='sparkline jobs' /></a></p>
<p>Sure, it&#8217;s pixelated, the colours are a little hard to differentiate, and the vertical axis is lacking a scale or unit of measurement. However this simple column chart does convey quite succinctly, when jobs are advertised, whether it is the start, middle of end of a month, and how many jobs are available per month.</p>
<p>So what makes a perfect sparkline? To be honest, I don&#8217;t ever think sparklines should be used as a supplement for detail. I believe sparklines are best used in situations where you want to convey a lot of data in a small space. They really should be thought of as triggers, not from which you conduct a detailed analysis, but something which triggers the thought to pursue more information in the first place.</p>
<p>Here&#8217;s another example recently used to show size of allocation failures on an IBM JVM heap.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/06/allocfailures.png' title='allocfailures'><img src='http://90kts.com/blog/wp-content/uploads/2009/06/allocfailures.png' alt='allocfailures' /></a></p>
<p>Cool? Go get em: http://en.wikipedia.org/wiki/Sparkline</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/sparklines/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gantt Charts in Open Office</title>
		<link>http://altentee.com/2009/gantt-charts-in-open-office/</link>
		<comments>http://altentee.com/2009/gantt-charts-in-open-office/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 09:51:41 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/gantt-charts-in-open-office/</guid>
		<description><![CDATA[<p>This might help you out when analyzing time series data.</p>
<p>In this particular situation I&#8217;m looking at a bunch of SOA web services that get called synchronously in the backend infrastructure. The logs have entries with a unix timestamp, service description and duration. What I want to do is view the data in a Gantt Chart [...]]]></description>
			<content:encoded><![CDATA[<p>This might help you out when analyzing time series data.</p>
<p>In this particular situation I&#8217;m looking at a bunch of SOA web services that get called synchronously in the backend infrastructure. The logs have entries with a unix timestamp, service description and duration. What I want to do is view the data in a Gantt Chart format. This <a href="http://office.microsoft.com/en-us/excel/HA010346051033.aspx">link</a> from Microsoft put me on the right track.</p>
<p>Here&#8217;s how to do it in Open Office.<br />
<span id="more-228"></span><br />
The original data highlighted in green has a unix timestamp, service name and duration in milliseconds.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/03/gantt_data.png' title='gantt_data'><img src='http://90kts.com/blog/wp-content/uploads/2009/03/gantt_data.png' alt='gantt_data' /></a></p>
<p>I&#8217;ve inserted some additional columns as follows:<br />
elapsed_secs = timestamp &#8211; minimum of timestamp column<br />
duration_secs = duration_msecs / 1000</p>
<p>Then I&#8217;ve created a chart using columns B, C &#038; D as the data source i.e. B1:E10<br />
Create a stacked horizontal bar chart, remove the line colour and fill for elapsed seconds data series and there you have it. A nice little gantt chart demonstrating when services were called and a visual indication of their duration.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/03/gantt_chart.png' title='gantt_chart'><img src='http://90kts.com/blog/wp-content/uploads/2009/03/gantt_chart.png' alt='gantt_chart' /></a></p>
<p>I know it&#8217;s really simple, but often the simple things demonstrate a point better than bucket loads of data. Here&#8217;s an <a href='http://90kts.com/blog/wp-content/uploads/2009/03/gantt_chart_unixtimestampods.zip' title='gantt_ods'>ODS</a> and <a href='http://90kts.com/blog/wp-content/uploads/2009/03/gantt_chart_unixtimestampxlsx.zip' title='gantt_xls'>XLS</a> template.</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/gantt-charts-in-open-office/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Microsoft Log Parser to the Rescue</title>
		<link>http://altentee.com/2009/microsoft-log-parser-to-the-rescue/</link>
		<comments>http://altentee.com/2009/microsoft-log-parser-to-the-rescue/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 19:15:09 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/microsoft-log-parser-to-the-rescue/</guid>
		<description><![CDATA[<p>I hate to say it&#8230; but Microsoft really have produced an excellent tool for sysadmins and performance testers alike. That tool is called LogParser. I&#8217;ve mentioned it before but that was more IIS specific. LogParser can be pointed at just about any type of log file. So with a bit of Perl (or equivalent) to [...]]]></description>
			<content:encoded><![CDATA[<p>I hate to say it&#8230; but Microsoft really have produced an excellent tool for sysadmins and performance testers alike. That tool is called LogParser. I&#8217;ve mentioned it <a href="http://90kts.com/blog/2007/using-microsofts-log-parser-to-analyse-web-server-traffic/">before</a> but that was more IIS specific. LogParser can be pointed at just about any type of log file. So with a bit of Perl (or equivalent) to cleanup, and LogParser I was able to analyze Gigabytes of IBM WebSEAL access logs on a production system.</p>
<p><span id="more-226"></span><br />
Go to my fileshare at http://90kts.com/uploads and download/install the following files, or google for the latest binaries, using the defaults.<br />
<code>LogParser.msi<br />
gzip-1.3.12-1-setup.exe</code></p>
<p>Create a working directory e.g.<code> C:\working</code><br />
Copy the <code>parser.pl</code> to your working directory</p>
<p>parser.pl code looks like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>IN<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&lt;$ARGV[0]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>OUT<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&gt;processed.csv&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span> OUT <span style="color: #ff0000;">&quot;host, user, datetime, method, file, http, code, bytes&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009999;">&lt;in&gt;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">my</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">chomp</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/\[|\]|\+1100|&quot;//g</span><span style="color: #339933;">;</span>
  <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/\s+/,/g</span><span style="color: #339933;">;</span>
  <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/2009:/2009 /g</span><span style="color: #339933;">;</span>
  <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/,\-,/,/g</span><span style="color: #339933;">;</span>
  <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/,$//g</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066;">print</span> OUT <span style="color: #ff0000;">&quot;$line<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span>IN<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span>OUT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Copy a gz&#8217;d log fie to the working directory and open a cmd shell there<br />
WebSEAL logs look a little like this:<br />
<code>10.1.2.3 - TKOOPS [05/Feb/2009:06:54:11 +1100] "GET HTTP://productionsite.com/wps/CacheProxyServlet/colorPalette/default/browserVendor/Microsoft/browserName/Internet+Explorer/browserVersion/6.0/locale/en/forwardurl/wps/themes/html/images/portlet-table-heading-bg-right.gif HTTP/1.1" 304 0</code></p>
<p>Run the following commands:<br />
<code>gunzip request.log.2009-02-06-06-59-36_DIR.gz<br />
parser.pl request.log.2009-02-06-06-59-36_DIR</code></p>
<p>To view the number of requests grouped by 5 minute intervals and HTTP result code run this from the cmd shell:<br />
<code>"C:\Program Files\Log Parser 2.2\LogParser.exe" "SELECT QUANTIZE(datetime,300) AS TimeRange, code AS HttpCode, Count(*) AS Count FROM C:\working\processed.csv GROUP BY TimeRange, code" -i:CSV -iTsFormat:"dd/MMM/yyyy hh:mm:ss" -o:DATAGRID</code></p>
<p>To view the number of requests grouped by 5 minute intervals and User ID run this from the cmd shell:<br />
<code>"C:\Program Files\Log Parser 2.2\LogParser.exe" "SELECT QUANTIZE(datetime,300) AS TimeRange, user AS User, Count(*) AS Count FROM C:\working\processed.csv GROUP BY TimeRange, user" -i:CSV -iTsFormat:"dd/MMM/yyyy hh:mm:ss" -o:DATAGRID</code></p>
<p>Note these two commands will send results to a GUI datagrid, from which you can copy results into excel and chart if you wish. If you don&#8217;t want the datagrid and just want stdout then omit the -o:DATAGRID tag from the command. Example output is shown as follows:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/03/screen-capture.png' title='logparser screen'><img src='http://90kts.com/blog/wp-content/uploads/2009/03/screen-capture.png' alt='logparser screen' /></a></p>
<p>LogParser also has its own charting equivalent, which I haven&#8217;t explored. My parser is the bit that cleans up the file and adds the headers etc. Hopefully you can get enough from these instructions to tackle it on your own. For all you perl haters out there, I already know the answer to this question. <a href="http://isperldeadyet.com"><strong>Is perl dead yet</strong></a>? Feel free to post your python, ruby, shell equivalents.</p>
<p>PS. we ended up modifying the <code>parser.pl</code> used above to iterate through a directory full of gz files as such:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #0000ff;">$dirname</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$ARGV</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> <span style="color: #ff0000;">'C:\working'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">opendir</span><span style="color: #009900;">&#40;</span>DIR<span style="color: #339933;">,</span> <span style="color: #0000ff;">$dirname</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;can't open directory $dirname: $!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000066;">readdir</span><span style="color: #009900;">&#40;</span>DIR<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$file</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/\.gz/</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$unzip</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`c:<span style="color: #000099; font-weight: bold;">\\</span>PROGRA~1<span style="color: #000099; font-weight: bold;">\\</span>GnuWin32<span style="color: #000099; font-weight: bold;">\\</span>bin<span style="color: #000099; font-weight: bold;">\\</span>gzip -d $dirname<span style="color: #000099; font-weight: bold;">\\</span>$file`</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$file</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/(.+?)\.gz/</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>IN<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&lt;$dirname<span style="color: #000099; font-weight: bold;">\\</span>$filename&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>OUT<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&gt;$filename.log&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066;">print</span> OUT <span style="color: #ff0000;">&quot;host, user, datetime, method, file, http, code, bytes&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009999;">&lt;in&gt;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
          <span style="color: #b1b100;">my</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_</span><span style="color: #339933;">;</span>
          <span style="color: #000066;">chomp</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/\[|\]|\+1100|&quot;//g</span><span style="color: #339933;">;</span>
          <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/\s+/,/g</span><span style="color: #339933;">;</span>
          <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/2009:/2009 /g</span><span style="color: #339933;">;</span>
          <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/,\-,/,/g</span><span style="color: #339933;">;</span>
          <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/,$//g</span><span style="color: #339933;">;</span>
&nbsp;
          <span style="color: #000066;">print</span> OUT <span style="color: #ff0000;">&quot;$line<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span>IN<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span>OUT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066;">unlink</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;$filename&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #000066;">closedir</span><span style="color: #009900;">&#40;</span>DIR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/microsoft-log-parser-to-the-rescue/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Data Driven AutoIt Scripts</title>
		<link>http://altentee.com/2009/data-driven-autoit-scripts/</link>
		<comments>http://altentee.com/2009/data-driven-autoit-scripts/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 05:16:52 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/data-driven-autoit-scripts/</guid>
		<description><![CDATA[<p>I&#8217;ve recently been playing around with AutoIt in an effort to steer clear of QTP and the like. AutoIt is a simple but effective way in which to automate pretty much any Windows GUI application. To that end I needed a simple data driven framework to include in the script. AutoIt comes with some handy [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently been playing around with <a href="http://www.autoitscript.com/autoit3/"><strong>AutoIt</strong></a> in an effort to steer clear of QTP and the like. AutoIt is a simple but effective way in which to automate pretty much any Windows GUI application. To that end I needed a simple data driven framework to include in the script. AutoIt comes with some handy Excel user defined functions which allow you to do the same.</p>
<p>For example, the following spreadsheet:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2009/01/spread_autoit.png' title='autoit spreadsheet example'><img src='http://90kts.com/blog/wp-content/uploads/2009/01/spread_autoit.png' alt='autoit spreadsheet example' /></a></p>
<p>Can be read into an array and looped through as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;">#include &lt;excel.au3&gt;
#include &lt;array.au3&gt;
&nbsp;
$file = @ScriptDir &amp; <span style="color: #800000;">&quot;\excel.xls&quot;</span>
$oExcel = _ExcelBookOpen($file, 0) ; <span style="color: #000080;">open</span> excel <span style="color: #000080;">in</span> the background
&nbsp;
$aArray = _ExcelReadSheetToArray($oExcel, 2) ; ignoring header row
_ArrayDisplay($aArray, <span style="color: #800000;">&quot;Array using Default Parameters&quot;</span>)
&nbsp;
<span style="color: #000080;">For</span> $i = 1 <span style="color: #000080;">to</span> <span style="color: #000080;">UBound</span>($aArray)-1
	$name 	 = $aArray[$i][1]
	$surname = $aArray[$i][2]
&nbsp;
	; <span style="color: #000080;">do</span> application stuff
	MsgBox(0,<span style="color: #008000;">'debug', $name &amp;' '&amp; $surname )
</span>
	; write result <span style="color: #000080;">to</span> the book
	_ExcelWriteCell($oExcel, <span style="color: #800000;">&quot;PASS&quot;</span>, $i+1, 5)
&nbsp;
<span style="color: #000080;">Next</span>
&nbsp;
_ExcelBookClose($oExcel) ; <span style="color: #000080;">close</span> excel</pre></div></div>

<p>Pretty simple stuff!</p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/data-driven-autoit-scripts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Establishing Concurrency from your Web Logs</title>
		<link>http://altentee.com/2009/establishing-concurrency-from-your-web-logs/</link>
		<comments>http://altentee.com/2009/establishing-concurrency-from-your-web-logs/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 03:25:23 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2009/establishing-concurrency-from-your-web-logs/</guid>
		<description><![CDATA[<p>I recently had a conversation with a colleague about how one might determine the concurrency for a given page or transaction at any point in time. The system under test was a typical web server and we had access to the web logs for analysis.</p>
<p>That is, we wanted to know how many virtual users were [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had a conversation with a colleague about how one might determine the concurrency for a given page or transaction at any point in time. The system under test was a typical web server and we had access to the web logs for analysis.</p>
<p>That is, we wanted to know how many virtual users were hitting a web page at the same time without using a sledgehammer to open the walnut so to speak&#8230; To that end we fell back to simple unix commands like awk, sort and uniq.</p>
<p>The typical web log entry we were looking for looked like this:<br />
<code>10.1.20.10 - Unauth [16/Dec/2008:11:59:16 +1100] "GET HTTP://system.under.test/secure.html HTTP/1.1" 200 692</code></p>
<p>On windows we would use a command similar to this to generate our report:<br />
<code>gawk "{print $4,$7}" web01-request.log | grep "\/secure" | uniq -c | sort -T C:\temp | gawk "{print $1}" | uniq -c</code></p>
<p>The first awk prints the date time column and url column which we then grep for any entries containing our target word &#8217;secure&#8217; (we could have done this in the awk statement too).</p>
<p>Then we use uniq -c to generate a unique count of rows that have the same date time, sort that (using a temp file), awk again on the first column and uniq -c again. The output looks like this:<br />
<code><br />
   2218 1<br />
   1483 2<br />
    263 3<br />
    258 4<br />
     38 5<br />
     36 6<br />
      2 7<br />
      5 8<br />
      1 12<br />
</code><br />
So we can then determine for example that there were 1,483 occurrences where 2 virtual users hit the target at the same time. There were 258 occurrences where 4 virtual users hit the target at the same time and so on.</p>
<p>You can then graph this using the google chart API. No excel required =)<br />
<img src="http://chart.apis.google.com/chart?chs=250x100&#038;cht=bhs&#038;chd=t:2218,1483,263,258,38,36,2,5,1&#038;chxl=0:|12|8|7|6|5|4|3|2|1&#038;chxt=y&#038;chbh=a&#038;chds=0,2218"  /></p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2009/establishing-concurrency-from-your-web-logs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance Testing with Apdex</title>
		<link>http://altentee.com/2008/performance-testing-with-apdex/</link>
		<comments>http://altentee.com/2008/performance-testing-with-apdex/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 04:03:41 +0000</pubDate>
		<dc:creator>Tim Koopmans</dc:creator>
				<category><![CDATA[90kts]]></category>
		<category><![CDATA[Altentee]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://90kts.com/blog/2008/performance-testing-with-apdex/</guid>
		<description><![CDATA[<p>Often when performance testing in a black box environment, you are left with the onerous responsibility to report against response time performance.</p>
<p>A typical approach by performance testers is to rely on 95th percentiles, which is effectively a Service Level Agreement (SLA) saying that 95 percent of all my samples have a response time below 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Often when performance testing in a black box environment, you are left with the onerous responsibility to report against response time performance.</p>
<p>A typical approach by performance testers is to rely on 95th percentiles, which is effectively a Service Level Agreement (SLA) saying that 95 percent of all my samples have a response time below 5 seconds. This is often specified as a Non Functional Requirement (NFR).</p>
<p>But so what? What does this really tell us? More importantly, if the SLA fails, you&#8217;re probably left hanging in the wind trying to explain how &#8220;bad&#8221; it failed to a (now interested) Project Manager. On the flip side, if everything is green, how close were you to failing? Are you an n&#8217;th degree away from failing? What about comparing two different  application&#8217;s response time performance when they have different NFRs to begin with? Getting confused?</p>
<p>Enter the <a href="http://www.apdex.org"><strong>Apdex</strong></a> performance index. Apdex is a numerical measure of user satisfaction that can be built from metrics expressed via more traditional SLAs and/or NFRs. The fundamental objective of Apdex is to simplify the reporting of application response time measurements by making it possible to represent any such measurement using a common metric. This can be reported on by extracting data from Load Runner / JMeter and analysing within Excel as demonstrated below.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/08/excel2007_apdex.png' title='apdex_2007'><img src='http://90kts.com/blog/wp-content/uploads/2008/08/excel2007_apdex.png' alt='apdex_2007' /></a></p>
<p>Read on to find out more about these scores and how they are calculated.<br />
<span id="more-198"></span></p>
<p>The apdex score is a unified measurement between 1.00 &#8211; 0.00, or in plain English, Excellent, Good, Fair, Poor and Unacceptable. This colour chart represents those values:<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/08/apdex.png' title='apdec'><img src='http://90kts.com/blog/wp-content/uploads/2008/08/apdex.png' alt='apdec' /></a></p>
<p>You calculate the apdex index by first counting the total number of samples, the number of samples that have &#8217;satisified&#8217; a criteria (e.g. your SLA of 5 seconds), the number of samples that are &#8216;tolerating&#8217; (e.g. greater than 5 seconds but less than 10 seconds) and the number of samples that have failed (e.g. greater than 10 seconds). You then whack them into a formula as such:</p>
<p><a href='http://90kts.com/blog/wp-content/uploads/2008/08/apdex_calc.png' title='apdex calc'><img src='http://90kts.com/blog/wp-content/uploads/2008/08/apdex_calc.png' alt='apdex calc' /></a></p>
<p>And out pops an index between 0 and 1. Compare it to your colour chart and whammo! You now know how good or bad your application performance (in terms of response time) really is&#8230;</p>
<p><code><rant></code><br />
Apdex really is just a granular traffic light, but it also provides a single scale which traffic lights or SLA red/green status do not. So for example, one app has an NFR of 30 secs and another has one at 5 secs, apdex provides the same unit of measurement for both. So you could possibly trend for improvement/degradation of that index over time if you sampled frequently enough i.e.<br />
app 1 was <em>0.85, 0.84, 0.83, 0.82</em> and app 2 was <em>0.85, 0.80, 0.79, 0.87</em>, is a better unit of comparison than NFR/SLA secs if app1 was <em>30, 31, 32, 34</em>, and app 2 was <em>15, 13, 10, 13</em>. Hard to compare the latter as it is a different scale.</p>
<p>You can also subjectively differentiate with T, so if you see APDEX[subscript T] score of 0.85[30] you know that there is possibly a huge buffer factored into the tolerating score, perhaps reducing the effectiveness of the index. I prefer to set satisfying = NFR, then tolerating to 1.5 x NFR.</p>
<p>Another technique I like to apply is to use the apdex index score in a risk management matrix, so I can use that as a weighting factor i.e traditional risk score / adpex index = revised risk score.<br />
So low apdex scores are duly considered in a <strong>so-what</strong> decision about risk.</p>
<p>Plus in generating an apdex you get information on the count that was satisfied, tolerating, or failing, which audiences such as Project Managers can better understand. People really want to know how <em>badly</em> they failed a NFR/SLA and apdex is user friendly in this regard.<br />
<code></rant></code></p>
<p><strong>So how do you use Apdex with LoadRunner (or JMeter, or Grinder etc)?</strong><br />
Pretty simple actually. Export the response times from your measured transactions into a spreadsheet, then with a little array formula magic, spit out an automated report for inclusion in your test summaries.</p>
<p>I am attaching an example spreadsheet in Excel 2002 format, as this is probably the most common denominator in your work environment. For the ultra snazzy client, I prefer 2007 with its new ability to do multiple COUNTIFS (multiple criteria) and snappy looking traffic lights. You be the judge.<br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/08/apdex_2002.png' title='apdex 2002'><img src='http://90kts.com/blog/wp-content/uploads/2008/08/apdex_2002.png' alt='apdex 2002' width=500/></a><br />
<a href='http://90kts.com/blog/wp-content/uploads/2008/08/apdex.xls' title='apdex excel'>Download: apdex excel spreadsheet template</a><br />
If you&#8217;re feeling generous at the end of all this thinking &#8220;thank God I don&#8217;t have to go through the pain of figuring this out in Excel&#8221; then feel free to:</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="image" src="http://90kts.com/blog/wp-content/themes/90kts/images/x-click-but21.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
<img alt="" border="0" src="https://www.paypal.com/en_AU/i/scr/pixel.gif" width="1" height="1"></p>
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----">
</form>
<p> <img src='http://altentee.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://altentee.com/2008/performance-testing-with-apdex/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
