<?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>Headwired</title>
	<atom:link href="http://www.headwired.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.headwired.com</link>
	<description>Performance Testing Articles and Tutorials</description>
	<lastBuildDate>Sun, 09 Mar 2014 11:29:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.10</generator>
	<item>
		<title>Decrease Indent in LoadRunner</title>
		<link>http://www.headwired.com/tips-and-tricks/decrease-indent-in-loadrunner/</link>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Tue, 08 May 2012 11:29:11 +0000</pubDate>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[LoadRunner]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[VUGen]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=984</guid>

					<description><![CDATA[To increase the indent on a section of code in VUGen, you can simply press the TAB key. This works as expected. To decrease the indent, the SHIFT + TAB keys work as they do in other programs such as MS Word and even VIM. Hopefully everyone already knows this shortcut, though as its not [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>To increase the indent on a section of code in VUGen, you can simply press the TAB key. This works as expected. To decrease the indent, the SHIFT + TAB keys work as they do in other programs such as MS Word and even VIM.<br />
<img loading="lazy" src="/wp-content/uploads/2011/08/loadrunner_vugen_decrease_indent.png" alt="" title="loadrunner_vugen_decrease_indent" width="575" height="535" class="aligncenter size-full wp-image-985" srcset="http://www.headwired.com/wp-content/uploads/2011/08/loadrunner_vugen_decrease_indent.png 575w, http://www.headwired.com/wp-content/uploads/2011/08/loadrunner_vugen_decrease_indent-300x279.png 300w" sizes="(max-width: 575px) 100vw, 575px" /></p>
<p>Hopefully everyone already knows this shortcut, though as its not documented in the menu, some people may have missed it.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Bandwidth Emulation for Mac</title>
		<link>http://www.headwired.com/articles/bandwidth-emulation-for-mac/</link>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Tue, 01 May 2012 09:27:13 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=1095</guid>

					<description><![CDATA[Apple introduced a useful tool with Lion that allows you to test application performance under various network conditions. The Network Link Conditioner (NLC) is primarily designed for testing iOS apps, though it can also be used for testing websites via Safari in the iOS simulator. Once you install XCode on Lion, you will find the [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="/wp-content/uploads/2012/05/Network-Link-Conditioner-580x323.png" alt="Network Link Conditioner" title="Network Link Conditioner" width="580" height="323" class="size-large wp-image-1100" srcset="http://www.headwired.com/wp-content/uploads/2012/05/Network-Link-Conditioner-580x323.png 580w, http://www.headwired.com/wp-content/uploads/2012/05/Network-Link-Conditioner-300x167.png 300w, http://www.headwired.com/wp-content/uploads/2012/05/Network-Link-Conditioner.png 696w" sizes="(max-width: 580px) 100vw, 580px" /><br />
Apple introduced a useful tool with Lion that allows you to test application performance under various network conditions. The Network Link Conditioner (NLC) is primarily designed for testing iOS apps, though it can also be used for testing websites via Safari in the iOS simulator.</p>
<p>Once you install XCode on Lion, you will find the NLC preference pane installer located within /Developer/Applications/Utilities/Network Link Conditioner/. A reboot is required before the NLC daemon will run.</p>
<p>Once you have installed the Network Link Conditioner you can find the NLC icon in the  &#8220;other&#8221; section of the system preferences. Once activated the NLC tool applies to the network interface of your Mac so it will impact ALL traffic on your computer when you turn it on. The nice thing about using NLC is that you can change the bandwidth profile on the fly.</p>
<p>The NLC is a nice addition to OS X and might just come in handy when running performance profiling from Lion.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Stress testing by end users</title>
		<link>http://www.headwired.com/articles/stress-testing-by-end-users/</link>
					<comments>http://www.headwired.com/articles/stress-testing-by-end-users/#comments</comments>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Mon, 23 Apr 2012 11:45:17 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Testing]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=1070</guid>

					<description><![CDATA[Performance testing is an expensive exercise. It takes specialist skills and a significant amount of planning and understanding of the application in order to replicate the hundreds or thousands of users you are expecting. Another option of course is to let your end users do the performance testing for you. Take the announcement from Blizzard [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Performance testing is an expensive exercise. It takes specialist skills and a significant amount of planning and understanding of the application in order to replicate the hundreds or thousands of users you are expecting. Another option of course is to let your end users do the performance testing for you. Take the announcement from Blizzard below for Diablo III.</p>
<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2012/04/Diablo3-580x224.jpg" alt="Diablo3" title="Diablo3" width="580" height="224" class="aligncenter size-large wp-image-1071" srcset="http://www.headwired.com/wp-content/uploads/2012/04/Diablo3-580x224.jpg 580w, http://www.headwired.com/wp-content/uploads/2012/04/Diablo3-300x116.jpg 300w, http://www.headwired.com/wp-content/uploads/2012/04/Diablo3.jpg 620w" sizes="(max-width: 580px) 100vw, 580px" /></p>
<blockquote><p>Beginning this Friday everyone is invited to log in and help us put the game and servers through their paces in this three day stress test as we march toward the game&#8217;s release.</p></blockquote>
<p>It is really viable to get your end users to stress test your application?<br />
<span id="more-1070"></span><br />
I am not sure how viable it truly is, though it appears to be getting more popular of late. One other example is &#8216;Things&#8217;, a popular task manager for the Mac and iOS devices .</p>
<blockquote><p>Since we announced the beta, more than 35,000 people have signed up to become test pilots. Over the past months, we’ve gradually been inviting more and more people. [&#8230;] Some of our users have adopted the beta entirely and created exceptionally large databases. In the coming weeks we are going to work out some kinks and performance bottlenecks related to such large databases.</p></blockquote>
<p>In many ways, this makes a lot of sense. Why spend countless hours simulating your users activities when you can just let them do it themselves. I think this approach works well for companys that have a loyal and enthusiastic fan base. People are so excited to play a Blizzard game, or get access to cloud syncing on a tool that they will suffer through any issues without much complaining.  After all, here is Blizzards answer to that very question.</p>
<blockquote><p><strong>What if the service is down/laggy/disconnecting me?</strong></p>
<p>It&#8217;s very possible that players connecting to the stress test could experience issues with the service. While not ideal, this is exactly why we&#8217;re having a stress test. We want to catch and analyze as many bugs as possible during this stress test period, so that we can try to ensure a smooth launch</p></blockquote>
<p>In reality, there are very few companies with a loyal enough fan base that will put up with a slow or interrupted service just to be one of the first to use a new product or feature. More importantly, there are not many brands that would be happy to risk their image by doing so.</p>
<p>Stress testing by end users it seems is then out of reach for most organisations. This is most likely not helped by the media attention that occurs when it goes wrong, like when the Australian Government launched the <a href="http://www.myschool.edu.au/" title="My School">MySchool</a> website and it was <a href="http://www.computerworld.com.au/article/334214/my_school_site_crashes_one_hour_after_launch/">brought down an hour after the launch</a>.</p>
<p>Inevitably, it all comes down to risk. What are the risks of the site not being able to handle the load generated by our users? What is the impact if it is the public that finds the breaking point? Finally, how will they react when they find the breaking point?</p>
<p>I am yet to come across a project where it&#8217;s acceptable to let the public stress test the application like Blizzard, though maybe I just haven&#8217;t worked for a company as fun as Blizzard yet.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.headwired.com/articles/stress-testing-by-end-users/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Visual Representation of Process</title>
		<link>http://www.headwired.com/articles/visual-representation-of-process/</link>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Wed, 08 Feb 2012 09:17:55 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=912</guid>

					<description><![CDATA[In most organisations, you will find that while they have a process, nobody seems to know it exactly, or even where to go to find it. The problem, it seems is with the way in which processes are documented. Process documents are usually lamented over at the time of their writing, then shelved without much [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/05/svt_visual_process.png" alt="performance testing visual process" title="performance testing visual process" width="580" height="238" class="aligncenter size-full wp-image-915" srcset="http://www.headwired.com/wp-content/uploads/2011/05/svt_visual_process.png 580w, http://www.headwired.com/wp-content/uploads/2011/05/svt_visual_process-300x123.png 300w" sizes="(max-width: 580px) 100vw, 580px" /></p>
<p>In most organisations, you will find that while they have a process, nobody seems to know it exactly, or even where to go to find it. The problem, it seems is with the way in which processes are documented.  Process documents are usually lamented over at the time of their writing, then shelved without much thought at all. The reason for this I believe is that there is primarily only two times when a process document is actually referenced:</p>
<ol>
<li>When a new employee joins the team, and is shown how things are done</li>
<li>When a higher manager asks &#8220;how does your team operate&#8221;</li>
</ol>
<p>In my mind, I would much prefer a simpler process flow that is actually used by staff, even if it doesn&#8217;t cover every possible eventuality along the way. The visual process document provides the most effective way of presenting the flow of how we go about completing our tasks. Its typically printable on one page (though it might have to be A3), it&#8217;s pinnable to your office cubicle, and sometimes as importantly, can be pasted into powerpoint presentations for the business.</p>
<p>So how do you present your testing process?</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>An Alternative to System Info Wallpaper</title>
		<link>http://www.headwired.com/tips-and-tricks/an-alternative-to-system-info-wallpaper/</link>
					<comments>http://www.headwired.com/tips-and-tricks/an-alternative-to-system-info-wallpaper/#comments</comments>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Wed, 21 Dec 2011 05:04:33 +0000</pubDate>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Toolbox]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=1054</guid>

					<description><![CDATA[I have setup many machines to control and generate load. My initial experiences was with LINUX based systems, then as the tools progressed, the operating systems regressed onto the Windows platform. It seemed that back in the days of KVM&#8217;s, setting a new background colour for each machine was the way to tell them apart. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/12/rainmeter.png" alt="Rainmeter" title="rainmeter" width="580" height="250" class="aligncenter size-full wp-image-1055" srcset="http://www.headwired.com/wp-content/uploads/2011/12/rainmeter.png 580w, http://www.headwired.com/wp-content/uploads/2011/12/rainmeter-300x129.png 300w" sizes="(max-width: 580px) 100vw, 580px" />I have setup many machines to control and generate load. My initial experiences was with LINUX based systems, then as the tools progressed, the operating systems regressed onto the Windows platform. It seemed that back in the days of KVM&#8217;s, setting a new background colour for each machine was the way to tell them apart. Next came the system information imprinted on a wallpaper with tools like <a href="http://technet.microsoft.com/en-gb/sysinternals/bb897557">BgInfo</a> from SysInternals. Unfortunately for this approach, a majority of RDP clients are setup to remove wallpapers (and should be if they aren&#8217;t). So in 2011 do we have a better way of displaying machine information on the desktop?<br />
<span id="more-1054"></span><br />
Enter <a href="http://www.rainmeter.net/">Rainmeter</a>. Anyone who reads Lifehacker and seen their <a href="http://lifehacker.com/featured-home-screen/">Featured Home Screen</a> section would be very familiar with what this tool can do. Best of all, for my purpose at least, is that Rainmeter shows up over RDP even when the wallpapers are turned off. My initial intention was to simply display the system name and possibly the IP address, though after playing with the tool, I was able to quickly create something that would be a little more useful. Using the Welcome example from the default illustro skin, I was able to provide a brief summary of the current system metrics as well as some short-cut links to my tools and directories, and given how hard is it to find anything in Windows Server 2008, this is a good thing. This also gets rid of creating stupid bitmap wallpapers on each machine.</p>
<p>While I might have gone a little bit overboard with this one, keep Rainmeter in mind if you are trying to display the system information without having to worry if your users have wallpapers turned on or off.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.headwired.com/tips-and-tricks/an-alternative-to-system-info-wallpaper/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Building a realistic load profile with Analytics</title>
		<link>http://www.headwired.com/articles/building-a-realistic-load-profile-with-analytics/</link>
					<comments>http://www.headwired.com/articles/building-a-realistic-load-profile-with-analytics/#comments</comments>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Mon, 12 Dec 2011 23:13:30 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Google]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=1004</guid>

					<description><![CDATA[One of the most important parts of a successful Performance Test is getting the requirements right. No matter what tool you use or how well you script, your test won&#8217;t succeed if you are not accurately simulating end-user activity on the application. Traditionally, the user volume has been a mix of current load levels from [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/12/google-analytics-real-time.png" alt="Google Analytics Real Time" title="google-analytics-real-time" width="580" height="312" class="aligncenter size-full wp-image-1005" srcset="http://www.headwired.com/wp-content/uploads/2011/12/google-analytics-real-time.png 580w, http://www.headwired.com/wp-content/uploads/2011/12/google-analytics-real-time-300x161.png 300w" sizes="(max-width: 580px) 100vw, 580px" /><br />
One of the most important parts of a successful Performance Test is getting the requirements right. No matter what tool you use or how well you script, your test won&#8217;t succeed if you are not accurately simulating end-user activity on the application. Traditionally, the user volume has been a mix of current load levels from log files and projected load from the business. More recently, analytics have been so easily implementable that every site these days, even small blogs, have analytics information. </p>
<p>So how can we use Analytics to help build a realistic load profile for performance testing?<br />
<span id="more-1004"></span><br />
A <a href="http://loadstorm.com/2011/using-web-analytics-modeling-application-usage-performance-tests">post</a> by Suraj Sundarrajan (<a href="http://twitter.com/perfengineering" title="@perfengineering">@perfengineering</a>) highlighted some of the current uses of GA in modelling user behaviour for performance testing. These include the calculation of user idle time, 3rd party web components like Flash, Silverlight &#038; AJAX and a current area of interest for me, cache.</p>
<blockquote><p>  Industry reports suggest that ‘Cached pages’ can account for up to one-third of all page views. Due to its obvious performance benefits, browser caching mechanism is being extensively used by application developers. Web server logs do not (and will not be able to) capture user activity metrics for cached pages as no request is made to the Web server. On the contrary, Web Analytics tools track visits to cached pages (as they track usage from users’ browser) and thus provide a more accurate picture of “browser caching” on the web application. Performance testers can use this information to determine what percentage of total application usage is being cached and emulate this browser behavior in the load test scenario. &#8211; Suraj Sundarrajan</p></blockquote>
<p>Suraj does a great job of describing some of the elements of Analytics that will help performance testers build a realistic load profile. Though I hear you saying &#8220;Analytics? So what, Google Analytics have been publicly available since 2006, and there were many options before then&#8221;. This is exactly where I was headed. Though I am impressed with the new features of GA, one of the most valuable additions isn&#8217;t actually a feature at all. It&#8217;s the fact that they have been around so long, and that we now have enough history to start to evaluate trends. Combining this data with projected business usage provides another invaluable source of information to help ensure a successful performance test.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.headwired.com/articles/building-a-realistic-load-profile-with-analytics/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Using mldap_modify &#038; mldap_delete functions in LoadRunner</title>
		<link>http://www.headwired.com/tutorials/using-mldap_modify-mldap_delete-functions-in-loadrunner/</link>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Tue, 20 Sep 2011 02:43:06 +0000</pubDate>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[LDAP]]></category>
		<category><![CDATA[LoadRunner]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=988</guid>

					<description><![CDATA[I have written before about using the LDAP protocol using LoadRunner. This time, I had a requirement to reset the passwords for all my test users before an execution. Luckily for me, there was already some shell scripts setup that utilised ldapmodify, so it was just a matter of converting them over to LoadRunner scripts. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/09/deleted.png" alt="Deleted" title="deleted" width="580" height="202" class="aligncenter size-full wp-image-1032" srcset="http://www.headwired.com/wp-content/uploads/2011/09/deleted.png 580w, http://www.headwired.com/wp-content/uploads/2011/09/deleted-300x104.png 300w" sizes="(max-width: 580px) 100vw, 580px" /><br />
I have written before about using the LDAP protocol using LoadRunner. This time, I had a requirement to reset the passwords for all my test users before an execution.  Luckily for me, there was already some shell scripts setup that utilised ldapmodify, so it was just a matter of converting them over to LoadRunner scripts.<br />
<span id="more-988"></span><br />
After binding to the LDAP server, the first command was to delete the users password history to get around the password policy. The batch file called the ldapmodify function like below</p>
<pre lang="c">
ldapmodify -h ldap.headwired.com -p 389 -D 'cn=Directory Manager' -w PASSWORD <<EOF

dn: uid=$USERNAME,ou=people,dc=headwired,dc=com
changetype: modify
delete: passwordHistory

EOF
</pre>
<p>As the action is actually a delete, this translates to the mldap_delete function in LoadRunner.</p>
<pre lang="c">
// Clear Password History
mldap_delete("LDAP Delete", 
      "DN=uid={USERNAME},ou=people,dc=headwired,dc=com ", 
      "AttrName=passwordHistory", 
      LAST );
</pre>
<p>The next step was reseting the actual password, and here is the script again. Note that as the script must authenticate every time it calls ldapmodify. </p>
<pre lang="c">
ldapmodify -h ldap.headwired.com -p 389 -D 'cn=Directory Manager' -w PASSWORD <<EOF

dn: uid=$USERNAME,ou=people,dc=headwired,dc=com
changetype: modify
replace: userpassword
userpassword: $PASSWORD

EOF
</pre>
<p>This time, we will use the mldap_modify function to change the userpassword value</p>
<pre lang="c">
// Update Password
mldap_modify("LDAP Modify", 
      "DN=uid={USERNAME},ou=people,dc=headwired,dc=com", 
      "AttrName=userpassword",   // Name of attribute 
      "AttrValue={PASSWORD}",    	// New Value 
      LAST );
</pre>
<p>While the task to be performed here is very trivial, it’s a simple demonstration of the mldap_modify and mldap_delete functions. The full script is below.</p>
<pre lang="c" line="1">
Action()
{
  // LDAP Bind
  mldap_logon("TRANSACTION_NAME",
        "URL=ldap://cn=Directory Manager:PASSWORD@ldap.headwired.com:389/ ",
        "Version=3",
        "Mode=Async",
        LAST);

  // Clear Password History
  mldap_delete("LDAP Delete", 
        "DN=uid={USERNAME},ou=people,dc=headwired,dc=com ", 
        "AttrName=passwordHistory", 
        LAST );

  // Update Password
  mldap_modify("LDAP Modify", 
        "DN=uid={USERNAME},ou=people,dc=headwired,dc=com", 
        "AttrName=userpassword",   // Name of attribute 
        "AttrValue={PASSWORD}",    	// New Value 
        LAST );

  return 0;
}
</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Performance Testing SOAP with LoadRunner &#8211; Basics</title>
		<link>http://www.headwired.com/tutorials/performance-testing-soap-with-loadrunner-basics/</link>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Wed, 10 Aug 2011 06:28:58 +0000</pubDate>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[LoadRunner]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Services]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=10</guid>

					<description><![CDATA[Web services are more commonly becoming the targets of Performance tests. This post aims to provide an introduction to testing SOAP with LoadRunner without using the Web Services VUser type. Why not use the Web Services Vuser? Errors like this System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---&#62; System.Xml.XmlException: 'xsi' is [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/08/soap.jpg" alt="Simple Object Access Protocol (SOAP)" title="soap" width="580" height="250" class="aligncenter size-full wp-image-1035" srcset="http://www.headwired.com/wp-content/uploads/2011/08/soap.jpg 580w, http://www.headwired.com/wp-content/uploads/2011/08/soap-300x129.jpg 300w" sizes="(max-width: 580px) 100vw, 580px" />Web services are more commonly becoming the targets of Performance tests. This post aims to provide an introduction to testing SOAP with LoadRunner without using the Web Services VUser type. Why not use the Web Services Vuser? Errors like this</p>
<pre lang="c">System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---&gt; System.Xml.XmlException: 'xsi' is an undeclared namespace.
</pre>
<p>Using the custom web request (as suggested by <a href="http://www.wilsonmar.com/1lrscript.htm#WebSvcs">Wilson Mar</a>, <a href="http://www.myloadtest.com/web-service-testing-with-standard-web-vuser/">Stuart Moncrieff</a> and many others) bypasses the XML validation steps of LoadRunner, which is a good thing. This is possible because SOAP is just XML over HTTP, so lets take a look.<br />
<span id="more-10"></span></p>
<h1>Understanding SOAP</h1>
<p>A typical SOAP message is made up of header and body encapsulated in a SOAP envelope. The SOAP header contains application-specific information (like authentication, payment, etc) about the SOAP message. The header is optional, yet if present, must be the first child element of the Envelope. The SOAP body element contains the actual message.<br />
<a href="http://en.wikipedia.org/wiki/File:SOAP.svg"><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/04/200px-SOAP.svg_.png" alt="SOAP Envelope" title="SOAP Envelope" width="200" height="213" class="aligncenter size-full wp-image-834" /></a>As SOAP uses HTTP as an application protocol, it utilises a request / response model. A SOAP request is sent to the endpoint via a HTTP POST and the returned SOAP message uses the same response codes for HTTP (200 OK, etc).  This request is to get the stock price for the ticker symbol HWB (Headwired Bank), with the response returning a price of $460.75 as the last traded price.</p>
<h3>SOAP Request</h3>
<pre lang="xml">POST /StockQuote HTTP/1.1
Host: headwired.com
Content-Type: text/xml; charset="utf-8"
Content-Length: 1452

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <m:GetLastTradePrice xmlns:m="headwired.com">
            <m:tickerSymbol>HWB</m:tickerSymbol>
        </m:GetLastTradePrice>
    </soapenv:Body>
</soapenv:Envelope>
</pre>
<h3>SOAP Response</h3>
<pre lang="xml">HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: 1298

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <m:GetLastTradePriceResponse xmlns:m="Some-URI">
            <m:price>460.75</m:price>
        </m:GetLastTradePriceResponse>
    </soapenv:Body>
</soapenv:Envelope>
</pre>
<h2>SOAP as a Web Service</h2>
<p>As a Web Service, the structure of all supported SOAP requests and responses are provided in a WSDL (Web Service Definitions Language). A WSDL provides the following information:</p>
<ul>
<li> The interactions service provided</li>
<li> The arguments and results are involved in the interactions</li>
<li> The network addresses are used to locate the service</li>
<li> The communication protocol that should be used</li>
<li> The data formats that messages are represented in</li>
</ul>
<p>In our example SOAP web have a structure for our request in the SOAP body. We have a <em>GetLastTradePrice</em> tag, with a child tickerSymbol . How can we determine that this is what we need to submit by looking at the WSDL? The following WSDL definition declares what elements should be in GetLastTradePrice input request.</p>
<pre lang="xml">
<message name="GetLastTradePriceInput">
  <part name="body" element="xsd1:TradePriceRequest"/>
</message>
</pre>
<p>This specifies that our input should contain the “ TradePriceRequest” element which is also defined in the WSDL. The definition is for one element “tickerSymbol” that must be a string value.</p>
<pre lang="xml">
<element name="TradePriceRequest">
  <complexType>
    <all>
      <element name="tickerSymbol" type="string"/>
    </all>
  </complexType>
</element>
</pre>
<p>The WSDL will also specify the response that we should expect from this request.</p>
<pre lang="xml">
<message name="GetLastTradePriceOutput">
  <part name="body" element="xsd1:TradePrice"/>
</message>
</pre>
<p>This specifies that our input should contain the “TradePrice” element which is also defined in the WSDL. The definition is for one element “price” that will contain a float value.</p>
<pre lang="xml">
<element name="TradePrice">
  <complexType>
    <all>
      <element name="price" type="float"/>
    </all>
  </complexType>
</element>
</pre>
<p>The WSDL below is a rough example of the stock service that would be used by the example SOAP.</p>
<pre lang="xml">
<?xml version="1.0"?>
<definitions name="Stock" targetNamespace="http://headwired.com/stock.wsdl"
       xmlns:tns="http://headwired.com/stock.wsdl"
       xmlns:xsd1="http://headwired.com/stock.xsd"
       xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
       xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <schema targetNamespace="http://headwired.com/stock.xsd"
            xmlns="http://www.w3.org/2000/10/XMLSchema">
      <element name="TradePriceRequest">
        <complexType>
          <all><element name="tickerSymbol" type="string"/></all>
        </complexType>
      </element>
      <element name="TradePrice">
        <complexType>
          <all><element name="price" type="float"/></all>
        </complexType>
      </element>
    </schema>
  </types>
  <message name="GetLastTradePriceInput">
    <part name="body" element="xsd1:TradePriceRequest"/>
  </message>
  <message name="GetLastTradePriceOutput">
    <part name="body" element="xsd1:TradePrice"/>
  </message>
  <portType name="StockPortType">
    <operation name="GetLastTradePrice">
      <input message="tns:GetLastTradePriceInput"/>
      <output message="tns:GetLastTradePriceOutput"/>
    </operation>
  </portType>
  <binding name="StockSoapBinding" type="tns:StockPortType">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="GetLastTradePrice">
           <soap:operation soapAction="http://headwired.com/GetLastTradePrice"/>
           <input><soap:body use="literal"/></input>
           <output><soap:body use="literal"/></output>
        </operation>
    </binding>
    <service name="StockService">
        <documentation>My first service</documentation>
        <port name="StockPort" binding="tns:StockBinding">
           <soap:address location="http://headwired.com/stock"/>
        </port>
    </service>
</definitions>
</pre>
<h1>SOAP With LoadRunner Custom Requests</h1>
<p>SOAP in its most basic form is XML + HTTP. Therefore, we can use the LoadRunner web_custom_request function to manually specify our SOAP message. This method is more verbose than a web_service_call script, yet as it is a web request, there is no XML parsing performed by LoadRunner. This can be very useful if your web_service_call scripts are returning errors.</p>
<p>Scripting a web service is different a web page. Firstly, unless you have a client application, you will not be able to record and replay, instead you will have to recreate the web service calls based on logs, interface specification documents or a WSDL. It is also important to understand how the operations of the web service will be used in production.</p>
<h2>Setup</h2>
<p>This section discusses the steps to setup your LoadRunner script to commence scripting.</p>
<h3>Script Type</h3>
<p>A web_custom_request script for SOAP should be created as a “Web (HTTP/HTML)” script. This allows for Internet Protocol Run Time settings to be configured for handling authentication in a more effective way (read:  web_set_sockets_option).</p>
<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/04/web_http_script.png" alt="Web HTTP Script in LoadRunner" title="web_http_script" width="277" height="106" class="aligncenter size-full wp-image-843" /></p>
<h2>Authentication</h2>
<p>The web service you are using may require HTTP level Authentication in order to access the web service operations. This can be performed using a simple web_set_user  command in LoadRunner.  To avoid a Authentication Error on your first request, the web_set_sockets_option can be configured along with the &#8220;Enable Integrated Authentication&#8221; run-time setting to avoid this issue.</p>
<pre lang="c">// Requires "Enable Integrated Authentication" to be set to "yes"
web_set_sockets_option("INITIAL_BASIC_AUTH","1");
// Authenticate
web_set_user("USERNAME","PASSWORD","www.headwired.com:443");
</pre>
<p>To enable integrated authentication, open “Run-time Settings &gt; Internet Protocol &gt; Preferences &gt; Set Advanced Options” and select yes for “Enable Integrated Authentication”. More information about authentication can be found <a href="http://altentee.com/2009/improved-spnego-or-kerberos-support-with-loadrunner/">here</a>.</p>
<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/04/enable_integrated_authentication.png" alt="Enable Integrated Authentication in LoadRunner" title="enable_integrated_authentication" width="470" height="492" class="aligncenter size-full wp-image-844" srcset="http://www.headwired.com/wp-content/uploads/2011/04/enable_integrated_authentication.png 470w, http://www.headwired.com/wp-content/uploads/2011/04/enable_integrated_authentication-286x300.png 286w" sizes="(max-width: 470px) 100vw, 470px" /></p>
<p>There may also be the requirement to login using multiple authentication pairs throughout the test. This is possible through the use of the web_cleanup_cookies function. This function will remove all cookies related to the VUser, including NTLM authentication cookies.</p>
<pre lang="c">// Clear previous logins
web_cleanup_cookies();
</pre>
<h1>Scripting</h1>
<h2>Making the Request</h2>
<p>In order to use the web_custom_request function for SOAP, we must specify that we will be submitting text/xml. The web_add_header function is used to specify this.</p>
<pre lang="c">// Set Headers to plain text / xml
web_add_header("Content-Type", "text/xml; charset=utf8"); 
</pre>
<p>The web_custom_request is pretty straightforward. You specify your URL, Method and Body of the request. The SOAP message, including XML specification and Envelope is placed in the Body section of the request.</p>
<pre lang="c">web_custom_request("Transaction_Name", 
	"URL=https://www.headwired.com/StockQuote", 
	"Method=POST", "TargetFrame=", "Resource=0", "Referer=", 
	"Body=<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" 
	<SOAP Envelope Here>
	"Snapshot=t1.inf",
	LAST); 
</pre>
<h2>Verifying the Response</h2>
<p>The simplest way to verify the response of a SOAP request is to use the web_reg_find function. This allows the specification of text that must be matched within the response text.</p>
<pre lang="c">// Ensure the response contains correct text
web_reg_find("Text=GetLastTradePriceResponse",LAST);
</pre>
<p>To extract data from the response and save it as a parameter, you may also use the web_reg_save_param function.  In the example below, the entire XML response, including HTTP headers is saved in the “response” variable.</p>
<pre lang="c">// Save entire response as a string
web_reg_save_param("response","LB=","RB=",LAST);
</pre>
<h1>Debugging Tips</h1>
<p>Perhaps the easiest way to debug a web services script that utilises the web_custom_request function is to enable “Visual test results”. This feature can be enabled via the VuGen General Options, Replay Tab</p>
<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/04/virual_test_results.png" alt="Visual Test Results" title="virual_test_results" width="373" height="258" class="aligncenter size-full wp-image-845" srcset="http://www.headwired.com/wp-content/uploads/2011/04/virual_test_results.png 373w, http://www.headwired.com/wp-content/uploads/2011/04/virual_test_results-300x207.png 300w" sizes="(max-width: 373px) 100vw, 373px" /></p>
<p>The visual test results will display a report after replaying a script and provide you a script tree view, and allow you to view the XML response from the SOAP server.</p>
<h1>Example Script</h1>
<p>The following is a LoadRunner script that will send our sample SOAP request to the server. It will ensure that the response contains the term “GetLastTradePriceResponse”. As SOAP uses HTTP, any HTTP level errors (401, 500) will also automatically be failed by LoadRunner.</p>
<pre lang="c" line="1">// Ensure the response contains correct text
web_reg_find("Text=GetLastTradePriceResponse",LAST);

// Set Headers to plain text / xml
web_add_header("Content-Type", "text/xml; charset=ISO-8859-1"); 

// Submit SOAP Request
lr_start_transaction("SOAP_GetLastTradePrice");
web_custom_request("SOAP_GetLastTradePrice", 
	"URL=http://www.headwired.com/stock", 
	"Method=POST", "TargetFrame=", "Resource=0", "Referer=", 
	"Body=<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" 
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
  "<soapenv:Body>"
    "<m:GetLastTradePrice xmlns:m=\"Some-URI\">"
      "<m:tickerSymbol>HWB</m:tickerSymbol>"
    "</m:GetLastTradePrice>"
  "</soapenv:Body>"
"</soapenv:Envelope>"
	"Snapshot=t1.inf",
	LAST); 
lr_end_transaction("SOAP_GetLastTradePrice", LR_AUTO);

</pre>
<div class="references">
<h1>Links and References</h1>
<p><a href="http://www.w3schools.com/soap/">W3Schools SOAP Tutorial</a><br />
<a href="http://www.w3.org/TR/wsdl">WSDL Authentication</a><br />
<a href="http://90kts.com/blog/2009/improved-spnego-or-kerberos-support-with-loadrunner/">Authentication</a></p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Quick Tip &#8211; LoadRunner Download Filters and Proxy Servers</title>
		<link>http://www.headwired.com/tips-and-tricks/quick-tip-loadrunner-download-filters-and-proxy-servers/</link>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Tue, 24 May 2011 11:40:20 +0000</pubDate>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[LoadRunner]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[VUGen]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=890</guid>

					<description><![CDATA[A previously mentioned the move from a download filters black list to a white list to avoid hitting servers outside of our testing scope. One interesting outcome of this change was a nasty C compile error. Error: C interpreter run time error: Action.c (39): Error -- memory violation : Exception ACCESS_VIOLATION received. As it turns [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>A <a href="http://www.headwired.com/2011/loadrunner-and-iframes/">previously mentioned</a> the move from a download filters black list to a white list to avoid hitting servers outside of our testing scope.</p>
<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/05/download_filters-580x432.png" alt="LoadRunner Download Filters" title="LoadRunner Download Filters" width="580" height="432" class="aligncenter size-large wp-image-900" srcset="http://www.headwired.com/wp-content/uploads/2011/05/download_filters-580x432.png 580w, http://www.headwired.com/wp-content/uploads/2011/05/download_filters-300x223.png 300w, http://www.headwired.com/wp-content/uploads/2011/05/download_filters.png 717w" sizes="(max-width: 580px) 100vw, 580px" /></p>
<p>One interesting outcome of this change was a nasty C compile error.</p>
<pre lang="c">
Error: C interpreter run time error: Action.c (39):  Error -- memory violation : Exception ACCESS_VIOLATION received.
</pre>
<p>As it turns out, as we were using a <a href="http://en.wikipedia.org/wiki/Proxy_auto-config">proxy auto-config (PAC)</a> file and this error occurs if your download filters are set to block your pac files. Luckily, LoadRunner does report that the PAC file was &#8220;Not downloaded due to a filter&#8221;, yet on the very next line reports that it was &#8220;downloaded and evaluated successfully&#8221;</p>
<pre lang="c">
Starting to download the proxy automatic configuration script, URL="http://www.headwired.com/proxy.pac"  	[MsgId: MMSG-27097]
Warning -26554: Not downloaded due to a filter, URL="http://www.headwired.com/proxy.pac"  	[MsgId: MWAR-26554]
Proxy automatic configuration script (URL="http://www.headwired.com/proxy.pac") downloaded and evaluated successfully  	[MsgId: MMSG-27096]
</pre>
<p>Surely if iframes are considered a critical resource, then the PAC file should cause an error and not just a warning, especially when it causes such a poorly handled memory violation error.</p>
<p>Luckily adding the pac file location to your download filters include list fixes this problem.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LoadRunner and iframes</title>
		<link>http://www.headwired.com/articles/loadrunner-and-iframes/</link>
					<comments>http://www.headwired.com/articles/loadrunner-and-iframes/#comments</comments>
		
		<dc:creator><![CDATA[Joel Deutscher]]></dc:creator>
		<pubDate>Tue, 24 May 2011 09:56:11 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[LoadRunner]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[VUGen]]></category>
		<guid isPermaLink="false">http://www.headwired.com/?p=884</guid>

					<description><![CDATA[After a recent application update, I noticed that all of our scripts started to fail. It turns out that the AUT now included a piece of tracking code, and our load generators did not resolve the domain name. The error message that came up was: Error -26627: HTTP Status-Code=404 (Not Found) for "http://tracking.headwired.com/track.asp" [MsgId: MERR-26627] [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>After a recent application update, I noticed that all of our scripts started to fail. It turns out that the AUT now included a piece of tracking code, and our load generators did not resolve the domain name. The error message that came up was:</p>
<pre lang="c">
Error -26627: HTTP Status-Code=404 (Not Found) for "http://tracking.headwired.com/track.asp"  	[MsgId: MERR-26627]
</pre>
<p>So why would a 404 cause an error and not just a warning? Turns out that iframes are treated as a critical resource. By default, images, scripts, css are all treated as non-critical resources resulting in a warning only, however iframes are considered to be critical and hence cause an error. It makes sense for iframes to be a critical resource&#8230; in 1999 when the virtual mall was a good idea, yet in 2011, iframes are used for tracking services only. Rants aside, I could find the option to treat images, scripts and css as critical (pictured below), however I could not find the option to treat iframes as non-critical.</p>
<p><img loading="lazy" src="http://www.headwired.com/wp-content/uploads/2011/05/non-critical-580x432.png" alt="non-critical resource errors as warnings" title="non-critical resource errors as warnings" width="580" height="432" class="aligncenter size-large wp-image-894" srcset="http://www.headwired.com/wp-content/uploads/2011/05/non-critical-580x432.png 580w, http://www.headwired.com/wp-content/uploads/2011/05/non-critical-300x223.png 300w, http://www.headwired.com/wp-content/uploads/2011/05/non-critical.png 717w" sizes="(max-width: 580px) 100vw, 580px" /></p>
<p>By turning this option off, all 404&#8217;ed resources are treated as errors as well, as you can see in the following output log</p>
<pre lang="c">
Found resource "http://localhost/notfound.css" in HTML "http://localhost/iframe.html"  	[MsgId: MMSG-26659]
Found resource "http://localhost/notfound.js" in HTML "http://localhost/iframe.html"  	[MsgId: MMSG-26659]
Found resource "http://localhost/notfound.png" in HTML "http://localhost/iframe.html"  	[MsgId: MMSG-26659]
Detected non-resource "http://localhost/notfound-iframe.html" in "http://localhost/iframe.html"  	[MsgId: MMSG-26574]
Found resource "http://localhost/notfound-object.html" in HTML "http://localhost/iframe.html"  	[MsgId: MMSG-26659]
Error -26627: HTTP Status-Code=404 (Not Found) for "http://localhost/notfound.js"  	[MsgId: MERR-26627]
Error -26627: HTTP Status-Code=404 (Not Found) for "http://localhost/notfound.css"  	[MsgId: MERR-26627]
Error -26627: HTTP Status-Code=404 (Not Found) for "http://localhost/notfound.png"  	[MsgId: MERR-26627]
Error -26627: HTTP Status-Code=404 (Not Found) for "http://localhost/notfound-iframe.html"  	[MsgId: MERR-26627]
Error -26627: HTTP Status-Code=404 (Not Found) for "http://localhost/notfound-object.html"  	[MsgId: MERR-26627]
web_url("web_url") highest severity level was "ERROR", 1627 body bytes, 1438 header bytes  	[MsgId: MMSG-26388]
</pre>
<p>So back to the problem, a new domain that I needed to block had surfaced and if the domain name resolved, then it would have been included in the tests without my knowledge. While there are two schools of thought here, in the particular testing that I was doing, the customer did not want their tracking sites being hit from the performance tests, it was time to change approach and move to the include only list.</p>
<p>Why was this important? Well now I don&#8217;t have to catch every new tracking feature in order to block it, and my ever expanding list of blocked hostnames was now a thing of the past and everything was coming up Milhouse.</p>
<p>My test HTML page is as follows for anyone who is interested.</p>
<pre lang="html">
<html>
  <head>
	<link rel="shortcut icon" href="notfound.ico" />
	<link rel="stylesheet" href="notfound.css" type="text/css" media="all" />
	<script src="notfound.js" type="text/javascript"></script>
  </head>
  <body>
	<h1>Testing IFRAME</h1>
	<img src="notfound.png" />
	<!-- iframe -->
	<iframe loading="lazy" src="notfound-iframe.html" width="100%" height="300">
	  <p>Your browser does not support iframes.</p>
	</iframe>
	<!-- object -->
	<object data="notfound-object.html" type="text/html" width="300" height="200">
	</object>
  </body>
</html>
</pre>
]]></content:encoded>
					
					<wfw:commentRss>http://www.headwired.com/articles/loadrunner-and-iframes/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
