<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-10748614</id><updated>2013-05-17T04:51:16.862-04:00</updated><category term="High CPU usage" /><category term="#31DaysOfTesting" /><category term="Hardware interrupts" /><title type="text">FrazzledDad</title><subtitle type="html">Bleary-eyed ruminations of a work at home Father.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://frazzleddad.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>1146</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Frazzleddad" /><feedburner:info uri="frazzleddad" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Frazzleddad</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><entry><id>tag:blogger.com,1999:blog-10748614.post-1811605677414959294</id><published>2013-05-15T09:59:00.001-04:00</published><updated>2013-05-15T09:59:52.302-04:00</updated><title type="text">Sample Code &amp; Slides from StarEast 2013 Talk</title><content type="html">&lt;p&gt;I gave a talk on Four Tips for Web Automation at StarEast 2013 this April. I’ve posted up my slides on SpeakerDeck&lt;/p&gt; &lt;script async class="speakerdeck-embed" data-id="60b688209eef0130bd1756e82fbf4652" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;  &lt;p&gt;You can also find the demo code at &lt;a href="https://github.com/jimholmes/SE13"&gt;my GitHub repository&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I’ll be doing a similar talk at StirTrek this Friday!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/cxBXTtNu8Qo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/1811605677414959294/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=1811605677414959294" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1811605677414959294" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1811605677414959294" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/cxBXTtNu8Qo/sample-code-slides-from-stareast-2013.html" title="Sample Code &amp;amp; Slides from StarEast 2013 Talk" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/05/sample-code-slides-from-stareast-2013.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-4988195736593031001</id><published>2013-04-17T13:59:00.001-04:00</published><updated>2013-04-17T13:59:15.943-04:00</updated><title type="text">Slides From Quest 2013 Posted</title><content type="html">&lt;p&gt;Thanks to the folks who attended my talk at Quest 2013! I appreciated the interaction, and I hope you found the talk useful.&lt;/p&gt;  &lt;p&gt;You can find my slides, and the mind map, &lt;a href="https://speakerdeck.com/jimholmes/that-sounds-great-in-theory-but-dot-dot-dot"&gt;here on SpeakerDeck&lt;/a&gt;.&lt;/p&gt; &lt;script async class="speakerdeck-embed" data-id="82d28bc089b001303f1412313d091487" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/YDyuG5Ld2RQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/4988195736593031001/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=4988195736593031001" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/4988195736593031001" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/4988195736593031001" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/YDyuG5Ld2RQ/slides-from-quest-2013-posted.html" title="Slides From Quest 2013 Posted" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/04/slides-from-quest-2013-posted.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-5080307153800208827</id><published>2013-04-01T11:23:00.001-04:00</published><updated>2013-04-01T11:23:22.043-04:00</updated><title type="text">Exciting News: I’m Now an MVP for ALM!</title><content type="html">&lt;p&gt;I just got news today that Microsoft has changed my Most Valuable Professional award from C# to Application Lifecycle Management (ALM). This is great news for me because this is much more in my wheelhouse both technically and passion-wise. Moving to ALM means I’ll be much more inline with things I work on regularly and care intensely about: testing, process, and making teams awesome.&lt;/p&gt;  &lt;p&gt;I’m also very excited because I get to hang out with a bunch of awesome ALM geniuses like Esteban Garcia, Ryan Cromwell, and others. This is going to be awesome!&lt;/p&gt;  &lt;p&gt;Oh, you thought my last post meant I wasn’t an MVP at all anymore? Oh, terribly sorry for that, but I figure there had to be &lt;em&gt;something&lt;/em&gt; evil I could do on April Fool’s Day…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/_aGOtLNdD74" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/5080307153800208827/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=5080307153800208827" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/5080307153800208827" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/5080307153800208827" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/_aGOtLNdD74/exciting-news-im-now-mvp-for-alm.html" title="Exciting News: I’m Now an MVP for ALM!" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/04/exciting-news-im-now-mvp-for-alm.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-2237582292917998423</id><published>2013-04-01T11:03:00.001-04:00</published><updated>2013-04-01T11:03:48.951-04:00</updated><title type="text">I’m No Longer a Microsoft MVP for C#</title><content type="html">&lt;p&gt;Yes, I realize it’s April Fools Day; however, this isn’t a joke. After a wonderful string of years, I got notification from Microsoft that I’m no longer an MVP for Visual C#. Frankly, I’d figured this was coming some time ago and I’m surprised it took this long.&lt;/p&gt;  &lt;p&gt;Why? Because I don’t code for a living, and I don’t focus on C#. I don’t know anything about C# 4.0, contravariance, or covariance. Ask me to write a lambda, or explain how it differs from a delegate, and you’ll likely see my head explode or me head for the nearest bottle of scotch. I was put into the C# category in 2005 because they didn’t have a better spot to put me for all the community work that I was being recognized for, and it’s always been awkward for me.&lt;/p&gt;  &lt;p&gt;My award wasn’t so much due to specific things I’ve done as it was due to all the awesome folks in the community, and I want to make sure to thank all the wonderful people who made the last seven or eight years great. Well, I can’t thank all y’all by name, but I hope you get the idea…&lt;/p&gt;  &lt;p&gt;My time as a C# MVP has been awesome. I’ve gotten some wonderful opportunities, and I’ve met some amazing folks.&lt;/p&gt;  &lt;p&gt;And by the way, no, I’m not going to go on an anti-MVP rant about how the program leeches off everyone and makes MVPs lose their morals and self-worth. The MVP program is what individuals make of it. I got a tremendous amount out of it, and again, thanks to everyone for their support over the years.&lt;/p&gt;  &lt;p&gt;Nor am I going to give up .NET and go to Ruby. Duh. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh3.ggpht.com/-jRrjxZvKUfo/UVmh1MxZbII/AAAAAAAAAG0/RT4KXMFKt4g/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;Despite this news I’m sure cool things will come along, so please don’t get your undies in a wad over my case. I’m good with it. It’s been a great experience.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/_P1x7PcR4V4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/2237582292917998423/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=2237582292917998423" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/2237582292917998423" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/2237582292917998423" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/_P1x7PcR4V4/im-no-longer-microsoft-mvp-for-c.html" title="I’m No Longer a Microsoft MVP for C#" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-jRrjxZvKUfo/UVmh1MxZbII/AAAAAAAAAG0/RT4KXMFKt4g/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/04/im-no-longer-microsoft-mvp-for-c.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-7977915121610044923</id><published>2013-02-21T10:20:00.001-05:00</published><updated>2013-02-21T10:20:08.870-05:00</updated><title type="text">I’m No Longer the Evangelist for Test Studio</title><content type="html">&lt;p&gt;It’s true. I’ve been asked to give up my dream job that I’ve loved working for the last 20 or so months.&lt;/p&gt;  &lt;p&gt;Instead, I’m now the Director of Engineering for Test Studio and am going to help with delivery of the automation tool I love so much. &lt;/p&gt;  &lt;p&gt;Yes, I know. That was a bad trick to play. You’ve been reading my blog and haven’t figured this part of my “humor” yet?&lt;/p&gt;  &lt;p&gt;In the new role I’ll be working closely with the teams in Austin and Sofia on planning and execution for future releases. It’s a scary but wonderfully exciting opportunity, and truth be told I had been missing being part of actively building software.&lt;/p&gt;  &lt;p&gt;I’m not vanishing from the testing community—that involvement is a critical part of better understanding problems that we can help solve with Test Studio—but the amount and shape of my involvement will change as I move my focus to the teams at Test Studio.&lt;/p&gt;  &lt;p&gt;One thing this brings up in a big way: Telerik needs another Evangelist to fill my position. We’re already looking for one, so this means we’ve got a second slot to fill, too!&lt;/p&gt;  &lt;p&gt;Want to know more? Have a look at &lt;a href="http://www.telerik.com/company/careers/test-studio-evangelist.aspx"&gt;the job description&lt;/a&gt; and &lt;a href="mailto:jim.holmes@telerik.com"&gt;drop me a line&lt;/a&gt; to chat me up!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/oZ_rL9jsSdo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/7977915121610044923/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=7977915121610044923" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7977915121610044923" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7977915121610044923" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/oZ_rL9jsSdo/im-no-longer-evangelist-for-test-studio.html" title="I’m No Longer the Evangelist for Test Studio" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/02/im-no-longer-evangelist-for-test-studio.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-1487490763643601695</id><published>2013-02-06T10:32:00.001-05:00</published><updated>2013-02-06T10:32:24.585-05:00</updated><title type="text">Cleaning Up Windows 2008 OS Drive</title><content type="html">&lt;p&gt;I try to keep the virtual machines I use for development, demos, and testing fairly lean. I use a smallish C: partition (60GB or so) and force everything to install to a second D: drive. All my projects and data end up on D:. This has saved me several times in the past when I’ve needed to rebuild a crashed VM—just reinstall the OS and off you go. I also like to think that it helps performance, even on a VM, by keeping IO off the operating system drive. No, I’ve never bothered to actually measure performance for this. Why do you ask?&lt;/p&gt;  &lt;p&gt;Today I ran into a rather interesting set of problems when trying to run code coverage metrics in Visual Studio 2012. Of course my tester homies all this this is epically funny and cool.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-sxm85Q80SZA/URJ3eTWLZWI/AAAAAAAAAF0/9pT6EmZhTD4/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-eerrxVZP0wA/URJ3fGhBzaI/AAAAAAAAAF8/ZFzsarTgZl8/image_thumb%25255B1%25255D.png?imgmax=800" width="404" height="604" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A quick bit of troubleshooting found the following, uh, minor problem:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-vbbjK7d7iYA/URJ3f9EbUCI/AAAAAAAAAGE/WeRpfoowW3Y/s1600-h/image%25255B8%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-Bjm8kpyCYuU/URJ3gqqoEJI/AAAAAAAAAGM/ozuM07Rq6p0/image_thumb%25255B4%25255D.png?imgmax=800" width="404" height="191" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WinDirStat is the next tool to jump on, and it quickly shows where the problem lies. The winsxs folder, where backup copies of every DLL dating back to Windows 3.01 are stored. OK, so it’s not quite that bad, but every time anything’s impacted by Windows Update or a Service Pack then cruft gets thrown in there.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-YNyqaw73tsA/URJ3hVRQKKI/AAAAAAAAAGU/u9zis8HqzAQ/s1600-h/image%25255B12%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-0Kej1OlWqaM/URJ3h6LOIsI/AAAAAAAAAGc/ahU6pWIJTFI/image_thumb%25255B6%25255D.png?imgmax=800" width="404" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Disk Cleanup is a handy utility to clean out unneeded backups of these, plus lots of other goo; however, it’s not installed by default on a Windows 2008 server OS. You’ll need to go add the Desktop Experience Feature (Server Manager | Features | Add Feature | Desktop Experience), then Disk Cleanup will be available under Start | Accessories | System Tools.&lt;/p&gt;  &lt;p&gt;I ran Disk Cleanup and got back a huge chunk of disk real estate – Disk Cleanup also let me know I had an extraordinary amount of temp file usage, too. And here I thought I’d been doing better regular maintenance on my server… &lt;/p&gt;  &lt;p&gt;Next maybe I should go check the last time I changed the oil in the car.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;(PS: Turns out this didn’t fix the epic crashes, but it was still needed. Hopefully it’s useful to you.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/uvG1s1GzeHY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/1487490763643601695/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=1487490763643601695" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1487490763643601695" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1487490763643601695" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/uvG1s1GzeHY/cleaning-up-windows-2008-os-drive.html" title="Cleaning Up Windows 2008 OS Drive" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-eerrxVZP0wA/URJ3fGhBzaI/AAAAAAAAAF8/ZFzsarTgZl8/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/02/cleaning-up-windows-2008-os-drive.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-1652393191563773336</id><published>2013-01-30T22:36:00.001-05:00</published><updated>2013-01-30T22:51:11.681-05:00</updated><title type="text">Learning JustMock for Working with Nasty Dependencies</title><content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I totally forgot to give mad props to colleague and good pal &lt;a href="http://twitter.com/skimedic"&gt;Phil Japikse&lt;/a&gt; for walking me through a couple things over IM in the course if noodling all this out.&lt;/p&gt;  &lt;p&gt;I’ve given my Unit Testing 101 talk ten or 20 times over the last four or five years and I love it. I enjoy getting folks introduced to unit testing without having to deal with dogma issues around Test Driven Development, Test Occasionally Development, etc. &lt;/p&gt;  &lt;p&gt;Part of the talk hits up working with mocking in order to get past a dependency on external providers. The example I use is a security provider used to check whether or not the current user’s authorized to update info for an employee.&lt;/p&gt;  &lt;p&gt;In the past I’ve used Rhino.Mocks to work through this. I’ve used Rhino in a few projects over the years and it’s been a great tool for me. &lt;/p&gt;  &lt;p&gt;Being the rather dense guy I am, I forgot that the &lt;a href="http://telerik.com"&gt;awesome company&lt;/a&gt; I work for has &lt;a href="http://www.telerik.com/products/mocking.aspx"&gt;its own mocking tool: JustMock&lt;/a&gt;. I figured it made sense to alter my tests to work with JustMock, if for no other reason than I could speak halfway intelligently to questions on it from other folks I interact with in the community.&lt;/p&gt;  &lt;p&gt;One of the things I was most interested in was dealing with badly handled dependencies in code. The example I used previously had a nice constructor-injected interface-based security provider, so it was easy and clean to handle with Rhino. Here’s how it looks:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EmployeeUpdater&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; IUpdateEmployeePermissible _updateEmployeeSecurityProvider;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; EmployeeUpdater(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        IUpdateEmployeePermissible updateEmployeeSecurityProvider)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        _updateEmployeeSecurityProvider = updateEmployeeSecurityProvider;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Employee UpdateEmployeeRate(Employee targetEmployee, &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; newRate)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        Employee updatedEmployee;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_updateEmployeeSecurityProvider.&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            CanUpdateEmployeeRate(targetEmployee.EmployeeId))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//if (true)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            updatedEmployee = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.EmployeeId, &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.FirstName,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.LastName,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.Address, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SecurityException(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                &lt;span style="color: #006080"&gt;&amp;quot;Invoking user doesn't have permissions to update target target employee. &amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                                        targetEmployee);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; updatedEmployee;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A test using Rhino, complete with interaction verification, is straightforward:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;[Test]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Verify_security_provider_is_called()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; userId = 1;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; oldRate = 5;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; newRate = 10;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    var mockProvider = MockRepository.GenerateMock&amp;lt;IUpdateEmployeePermissible&amp;gt;();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    mockProvider.Expect(x =&amp;gt; x.CanUpdateEmployeeRate(userId)).Return(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Employee current = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee(userId, &lt;span style="color: #006080"&gt;&amp;quot;Jim&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Holmes&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Doghouse&amp;quot;&lt;/span&gt;, oldRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    EmployeeUpdater updater = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EmployeeUpdater(mockProvider);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Employee updated = updater.UpdateEmployeeRate(current, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    mockProvider.VerifyAllExpectations();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I took and muddied up the EmployeeUpdater a bit to mimic code we’ve either written ourselves or have seen: “new”ing up objects instead of injecting them, and using calls to static methods or classes. These situations make it tough to mock things out and will force you to move to a commercial mocking tool like TypeMock or JustMock. [1] (JustMock has an extremely powerful free version, but mocking concrete classes, “future mocks” of items “new”ed up instead of injected, or static requires the commercial version.)&lt;/p&gt;

&lt;p&gt;Here’s my uglified EmployeeUpdater class. I simply created two different methods, one which newed up the security provider in it, another which hit the provider via a static call.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; EmployeeUpdaterLegacyStyle&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Employee UpdateEmployeeRate_ProviderNewedUpHere(Employee targetEmployee, &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; newRate)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        UpdateEmployeeSecurityProvider _updateEmployeeSecurityProvider =&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UpdateEmployeeSecurityProvider();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        Employee updatedEmployee;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_updateEmployeeSecurityProvider.&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        CanUpdateEmployeeRate(targetEmployee.EmployeeId))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//if (true)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            updatedEmployee = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee(targetEmployee.EmployeeId,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.FirstName,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.LastName,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.Address, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SecurityException(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                                        &lt;span style="color: #006080"&gt;&amp;quot;Invoking user doesn't have permissions to update target target employee. &amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                                        targetEmployee);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; updatedEmployee;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Employee UpdateEmployeeRate_ProviderIsStaticHere(Employee targetEmployee, &lt;span style="color: #0000ff"&gt;float&lt;/span&gt; newRate)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        Employee updatedEmployee;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (UpdateEmployeeSecurityProvider_Static.CanUpdateEmployeeRate(targetEmployee.EmployeeId))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #008000"&gt;//if (true)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            updatedEmployee = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee(targetEmployee.EmployeeId,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.FirstName,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.LastName,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                targetEmployee.Address, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SecurityException(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                                 &lt;span style="color: #006080"&gt;&amp;quot;Invoking user doesn't have permissions to update target target employee. &amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                                        targetEmployee);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; updatedEmployee;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;JustMock handles both quite nicely. First, working with &lt;a href="http://www.telerik.com/help/justmock/advanced-usage-future-mocking.html"&gt;“future” mocking&lt;/a&gt; to handle the variant that instantiates the object in the method. Note I’m working with a concrete class. No interfaces, no virtual, just a straight concrete class that’s instantiated right in my method above. The final mockedProvider.Assert() validates the security provider’s method was indeed called by the updater. (Comment out the //if(true) portion in the updater to see that test fail!)&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Mocking_provider_newed_in_method()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; userId = 1;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; oldRate = 5;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; newRate = 10;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    var mockedProvider =&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        Mock.Create&amp;lt;UpdateEmployeeSecurityProvider&amp;gt;();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//Standard syntax for mocking&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//Mock.Arrange(() =&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//    mockedProvider.CanUpdateEmployeeRate(userId))&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//        .IgnoreInstance()&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//        .Returns(true)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//        .Occurs(1);&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//using the fluent interface from JustMock.Helpers &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    mockedProvider.Arrange(x =&amp;gt; x.CanUpdateEmployeeRate(userId))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                  .IgnoreInstance()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                  .Returns(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;                  .Occurs(1);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Employee current =&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee(userId, &lt;span style="color: #006080"&gt;&amp;quot;Jim&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Holmes&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Doghouse&amp;quot;&lt;/span&gt;, oldRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    EmployeeUpdaterLegacyStyle legacyUpdater =&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EmployeeUpdaterLegacyStyle();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Employee updated = &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        legacyUpdater.UpdateEmployeeRate_ProviderNewedUpHere(current, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Assert.AreEqual(updated.HourlyRate, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//Standard assert&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Mock.Assert(mockedProvider);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #008000"&gt;//Fluent from Helpers&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    mockedProvider.Assert();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here’s a test handling the static call variant above:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;[Test]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Mocking_provider_called_statically()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; userId = 1;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; oldRate = 5;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; newRate = 10;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Mock.SetupStatic(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(UpdateEmployeeSecurityProvider_Static),&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        StaticConstructor.Mocked);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; called = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Mock.Arrange(() =&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        UpdateEmployeeSecurityProvider_Static.CanUpdateEmployeeRate(userId))&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        .Returns(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        .Occurs(1);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Employee current =&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Employee(userId, &lt;span style="color: #006080"&gt;&amp;quot;Jim&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Holmes&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Doghouse&amp;quot;&lt;/span&gt;, oldRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    EmployeeUpdaterLegacyStyle legacyUpdater =&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EmployeeUpdaterLegacyStyle();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Employee updated = &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        legacyUpdater.UpdateEmployeeRate_ProviderIsStaticHere(current, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Assert.AreEqual(updated.HourlyRate, newRate);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;    Mock.Assert(() =&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        UpdateEmployeeSecurityProvider_Static.CanUpdateEmployeeRate(userId),&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;        Occurs.Exactly(1));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I’m sure there are better ways to leverage JustMock, and I’m sure there are cleaner ways to write the test. This exercise was more about me learning what capabilities JustMock has so I could keep it somewhat clear in my own head.&lt;/p&gt;

&lt;p&gt;I’d love to hear feedback from folks who’ve worked with both mocking tools! Have you worked with Rhino.Mocks and JustMock? Have any thoughts?&lt;/p&gt;

&lt;p&gt;[1]Perhaps Rhino.Mocks now handles these situations. I fully admit I haven’t kept up with it…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/tGm2Ut0jj_c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/1652393191563773336/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=1652393191563773336" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1652393191563773336" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1652393191563773336" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/tGm2Ut0jj_c/learning-justmock-for-working-with.html" title="Learning JustMock for Working with Nasty Dependencies" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/01/learning-justmock-for-working-with.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-8367432938948502235</id><published>2013-01-14T14:27:00.001-05:00</published><updated>2013-01-14T16:26:02.940-05:00</updated><title type="text">CodeMash Financial Planning Sheet</title><content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;UPDATED&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Interested in more detail on how we plan CodeMash? Want to see all the gory (and scary!) financial figures behind the scenes?&lt;/p&gt;  &lt;p&gt;We’ve posted up the exact Excel sheet I use to plan everything financial around CodeMash. If you’re a conference organizer, or considering organizing one, then this sheet may be of great use to you. Yes, it’s tailored to CodeMash, but it’s full of information that may be very useful to you. There are a number of things it helps me with every year:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Meal planning:&lt;/strong&gt; I’m able to keep track of the various meals, plus I have some notes around what I need to make sure gets covered. (Think proteins for vegetarians, greens at each meal, etc.)       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;Fixed versus consumable costs:&lt;/strong&gt; Planning conferences starts off as “We’ll get awesome sessions and have fantastic people!” and inevitably turns to “Crap. How am I going to organize and pay for all this food?” If you’re organizing a conference you absolutely have to keep a careful eye on your food costs. I break out fixed costs (per head things like meals and party food) versus consumable (variable) costs like soda, coffee, and drinks. Those consumable costs terrify me because the impact can be thousands of dollars. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;AV costs:&lt;/strong&gt; Tracking Kalahari and external vendor AV costs helps me ensure I’ve got the right count of projectors, microphones, and screens ordered to cover every day. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Attendee gifts:&lt;/strong&gt; I use this as a checklist to help ensure I’ve got shirts/hoodies, USB sticks, etc. ordered up. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Psuedo-TODO List&lt;/strong&gt;: All the items on the various tabs serve to remind me of some of the various things we have to ensure get covered. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The workbook isn’t perfect. I refactor it every year based on things I’ve learned (usually the hard way). Just this year I finally deleted out columns I’d had hidden which contained revenue and estimated expenses for attendee headcounts of 250, 400, 500, and 700. It’s been a few years since we were that small…&lt;/p&gt;  &lt;p&gt;Still, it’s invaluable for me in planning. It may be of interest to you, and it follows CodeMash’s policy of being as transparent as possible around our finances.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://codemash.org/docs/default-document-library/codemash-planning-(sanitized).xlsx?sfvrsn=4"&gt;Grab it here!&lt;/a&gt; I hope you find it useful and informative!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; I didn’t make clear that this workbook is &lt;em&gt;not&lt;/em&gt; finalized for 2013. Consumables (soda, coffee, cocktails and beer) always are a huge variable, and there are always a bunch of last minute charges/changes. That $31K surplus will be nowhere near that by the time things are said and done.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/wIzk5QB_ZlU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/8367432938948502235/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=8367432938948502235" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8367432938948502235" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8367432938948502235" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/wIzk5QB_ZlU/codemash-financial-planning-sheet.html" title="CodeMash Financial Planning Sheet" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2013/01/codemash-financial-planning-sheet.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-6418177511458704888</id><published>2012-12-16T12:22:00.001-05:00</published><updated>2012-12-16T12:31:17.849-05:00</updated><title type="text">My Trip to India</title><content type="html">&lt;p&gt;I’ve returned this last Wednesday from 12 days in India and I thought I’d post a few musings on the trip here. (I’ve already posted up some of the work-related things over at &lt;a href="http://www.telerik.com/automated-testing-tools/blog/jimholmes/12-12-13/india-trip-notes.aspx"&gt;my “day job” blog&lt;/a&gt;.) &lt;/p&gt;  &lt;p&gt;Without a doubt this was one of the most impactful overseas trips I’ve ever had, and I’ve been to a fair number of places outside North America over my life: Okinawa, France, Saudi Arabia, Panama, the Philippines, St. Martin, England, Italy, Hungary, Austria, Poland, Bulgaria, and a likely a few others I’m forgetting.&lt;/p&gt;  &lt;p&gt;I did zero preparation for the trip. None. Normally my wife and I are huge planners. We get all kinds of research done for big trips and have lots of things lined up. This time I figured I’d just go over and jump in the deep end and float wherever currents took me. Good choice.&lt;/p&gt;  &lt;p&gt;First some of the bad things: India is a country where 300 million people live below poverty, and in India, unlike the US, poverty means &lt;strong&gt;&lt;em&gt;poverty&lt;/em&gt;&lt;/strong&gt;. People sleeping on blankets in the dirt with a torn tarp over their head poverty. 20 story five star hotels with tent cities next to them poverty. Hideous water giving you instantaneous dysentery and hepatitis poverty. It’s staggering if you’ve been in similar situations before, mind-numbingly shocking if you haven’t. The piles of trash across the entire country are sad—India is a land of amazing beauty and deep, &lt;strong&gt;&lt;em&gt;deep &lt;/em&gt;&lt;/strong&gt;spirituality. It was heartbreaking to see such a wonderful place being used as a dumping ground.&lt;/p&gt;  &lt;p&gt;But still…&lt;/p&gt;  &lt;p&gt;You get past that, or at least find yourself able to move beyond it, and wow, what India has to show you! Noise, color, smells, sounds, noise, people, food. The list goes on and on and on.&lt;/p&gt;  &lt;h2&gt;The Food&lt;/h2&gt;  &lt;p&gt;Food in India is a wonderful experience. India, like Italy, Spain, and Mexico, isn’t one style of cuisine. How could it be? Like those other nations India comes from a very diverse, fragmented history. The food in the south was greatly different from that of the north, and all of it was great. I was lucky to have friends to explain some of the differences to me.&amp;#160; As you’ve likely noticed if you’ve followed this blog for long, I’m a pretty serious foodie, so when I run across stuff like this in the street I’m in love!&lt;/p&gt; &lt;a title="IMG_0654 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8268713515/"&gt;&lt;img alt="IMG_0654" src="http://farm9.staticflickr.com/8212/8268713515_886370e26a.jpg" width="333" height="500" /&gt;&lt;/a&gt;   &lt;p&gt;Or when my colleague takes me to a spot like this for dinner on the trip back from Agra:&lt;/p&gt;  &lt;p&gt;&lt;a title="IMG_0676 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8269784476/"&gt;&lt;img alt="IMG_0676" src="http://farm9.staticflickr.com/8218/8269784476_5a9fb69552.jpg" width="500" height="333" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This was a dinner from a central region of India which wasn’t typical of Bangalore, but my pal DJ thought I’d enjoy it. How right he was!&lt;/p&gt;  &lt;p&gt;&lt;a title="2012-12-03_20-23-08_702 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8278423690/"&gt;&lt;img alt="2012-12-03_20-23-08_702" src="http://farm9.staticflickr.com/8361/8278423690_f78aee315b.jpg" width="500" height="282" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here’s a milk drink we had at a diner-like place in Delhi.&lt;/p&gt;  &lt;p&gt;&lt;a title="2012-12-10_15-15-28_746 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8278424558/"&gt;&lt;img alt="2012-12-10_15-15-28_746" src="http://farm9.staticflickr.com/8217/8278424558_d2f843af4c.jpg" width="500" height="282" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;My stomach was in fairly good shape the entire trip, but then I eat a lot of spicy food already so my stomach was somewhat preconditioned. It was pretty amusing how so many of my colleagues and fellow diners there would continually ask “Is this too spicy for you? Are you OK with this?” I suppose I’m a bit atypical in this area, though… (That said, the street food at the cart above did do me in a bit. I knew better, but didn’t care.)&lt;/p&gt;  &lt;h2&gt;The People&lt;/h2&gt;  &lt;p&gt;The people are perhaps the happiest, most open, most hospitable I’ve ever come across in any of my travels. Bavarians previously held that spot, but my experiences in India blew even that away. Indians are gracious and full of laughter. I was honored to be invited into two different homes for meals, and they were some of the best times I had. (Being invited into someone’s home for food has a special significance for me, one I’m not able to explain well. Suffice it to say it means a lot.)&lt;/p&gt;  &lt;p&gt;Indians are incredibly communal people. You might be taken aback at the depth conversations go between complete strangers. During our 16 hour day trip to Agra, my bachelor colleague got a grilling on his bachelorhood status, advice on why he should marry, and insight on a successful life—all from the middle-aged driver who we’d just met that morning at 6am. Get over the personal boundaries you might have and just enjoy the fact that Indians love people and want to know more about you.&lt;/p&gt;  &lt;p&gt;They’re also extraordinarily happy. I had some great meals with various people through the developer and tester communities, and all were filled with laughter and jokes. And good food.&lt;/p&gt;  &lt;p&gt;I was also amazed at the forward thinking mindset of the testing professionals I spoke with. India earned a reputation (partially justly) for cheap labor of poor quality. You need to lose that perception of them, right now. The people I spoke with at conferences, user groups, and customer sites were, for the vast majority, serious about taking their work to the next level. They’re looking at the long game, and they’re committed to making serious value-based transformations in how they do their work. I had some amazing conversations there that got me fired up and excited.&lt;/p&gt;  &lt;h2&gt;the traffic&lt;/h2&gt;  &lt;p&gt;Traffic in India is non-stop. Traffic is simply an insane, chaotic, wonderful experience if you can let go of any notion of patience. It will take you two hours to travel 60Km in Delhi, and 1.5 hours to go 15Km in Bangalore. Getting frustrated and angry won’t solve a thing, so just sit back and enjoy the tuk tuk (powered three wheeler rickshaw) or cab ride. Don’t freak out that you’ve got a two inch space between your vehicle and the huge dump truck next to you. The driver’s thinking “I had an inch and a half to spare!”&lt;/p&gt;  &lt;p&gt;Scooters are family transportation vehicles in India, and you’ll see amazing sights: pipes, furniture, groceries, and more folks than you would think could fit on a two wheeler. Personal favorite: Dad driving, mom on back, puppy in mom’s lap. Personal record: Dad driving, mom near back, four other kids scattered from handlebars to tail end. Yes, six on a two wheeler…&lt;/p&gt;  &lt;p&gt;It seems insane to someone from the West, but it’s similar to what I’ve experienced in my previous trips to Panama, the Philippines, etc. You’d think there would be non-stop wrecks, mayhem, and fatalities, but I didn’t see a single accident while I was there. I saw a &lt;strong&gt;&lt;em&gt;lot&lt;/em&gt;&lt;/strong&gt; of scratched up, dinged up cars, but not one wreck. Indians understand the implicit system with the traffic, and they, as with so many other things in their nation, just figure out how to have huge numbers of people co-exist in small spaces. With cars. And scooters. And trucks. And pedestrians. And dogs. And tuk tuks.&lt;/p&gt;  &lt;h2&gt;The horns&lt;/h2&gt;  &lt;p&gt;Horns require a section of their own. Honking was non-stop in Bangalore, prevalent in my countryside drives, and moderate in Delhi. If you sit back and listen the honking has an entertaining language all of its own.&lt;/p&gt;  &lt;p&gt;There’s the single, quick “toot” which is the equivalent of “Coming up on your right/left. Make way, please!” A bit longer “honk” might be used of the person the driver’s passing didn’t move out of the way quickly. Toots escalate through honks up through blaaats to the rarely used Angry Honk where the driver’s really frustrated. My first driver for my day trip to Mysore had a very light, happy honk. I didn’t like the driver for our Agra trip very much. He was Angry Honk right off the bat all day.&lt;/p&gt;  &lt;p&gt;The Sights&lt;/p&gt;  &lt;p&gt;Where to start? India is full of so many strange, wonderful, overwhelming things. Yes, yes, the Taj Mahal is teh awesum, but you expect that. It’s the &lt;em&gt;Taj Mahal.&lt;/em&gt;&lt;/p&gt; &lt;a title="IMG_0638 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8268710881/"&gt;&lt;img alt="IMG_0638" src="http://farm9.staticflickr.com/8059/8268710881_48bb2486bc.jpg" width="333" height="500" /&gt;&lt;/a&gt;   &lt;p&gt;What was more impactful to me were some of the more intimate, less visited temples. I was at a temple near Mysore that was built in 849 that really moved me. This palace below with a shrine to a holy man is a short hour from Agra, and I had one of the best times there.&lt;/p&gt; &lt;a title="IMG_0659 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8269781334/"&gt;&lt;img alt="IMG_0659" src="http://farm9.staticflickr.com/8217/8269781334_274e392976.jpg" width="500" height="333" /&gt;&lt;/a&gt;   &lt;p&gt;There’s also the crazy IT market in Delhi that is straight out of some cross between a peyote-hammered steampunk and MC Escher.&lt;/p&gt;  &lt;p&gt;&lt;a title="2012-12-10_17-08-25_804 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8278424842/"&gt;&lt;img alt="2012-12-10_17-08-25_804" src="http://farm9.staticflickr.com/8059/8278424842_664a570d0a.jpg" width="500" height="282" /&gt;&lt;/a&gt; &lt;a title="2012-12-10_17-20-22_755 by Jim Holmes OH, on Flickr" href="http://www.flickr.com/photos/jimholmes/8278425074/"&gt;&lt;img alt="2012-12-10_17-20-22_755" src="http://farm9.staticflickr.com/8224/8278425074_8700cef1f2.jpg" width="282" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;All of this can just drive you crazy trying to take it all in. I stopped taking pictures very early in my trip, choosing to just absorb a lot and get a few pictures in here and there. I think that was a pretty smart choice.&lt;/p&gt;  &lt;h2&gt;Wrapping Up&lt;/h2&gt;  &lt;p&gt;I’m really thankful I got the chance to go to India. I’m already trying to line up a return trip or two. I can’t wait to get back and see new old friends and new old sights.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/Y0QNgv4QRJA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/6418177511458704888/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=6418177511458704888" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/6418177511458704888" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/6418177511458704888" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/Y0QNgv4QRJA/my-trip-to-india.html" title="My Trip to India" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/12/my-trip-to-india.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-3697737744698694982</id><published>2012-10-16T09:53:00.001-04:00</published><updated>2012-10-16T09:53:05.223-04:00</updated><title type="text">Handling Rejection (From Conferences)</title><content type="html">&lt;p&gt;Sometimes it seems like a significant part of my day job is having my submissions to various conferences rejected. Off the top of my head, here’s an incomplete list of conferences where I’ve had submissions rejected from over the last year(ish)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;TechEd&lt;/li&gt;    &lt;li&gt;DevConnections&lt;/li&gt;    &lt;li&gt;DevLink&lt;/li&gt;    &lt;li&gt;Agile Testing Days&lt;/li&gt;    &lt;li&gt;Agile Dev Practices&lt;/li&gt;    &lt;li&gt;StarEast/StarWest&lt;/li&gt;    &lt;li&gt;Some testing conference in London whose name I’ve forgotten&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are a number of other conferences as well, but frankly I’ve lost track.&lt;/p&gt;  &lt;p&gt;Rejection stings, for certain, but I have also come to view these rejections as a pretty good learning opportunity. After I get over the pain of rejection, that is.&lt;/p&gt;  &lt;p&gt;First off, I always thank the organizers for considering my submissions. I can’t imagine how many hundreds of submissions conferences like DevConnections or StarEast/West get. Taking a moment to thank the content selection crew is simply good manners. (TechEd is different. It’s a total black box, impersonal process, so I never get any contact with humans.) &lt;/p&gt;  &lt;p&gt;Secondly, I sit back and think about what might have been the cause for getting passed over. If possible, I try to get feedback directly from the selection folks; however, that’s not always possible. &lt;/p&gt;  &lt;p&gt;I’ve found there are a number of useful aspects to consider:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Content doesn’t fit&lt;/strong&gt;. Maybe you’ve just missed the mark with your submissions to that conference. Some years ago I tried wedging a testing talk to an open source conference targeted more to business application developers. My abstract simply didn’t make a good case why the talk would fit in their conference. Make sure what you’re submitting will be useful to the conference organizers.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Content lost in the chaff.&lt;/strong&gt; You need to submit talks that stand out from all the others. “Intro to MVC” is outdated and doesn’t offer up anything unique from the 20 other MVC talks the organizers are looking through. Make a clear case of what value your session brings to the attendees.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Content selection crew was overwhelmed. &lt;/strong&gt;Poorly organized conferences might have too few folks on staff to get a good review in. If you’re not known to the organizers, then they may have simply lost you in the tidal wave of submissions. Networking matters. Experience matters. (I’m very thankful that the CodeMash content chairs works hard to scale out the selection crew every year to avoid just this problem. They still have huge amounts of work.)&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Poorly written abstract&lt;/strong&gt;. It happens, even to someone who’s polished and submitted hundreds of abstracts over the last ten years. I’d like to think I’ve learned and don’t do this anymore, but it’s possible. I once wrote &lt;a href="http://frazzleddad.blogspot.com/2009/10/writing-good-session-abstract.html"&gt;another blog post with some thoughts about writing a good abstract&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Better submissions from other folks&lt;/strong&gt;. That happens on occasions, particularly for really large conferences. Look at what did get picked up and compare your submissions to those. Note that you’ll have to do some serious stepping back and viewing things with complete self-honesty and detachment. You can’t let your own pride get in the way with false impressions. Which brings me to…&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Ego&lt;/strong&gt;. Yes, sometimes my own ego gets in the way of submissions. Last year I put in four testing talks to a regional conference. None got accepted. Looking back I think I seriously slacked off when writing the abstracts because I felt I was well-known enough that the talks would get picked up anyway. That one stung but good—however, it was a good lesson learned. Respect yourself enough to put aside your ego and &lt;strong&gt;&lt;em&gt;care&lt;/em&gt;&lt;/strong&gt; about what you’re putting in. Remember, &lt;a href="https://speakerdeck.com/u/jimholmes/p/its-not-about-you"&gt;it’s not about you&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Drama&lt;/strong&gt;. Conference organizers are horribly, insanely busy during planning and especially during execution of the conference. The last thing they need is drama or worries about unreliability. If you’re a Drama Queen or King, or if you’re a flake, then you’ve got a deep, deep hole to dig yourself out of. Getting over that can take years because that sort of trust is hard to rebuild. (As a personal note, seven years ago I bailed from a half-day workshop at a conference put on by my pal Chris Woodruff. I bailed &lt;em&gt;the day before the conference&lt;/em&gt;. It’s perhaps the worst I’m a Douchebag moment of my adult life, and I’m still beating myself up about it. Thankfully Chris is an awesome guy who was extraordinarily gracious about it, and I think I’ve somewhat atoned for it by now.)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Rejection’s not easy. I’ve gotten three rejection notices in the last two weeks alone. That said, view it as an opportunity to avoid lashing out and instead consider how you can improve for the next conference you target.&lt;/p&gt;  &lt;p&gt;I’m already working on a few more submissions now…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/kgE16Jo7tgY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/3697737744698694982/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=3697737744698694982" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/3697737744698694982" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/3697737744698694982" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/kgE16Jo7tgY/handling-rejection-from-conferences.html" title="Handling Rejection (From Conferences)" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/10/handling-rejection-from-conferences.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-7119926926435012991</id><published>2012-10-09T18:14:00.001-04:00</published><updated>2012-10-09T18:14:09.873-04:00</updated><title type="text">Consolidating Drawings from Your iPad’s Paper app</title><content type="html">&lt;p&gt;I really like doodling around on the Paper app from 53. It’s a lot of fun, and lets me come up with some &lt;a href="https://speakerdeck.com/u/jimholmes/p/its-not-about-you"&gt;funky, off-the-beaten-path presentations&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The work involved in getting those images out of Paper and into Keynote or PowerPoint is a hassle, though. You have to fire up &lt;a href="http://www.macroplant.com/iexplorer"&gt;iExplorer&lt;/a&gt; and dive into the Apps folder on your iPad when it’s docked.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-NoJbDxcjPIU/UHShq31zRsI/AAAAAAAAAFM/mamVCEgB9cE/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-lzddKJQ-IeI/UHShrYLMm4I/AAAAAAAAAFU/9o5HHei4F3w/image_thumb%25255B1%25255D.png?imgmax=800" width="704" height="447" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You’ll have to figure out which node under that Journals folder is the book you want. There’s some goo in the model.json files that can help you out, or just look at the Date Modified fields.&lt;/p&gt;  &lt;p&gt;Drag that folder over to a working directory on your Mac, then you can start to pull the graphics out. They’re beautiful, high-rez PNG files with transparent backgrounds. Unfortunately, they’re all stored as the same filename in GUID-named folders. &amp;lt;sigh/&amp;gt;&lt;/p&gt;  &lt;p&gt;The following Ruby script helps you pull the files out and drop them in a common folder, renaming them on the fly. Run it from the folder holding all the subdirectories with the files. You’ll need to edit sourceDir and targetDir as appropriate for your environment.&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;require &lt;span style="color: #006080"&gt;&amp;quot;FileUtils&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;count = 0&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;sourceDir = &lt;span style="color: #006080"&gt;&amp;quot;/Users/jimholmes/Documents/tmp/Pages&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;targetDir = &lt;span style="color: #006080"&gt;&amp;quot;/Users/jimholmes/Documents/tmp/Consolidated/&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;dirContents = Dir.entries(sourceDir)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;dirContents.each &lt;span style="color: #0000ff"&gt;do&lt;/span&gt; |folder|&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  next &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; folder == &lt;span style="color: #006080"&gt;'.'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  next &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; folder == &lt;span style="color: #006080"&gt;'..'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  next &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; folder == &lt;span style="color: #006080"&gt;'.DS_Store'&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  next &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; not File.directory?(folder)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  source = File.join(sourceDir, folder, &lt;span style="color: #006080"&gt;&amp;quot;sketchLayer@2x.png&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  target = File.join(targetDir, &lt;span style="color: #006080"&gt;&amp;quot;Pages-#{count}.png&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  puts &lt;span style="color: #006080"&gt;&amp;quot;Source: #{source}&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  puts &lt;span style="color: #006080"&gt;&amp;quot;Target: #{target}&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  FileUtils.cp_r(source, target)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;  count += 1&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;end&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Mad props to &lt;a href="https://twitter.com/rubyist"&gt;@rubyist&lt;/a&gt; who dug me out of some issues with how I was handling the filenames.&lt;/p&gt;

&lt;p&gt;My next step some day would be to figure out how to pull this stuff straight from the iPad’s filesystem; however, I’ll have free time for that in approximately 246 years, I think.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/ceA2y9szzDs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/7119926926435012991/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=7119926926435012991" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7119926926435012991" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7119926926435012991" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/ceA2y9szzDs/consolidating-drawings-from-your-ipads.html" title="Consolidating Drawings from Your iPad’s Paper app" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-lzddKJQ-IeI/UHShrYLMm4I/AAAAAAAAAFU/9o5HHei4F3w/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/10/consolidating-drawings-from-your-ipads.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-5634708499448951411</id><published>2012-09-17T09:11:00.001-04:00</published><updated>2012-09-17T09:11:28.074-04:00</updated><title type="text">Video on “Solving Common Web UI Automation Problems”</title><content type="html">&lt;p&gt;Looking to learn more about creating flexible locators, ease your frustrations over dynamic content, and see some flexible ways to pull data from tables in a flexible fashion that’s not tied to sort or column order?&lt;/p&gt;  &lt;p&gt;Check out &lt;a href="http://tv.telerik.com/watch/automated-testing-tools/solvingcommonproblemswebinar"&gt;the recording of a webinar I hosted last week&lt;/a&gt; on these common web automation problems.&lt;/p&gt;  &lt;p&gt;This webinar’s very generic in content. As a matter of fact, most of the examples are in C# using WebDriver.&lt;/p&gt;  &lt;p&gt;I’ve got &lt;a href="http://www.telerik.com/automated-testing-tools/blog/jimholmes/12-09-13/notes-from-the-ldquo-solving-common-web-ui-automation-problems-rdquo-webinar.aspx"&gt;a wrapup posting too listing the various demo code&lt;/a&gt; I used during the webinar.&lt;/p&gt;  &lt;p&gt;I hope you find it useful!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/kpa0a4dkvuw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/5634708499448951411/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=5634708499448951411" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/5634708499448951411" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/5634708499448951411" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/kpa0a4dkvuw/video-on-solving-common-web-ui.html" title="Video on “Solving Common Web UI Automation Problems”" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/09/video-on-solving-common-web-ui.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-7982970070372505809</id><published>2012-09-12T09:52:00.001-04:00</published><updated>2012-09-12T09:52:11.999-04:00</updated><title type="text">Love Training &amp; Coaching Software and Test Teams? Come Work With Me!</title><content type="html">&lt;p&gt;Telerik’s Test Studio is looking for someone to help us make teams using Test Studio be awesome. We’re extremely passionate about ensuring our customers succeed over the long-term with test automation – and a huge part of that success hinges on getting Test Studio users great training in the early phases of their adoption efforts.&lt;/p&gt;  &lt;p&gt;We’re looking for someone to join the Telerik team full time to help deliver training and coaching engagements for our customers. As a trainer you’d be spending 25% – 50% of your time on the road at customer sites. We’ve got upcoming training engagements all across the US and internationally as well. You’d also be delivering training via online webinar sessions, and you’d be helping to evolve our existing training curriculum and materials. You’d also be responsible for helping create other content like blog posts, white papers, and videos.&lt;/p&gt;  &lt;p&gt;We’ve got a very different philosophy about training for our customers. Training is &lt;strong&gt;&lt;em&gt;NOT &lt;/em&gt;&lt;/strong&gt;a revenue stream for us; it’s explicitly about ensuring our customers’ long-term success with Test Studio. Moreover, our onsite training engagements quickly move from an overview of Test Studio into working with the customer teams to write tests in their own environment. You’ll quickly be flipping the switch from trainer to coach during these sessions!&lt;/p&gt;  &lt;p&gt;It’s also not just all about Test Studio, either. It’s about becoming an influencer and thought leader in the automated test space. The folks here in this corner of Telerik are awesome about helping improve testing overall, not just via our product. This means you’ll have the opportunity to stay (or get) familiar with other testing tools. (I still spend plenty of time talking about and presenting on WebDriver/Selenium as well as gabbing other automation tools, too.)&lt;/p&gt;  &lt;p&gt;What kind of person are we looking for? You’ll need to be passionate about helping customers succeed long term with automation. You’ll need to have enough self-confidence to say “I don’t know” when confronted with something new to you – and the self-motivation and drive to follow up on the accompanying “but I’ll find out and get back to you!”&amp;#160; You’ll need to have exposure to development and testing in real environments – but you don’t need to be an expert in either. (Obviously expertise helps…)&lt;/p&gt;  &lt;p&gt;We’re looking for this position to be staffed up in either Austin, Texas, or Hudson, Ohio. Preference would be Austin – the ability to coordinate closely with our Test Studio team down there is a tremendous advantage.&lt;/p&gt;  &lt;p&gt;Working for Telerik is amazing. Working with Test Studio at Telerik has evolved into pretty much my dream job. I get to train and coach customers, I get to learn from wicked smart folks in the industry, and I work along with some incredibly awesome product and sales folks.&lt;/p&gt;  &lt;p&gt;Interested? Ping me directly at &lt;a href="mailto:jim.holmes@telerik.com"&gt;my work email address&lt;/a&gt;. I’d love to chat with you.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/ZvWpb0-hw-M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/7982970070372505809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=7982970070372505809" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7982970070372505809" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7982970070372505809" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/ZvWpb0-hw-M/love-training-coaching-software-and.html" title="Love Training &amp;amp; Coaching Software and Test Teams? Come Work With Me!" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/09/love-training-coaching-software-and.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-8919459566378118216</id><published>2012-08-11T10:16:00.001-04:00</published><updated>2012-08-11T10:16:56.737-04:00</updated><title type="text">Are You a Geek In Dayton? Fill an Opening with the Dayton .NET Developers Group!</title><content type="html">&lt;p&gt;The Dayton .NET Developers Group has a need for an enthusiastic person to step up and help lead the group. It’s time for me to step aside after seven or so years with the group, and the current Board of Directors is looking for someone to fill the soon-to-be empty position.&lt;/p&gt;  &lt;p&gt;Helping run the DevGroup is a great experience. It’s a couple hours a month of your time, but you’ll get to meet a lot of great folks, and you’ll get some tremendous satisfaction in knowing you’re helping people make tremendously positive impacts in their careers through networking and skills development.&lt;/p&gt;  &lt;p&gt;Moreover, as part of the group’s leadership you have an active hand in determining what the group’s direction for topics and special events is. That’s pretty exciting stuff! You’ll also build out your network of contacts to include speakers, sponsors, and companies at the regional and national level.&lt;/p&gt;  &lt;p&gt;A few of the things you might be involved with during a regular month:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Helping run the monthly meetings (raffles, meeting logistics, greeting, etc.)&lt;/li&gt;    &lt;li&gt;Helping plan out future topics&lt;/li&gt;    &lt;li&gt;Helping locate speakers for future meetings&lt;/li&gt;    &lt;li&gt;Helping grow the group’s membership through drives, media contacts, etc.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Getting involved with running a user group is an extraordinarily rewarding experience. You’ll make a lot of new friends and contacts throughout the Heartland region (or farther afield!), you’ll get even more exposure to career-broadening ideas, and you’ll get opportunities you never imagined. I’d never have started my speaking “career” were it not for having to jump in to fill a meeting when the planned speaker had to reschedule at the last minute. Somehow the group survived me…&lt;/p&gt;  &lt;p&gt;Interested, or know someone who’d be a good fit? Drop me a mail via the contact link at the blog’s upper right corner. &lt;/p&gt;  &lt;p&gt;Get involved! It’s totally worth it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/Fe8_ivvuXWg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/8919459566378118216/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=8919459566378118216" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8919459566378118216" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8919459566378118216" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/Fe8_ivvuXWg/are-you-geek-in-dayton-fill-opening.html" title="Are You a Geek In Dayton? Fill an Opening with the Dayton .NET Developers Group!" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/08/are-you-geek-in-dayton-fill-opening.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-1319572715262266366</id><published>2012-07-19T12:56:00.001-04:00</published><updated>2012-07-19T12:56:45.342-04:00</updated><title type="text">Hear Jim Holmes talk Testing with Jesse Liberty</title><content type="html">&lt;p&gt;Jesse Liberty, one of Telerik’s great evangelists, had me on his Yet Another Podcast show to talk about, wait for it, &lt;strong&gt;&lt;em&gt;testing.&lt;/em&gt;&lt;/strong&gt; Jesse and I cover a lot of things about testing at all levels. It’s a wandering conversation that I think you’ll find entertaining and useful, too.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jesseliberty.com/2012/07/05/yet-another-podcast-70jim-holmes-automated-testing/"&gt;Yet Another Podcast Episode 70: Jim Holmes &amp;amp; Automated Testing&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/VOjxT62wZBs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/1319572715262266366/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=1319572715262266366" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1319572715262266366" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1319572715262266366" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/VOjxT62wZBs/hear-jim-holmes-talk-testing-with-jesse.html" title="Hear Jim Holmes talk Testing with Jesse Liberty" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/07/hear-jim-holmes-talk-testing-with-jesse.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-8996805886130899231</id><published>2012-06-11T08:03:00.001-04:00</published><updated>2012-06-11T08:03:11.704-04:00</updated><title type="text">Honest Dialog with Stakeholders on Distributed Teams’ Constraints</title><content type="html">&lt;p&gt;My talk on “Effective Distributed Teams” always garners polarized feedback. I get kudos from folks who’ve left with a few new ideas, and I always get one or two evals where I’m skewered for talking too much about the human side of teams and the criticality of working hard, VERY HARD, to ensure you get the right folks on your distributed teams. In my talk I spend nearly 30 minutes at the start focusing on hiring your team members, assembling your team, and dealing with the inevitable issue of offshore workers.&lt;/p&gt;  &lt;p&gt;(If you’re interested, here’s my deck from StarEast.)&lt;/p&gt; &lt;script async class="speakerdeck-embed" data-id="4f90bac591b203001f0037bb" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;  &lt;p&gt;One attendee at my StarEast talk wrote that I was naïve in my assertions about controlling offshore hiring. The same attendee also felt I was unrealistic in my position on working with the stakeholders/business partners to ensure the team has proper time to get tasks done. I’ve been called a lot of things in life, many of which are I earned, but I’m not sure “naïve” and “unrealistic” are labels which stick…&lt;/p&gt;  &lt;p&gt;Here’s why I think it’s absolutely critical for you as a team lead/member to have open and honest dialog with your stakeholders/management/whatever: stakeholders/management/whatever need to understand the risks to the success of their project. They’re putting constraints on your team by asking you to work in a distributed fashion. They’re also potentially putting additional constraints on you by expecting to realize cost savings by using offshore help.&lt;/p&gt;  &lt;p&gt;If they’re putting those constraints on you, then they must be made aware of the impacts of those actions: reduced velocity, and potentially reduced quality of work due to all the things inherent with offshored work. (Differing skills, communication difficulties, cultural differences, and of course timezone barriers.)&lt;/p&gt;  &lt;p&gt;If your team members aren’t working out, regardless of whether they’re direct reports, distributed employees, or offshored subcontractors, then you need to be empowered to change the makeup of that team. That should include having input on changing a business partner relationship and terminating contracts with poorly performing individuals or companies. Be clear: this is NOT an easy effort, nor is it generally a quick one. I’ve never said otherwise. To the contrary, I emphasize it may take months to terminate a relationship with a poorly performing team member or subcontractor.&lt;/p&gt;  &lt;p&gt;The same concept applies to unreasonable expectations around timelines. There’s a huge amount of writing on this topic by folks who are much smarter and wiser than I. The bottom line is you can’t simply accept the situation; you’ve got to ensure some rational discussion happens around scope, effort, and dates. &lt;/p&gt;  &lt;p&gt;You need to make sure you’re clear on what YOU need to flex on too: just because you’re the QA lead doesn’t mean you get to hold up the project until you feel comfortable about quality. Your job is not to be the final voice on shipping or not. Your job is to ensure the stakeholders have a clear picture of the overall quality and risk at any given time. Stakeholders make shipping decisions, not you!&lt;/p&gt;  &lt;p&gt;Again, I’ll repeat myself: these conversations are rarely easy, but you need to have them, and you need to have them earlier in the project versus later. (Actually, these conversations need to happen constantly through a project’s lifecycle.)&lt;/p&gt;  &lt;p&gt;Your project’s stakeholders, believe it or not, really are looking for a project to succeed and help out their bottom line. If something is jeopardizing the project’s success, then they’re going to want to know about the issue. [1] The conversation may not be an easy one to have, and it will likely take several attempts to get clear, but you need to step up to the plate and get the issues out in the open. (You may also find you’re tilting at windmills with management who’s unwilling to support you. In that case, remember you can &lt;i&gt;change&lt;/i&gt; where you work or you can change &lt;i&gt;where&lt;/i&gt; you work.&lt;/p&gt;  &lt;p&gt;I’ve had these conversations a number of times in different organizations and roles. I’ve been part of efforts getting rid of poorly performing workers and subcontractors, and I’ve been part of efforts getting poorly performing workers/subcontractors up to being productive members of our teams. It’s hard work, but it’s worth the effort.&lt;/p&gt;  &lt;p&gt;It’s not naïve or unrealistic to think you can change these bad situations. It’s defeatist to think you can’t. Step up to the plate, do the work. You’ll be happy you did. &lt;/p&gt;  &lt;p&gt;Really.&lt;/p&gt;  &lt;p&gt;[1]Yes, yes, there are rare environments where an organization’s politics are so horrific that management actually looks to sabotage teams and projects. All I can say is that if you’re working in such an environment you’re there by choice. Flee that environment immediately or accept you’re making a choice to stay where you’re at. Leave right now or deal with it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/rbVN9VWdTg4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/8996805886130899231/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=8996805886130899231" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8996805886130899231" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8996805886130899231" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/rbVN9VWdTg4/honest-dialog-with-stakeholders-on.html" title="Honest Dialog with Stakeholders on Distributed Teams’ Constraints" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/06/honest-dialog-with-stakeholders-on.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-9113593706610177766</id><published>2012-06-06T08:00:00.001-04:00</published><updated>2012-06-06T08:00:49.946-04:00</updated><title type="text">Three Day “Lunch &amp; Learn” on Web UI Automation</title><content type="html">&lt;p&gt;Are you looking to start working with web UI automated testing? Are you or your team currently working with functional testing for your web apps, but struggling with writing maintainable, valuable tests? Join me June 26th, 27th, and 28th for a three day series “Getting Started with Web Automated Testing” and I’ll lay out a few pointers to help you through the rough spots.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.telerik.com/automated-testing-tools/blog/12-05-22/webinar-series-getting-started-with-web-ui-automation.aspx"&gt;I’ve written a bit about the series on my blog at Telerik&lt;/a&gt;, but the gist of the series is this: three days of webinars, each lasting 30 – 45 minutes. Through the series you’ll learn about fundamentals for web testing:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;What a web page’s lifecycle looks like, and how automation frameworks monitor that&lt;/li&gt;    &lt;li&gt;The Document Object Model (DOM)&lt;/li&gt;    &lt;li&gt;Understanding how a test framework interacts with the page&lt;/li&gt;    &lt;li&gt;What element locators are, and how it’s critical to carefully choose them&lt;/li&gt;    &lt;li&gt;Dealing with dynamic content like AJAX&lt;/li&gt;    &lt;li&gt;Good test case design&lt;/li&gt;    &lt;li&gt;Good test suite organization&lt;/li&gt;    &lt;li&gt;Backing APIs&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’ll be using Telerik’s Test Studio to work through most of the examples, but the fundamental points apply regardless of whether you’re using WebDriver, Watir, or another commercial tool.&lt;/p&gt;  &lt;p&gt;You can &lt;a href="https://www1.gotomeeting.com/register/904225497"&gt;register here for the series&lt;/a&gt;!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/2vEP9oN1DVc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/9113593706610177766/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=9113593706610177766" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/9113593706610177766" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/9113593706610177766" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/2vEP9oN1DVc/three-day-lunch-learn-on-web-ui.html" title="Three Day “Lunch &amp;amp; Learn” on Web UI Automation" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/06/three-day-lunch-learn-on-web-ui.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-4824950426615707470</id><published>2012-04-24T09:20:00.001-04:00</published><updated>2012-04-24T09:20:27.230-04:00</updated><title type="text">It’s Not About You</title><content type="html">&lt;p&gt;Too often we get hung up on ourselves. PMs, developers, testers, whomever. We forget, or chose to ignore, the critical fact that we (almost always) do our work for someone else: a stakeholder, a customer, a user.&lt;/p&gt;  &lt;p&gt;In a significant number of cases, the person we’re doing our work for may have put their entire career or business on the line. We need to get over ourselves and remember that we’re working to solve a problem, sometimes a crucial one, for those folks.&lt;/p&gt;  &lt;p&gt;Instead of focusing on that, too often we get hung up on the stakeholder’s inability to understand technology (developers), think that we’re the final line of death who decides what ships (QA/testers), or get frustrated when the schedule/scope needs to change (PMs).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://speakerdeck.com/u/jimholmes/p/its-not-about-you"&gt;This deck&lt;/a&gt; is something that’s been noodling around in my head for a long time. I finally got my thoughts to &lt;a href="http://www.fiftythree.com/paper"&gt;Paper&lt;/a&gt; on a new iPad I got for work. It’s not perfect, but it sort of lays out my thoughts on this a bit more clearly. I hope you enjoy it!&lt;/p&gt; &lt;script async class="speakerdeck-embed" data-id="4f95fe6740e6c8001f0008ad" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/HYtR4kXlYrg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/4824950426615707470/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=4824950426615707470" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/4824950426615707470" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/4824950426615707470" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/HYtR4kXlYrg/its-not-about-you.html" title="It’s Not About You" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/04/its-not-about-you.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-8810825039678953514</id><published>2012-04-19T21:32:00.001-04:00</published><updated>2012-04-24T09:28:16.349-04:00</updated><title type="text">My Slides from #StarEast Distributed Test Team Talk</title><content type="html">&lt;p&gt;I’ve uploaded my &lt;a href="http://speakerdeck.com/u/jimholmes/p/effective-distributed-test-teams"&gt;slides from my StarEast talk “Making Distributed Test Teams Work” to Speakerdeck&lt;/a&gt;. This deck is slightly different from the earlier version of the talk. I’ve iterated a few things in the talk and deck based on feedback from the last couple presentations.&lt;/p&gt;  &lt;p&gt;If you were at StarEast and attended the talk, then thanks very much! I think this was the best session I’ve had for this talk, and I really appreciated all the audience interaction – that always makes talks so much better!&lt;/p&gt;  &lt;script async class="speakerdeck-embed" data-id="4f90bac591b203001f0037bb" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/9XK6eQZZZqM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/8810825039678953514/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=8810825039678953514" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8810825039678953514" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/8810825039678953514" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/9XK6eQZZZqM/my-slides-from-stareast-distributed.html" title="My Slides from #StarEast Distributed Test Team Talk" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/04/my-slides-from-stareast-distributed.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-7113648248621687064</id><published>2012-01-09T10:46:00.001-05:00</published><updated>2012-01-09T10:46:01.015-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#31DaysOfTesting" /><title type="text">31 Days of Testing—Hiatus This Week</title><content type="html">&lt;p&gt;No #31DaysOfTesting posts this week. I’m &lt;a href="http://codemash.org"&gt;a mite busy with a few other things&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;More testing stuff starting next Monday!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/-laEQyKOBRA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/7113648248621687064/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=7113648248621687064" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7113648248621687064" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/7113648248621687064" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/-laEQyKOBRA/31-days-of-testinghiatus-this-week.html" title="31 Days of Testing—Hiatus This Week" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/01/31-days-of-testinghiatus-this-week.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-1051610685283059917</id><published>2012-01-06T16:25:00.001-05:00</published><updated>2012-01-06T16:25:33.504-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#31DaysOfTesting" /><title type="text">31 Days of Testing—Day 25: Performance Testing, Part 2</title><content type="html">&lt;p&gt;&lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testing-kickoff.html"&gt;Index to all posts in this series is here&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;My past post laid out some overview and planning issues around performance testing. This post points out what you might be interested in, and lays out some resources I’ve found very useful.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;What do I Monitor?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Figuring out which metrics, measurements, and counters to monitor can be extremely daunting—there are &lt;i&gt;hundreds&lt;/i&gt; of individual counters in Performance Monitor alone! In most cases you don’t need anywhere near the entire set of metrics. A few counters will give us all the information you generally need for starting your performance testing work.&lt;/p&gt;  &lt;p&gt;Most performance testing gurus will tell you just a few items will get you started in good shape:&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;Processor utilization percentage &lt;/li&gt;      &lt;li&gt;ASP.NET requests per second &lt;/li&gt;      &lt;li&gt;SQL Server batch requests per second &lt;/li&gt;      &lt;li&gt;Memory usage (total usage on the server, caching usage) &lt;/li&gt;      &lt;li&gt;Disk IO usage &lt;/li&gt;      &lt;li&gt;Network card IO &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;If you’re doing load testing you’ll likely be interested in errors per second and queued requests. Often times soak or endurance testing will look to counters associated with memory leaks and garbage collection too—these help you understand how your application holds up over a long period of stress. However, those are different scenarios. The few counters mentioned above will get you started in good shape.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Where Can I Learn More?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Microsoft’s “&lt;a href="http://perftestingguide.codeplex.com/"&gt;Performance Testing Guide for Web Applications&lt;/a&gt;” is somewhat older, but remains a tremendous resource for learning about performance testing. It’s an extensive, exhaustive discussion of everything around planning, setting up for, executing, and analyzing results from your performance testing. The guide is freely available on Codeplex.&lt;/p&gt;  &lt;p&gt;Steve Smith of NimblePros in Kent, Ohio, has been extremely influential in my learning about performance testing. Steve’s been appointed by Microsoft as a Regional Director because of his technical expertise in many areas. &lt;a href="http://stevesmithblog.com/"&gt;He blogs extensively&lt;/a&gt; on many software topics and has great practical examples for performance testing. He also has &lt;a href="http://www.pluralsight-training.net/microsoft/courses/tableofcontents?courseName=web-perf"&gt;an online commercial course offered through Pluralsight&lt;/a&gt; that’s well worth checking in to.&lt;/p&gt;  &lt;p&gt;The website &lt;a href="http://performance-testing.org/"&gt;Performance Testing&lt;/a&gt; has a great number of references to performance testing information across the Web. The site lists blogs, articles, training material, and other highly helpful information.&lt;/p&gt;  &lt;p&gt;I’ve recently come across two folks on Twitter who I’ve found a wealth of information from:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://BenSimo.QualityFrog.com/"&gt;Ben Simo&lt;/a&gt;, aka &lt;a href="http://twitter.com/qualityfrog"&gt;Quality Frog&lt;/a&gt;, writes and Tweets extensively about testing, but also talks specifically about performance issues regularly.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://twitter.com/sbarber"&gt;Scott Barber&lt;/a&gt; has &lt;a href="http://scott-barber.blogspot.com/"&gt;an amazing blog&lt;/a&gt; with scads of information on it, plus he Tweets amazingly good reads on a regular basis.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;One of the things Scott Tweeted recently was &lt;a href="http://loadstorm.com/category/web-performance-optimization"&gt;this nice series on web performance optimization&lt;/a&gt;. There’s some tremendously valuable information in its articles.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Go! Get Started!&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Spend some time planning out your performance testing effort. Make sure you work &lt;b&gt;&lt;i&gt;HARD&lt;/i&gt;&lt;/b&gt; to only change one variable at a time. Don’t get flooded with information; more often less information can be more helpful at the start.&lt;/p&gt;  &lt;p&gt;Performance testing is a tremendous asset to your projects, and it can also be an extremely fun, interesting, and rewarding domain to work in.&lt;/p&gt;  &lt;p&gt;Go! Get started!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/S6D2K0WNYBc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/1051610685283059917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=1051610685283059917" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1051610685283059917" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/1051610685283059917" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/S6D2K0WNYBc/31-days-of-testingday-25-performance.html" title="31 Days of Testing—Day 25: Performance Testing, Part 2" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/01/31-days-of-testingday-25-performance.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-2394895845174315090</id><published>2012-01-05T22:48:00.001-05:00</published><updated>2012-01-06T01:21:47.854-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#31DaysOfTesting" /><title type="text">31 Days of Testing—Day 24: Getting Serious About Performance</title><content type="html">&lt;p&gt;&lt;strong&gt;Updated:&lt;/strong&gt; Fixed wrong day # in title. Duh.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testing-kickoff.html"&gt;Index to all posts in this series is here&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;In this post I’d like to cover something that too often gets ignored: performance testing. I thought I’d take some time to lay down some of my opinions and experiences around performance testing in general.&lt;/p&gt;  &lt;p&gt;The phrase “performance testing” can mean a great many things to different people in different scenarios, so covering a few of the different types of tests may be helpful.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Performance Testing&lt;/b&gt; is generally an umbrella term covering a number of different, more complex test environments. I’ve also used the term to describe a very simple set of scenarios meant to provide a baseline for performance regressions.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Load Testing &lt;/b&gt;generally uses a number of concurrent users to see how the system performs and find bottlenecks&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Stress Testing&lt;/b&gt; throws a huge number of concurrent users against your system in order to find “tipping points” – the point where your system rolls over and crashes due to a huge amount of traffic&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Endurance/Soak Testing&lt;/b&gt; checks your system’s behavior over long periods to look for things like degradation, memory leaks, etc.&lt;/p&gt;  &lt;p&gt;Wikipedia’s &lt;a href="http://en.wikipedia.org/wiki/Software_performance_testing"&gt;Software Performance Testing page&lt;/a&gt; has some very readable information on the categories.&lt;/p&gt;  &lt;p&gt;You can also look at performance testing as a slice of your system’s performance. You can use a specific scenario to dive down in to specific areas of your system, environment, or hardware.&lt;/p&gt;  &lt;p&gt;Load, stress, and endurance testing are all that, but turned up to 11. (A reference to Spinal Tap for those who’ve not seen the movie.)&lt;/p&gt;  &lt;p&gt;With that in mind, I generally think of performance testing in two categories: testing to ensure the system meets specified performance requirements, and testing to ensure performance regressions haven’t crept into your system. Those two may sound the same, but they’re not.&lt;/p&gt;  &lt;p&gt;Performance testing to meet requirements means you’ll need lots of detail around expected hardware configurations, baseline datasets, network configurations, and user load. You’ll also need to ensure you’re getting the hardware and environment to support those requirements. There’s absolutely no getting around the need for infrastructure if your customers/stakeholders are serious about specific performance metrics!&lt;/p&gt;  &lt;p&gt;Performance testing to guard against regressions can be a bit more relaxed. I’ve had great successes running a set of baseline tests in a rather skimpy environment, then simply re-running those tests on a regular basis in the exact same environment. You’re not concerned with specific metric datapoints in this situation – you’re concerned about &lt;i&gt;trends&lt;/i&gt;. If your test suite shows a sudden degradation in memory usage or IO contention then you know something’s changed in your codebase. This works fine as long as you keep the environment exactly the same from run to run—which is a perfect segue into my next point.&lt;/p&gt;  &lt;p&gt;Regardless of whether you’re validating performance requirements, guarding against regressions, or flooding your system in a load test designed to make your database server weep, you absolutely must approach your testing with a logical, empirical mindset. You’ll need to spend some time considering your environment, hardware, baseline datasets, and how to configure your system itself. &lt;/p&gt;  &lt;p&gt;Performance testing isn’t something you can slap together and figure out as you go. While you certainly can (and likely will!) adjust your approach as you move through your project, you do indeed need to sit down and get some specifics laid out around your testing effort before you begin working.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;First and foremost: set expectations and goals. &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ensure everyone’s clear on &lt;i&gt;why&lt;/i&gt; you’re undertaking the performance testing project. If you are looking to meet specific metrics for delivering your system then you’ll need to be extremely detailed and methodical in your initial coordination. Does your system have specific metrics you’re looking to meet? If so, are those metrics clearly understood – and more importantly &lt;b&gt;&lt;i&gt;reasonable&lt;/i&gt;&lt;/b&gt;? &lt;/p&gt;  &lt;p&gt;Keep in mind that your customer/stakeholder may be giving you metrics you think are unreasonable, but it may fit business needs of their which you’re unaware of. You have to put in the extra effort to ensure you understand those higher-level needs. &lt;/p&gt;  &lt;p&gt;Your customer may also be giving you vague requirements simply due to their lack of experience or understanding. “We want the page to load fast!” is an oft-heard phrase from stakeholders, but what do they really mean? &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Define your environment&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;If those same metrics are critical to your delivery, then they will also need to be defined based on a number of specific environment criteria such as exact hardware setups, network topologies, etc. These environments should be the same exact environment you recommend to your customers. If you’re telling your system’s users they need a database server with four eight-core CPUs, 32 GB of RAM, and a specific RAID configuration for the storage, then you should look to get that same hardware in place for your testing.&lt;/p&gt;  &lt;p&gt;(A tangential topic: it’s happened more than once that a server and environment acquired for performance testing somehow gets borrowed or time-shared out to other uses. Timesharing your performance environment &lt;b&gt;&lt;i&gt;can&lt;/i&gt;&lt;/b&gt; be a highly effective use of expensive resources, but you’ll need to ensure nothing, &lt;b&gt;&lt;i&gt;absolutely nothing&lt;/i&gt;&lt;/b&gt;, is being utilized on that server once your performance runs start – you have to have dedicated access to the server to ensure your metrics aren’t being skewed by other processes.)&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Agree on baseline data&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Something that’s commonly overlooked is the impact of your system’s baseline dataset on your performance tests. You likely won’t get anything near an accurate assessment of a reporting or data analysis system if you’ve only got ten or thirty rows of data in your database. &lt;/p&gt;  &lt;p&gt;Creating baseline data can be an extremely complex task if your system is sensitive to the “shape” of the data. For example, a reporting system will need its baseline data laid out across different users, different content types, different date patterns.&lt;/p&gt;  &lt;p&gt;Often the easiest route to handle this is to find a live dataset somewhere and use that. I’ve had great success coordinating with users of systems to get their datasets for our testing. You may need to scrub the dataset to clear out any potential sensitive information such as e-mail addresses, usernames, passwords, etc.&lt;/p&gt;  &lt;p&gt;If using a live dataset isn’t an option, you’ll need to figure out tooling to generate that dataset for you.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Determine your usage scenarios&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Talk through the scenarios you want to measure. Make sure you’re looking to measure the most critical scenarios. Your scenarios might be UI driven, or they could be API driven. Steve Smith has a terrific walkthrough of a real world scenario that gives a great example of this.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Set up your tooling&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Once you’ve got a handle on the things I’ve discussed above, look to get your tooling in place. Performance testing utterly relies on an exact, repeatable process. You’ll need to do a large amount of work getting everything set up and configured each time you do a perf run. Avoid doing this work manually; instead, look to tooling to do this for you. You shouldn’t rely on doing the setup manually for two reasons. One: automating setup ensures you’ll cut out any chance of human error. Two: it’s really boring.&lt;/p&gt;  &lt;p&gt;Build servers like Hudson, Team City, or TFS can interface with your source control and get your environment properly configured each time you need to run a perf pass. Scripting tools like PowerShell, Ruby, or even good old command files can handle tasks like setting up databases and websites for you.&lt;/p&gt;  &lt;p&gt;You’ll also need to ensure you’re setting up your tooling to handle reporting of your perf test runs. Make sure you’re keeping all the output data from your runs stored so you can keep track of your trends and history.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Change only one variable at a time. Compare apples to apples!&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;It’s critical you take extraordinary care with the execution of your performance testing scenarios! You need to ensure you’re only changing one variable at a time during your test passes, or you won’t understand the impact of your changes.&lt;/p&gt;  &lt;p&gt;For example, don’t change your database server’s disk configuration at the same time you push a new build to your test environment. You won’t know if performance changes were due to the disk change or code changes in the build itself.&lt;/p&gt;  &lt;p&gt;In a similar vein, ensure no other folks are interacting with the server during your performance run. I alluded to shared servers earlier; it’s great to share expensive servers for multiple uses, but you can’t afford for someone to be running processes of any shape or form while you’re doing your performance passes.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Profiling: Taking the simple route for great information&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;All the work above can seem extraordinarily intimidating. There’s a lot to consider and take in to account when moving through some of the more heavyweight scenarios I laid out in my introductory post.&lt;/p&gt;  &lt;p&gt;That said, you can look to simpler performance profiling as a means to get great insight in to how your application is behaving. Profiling enables you to use one scenario, or a very small set, and see in a slice how your application’s behaving. Depending on the tooling you can see results of performance back to the browser, dive in to performance metrics on the server (think CPU or disk usage, for example). You may even be able to dig down in to the application’s codebase to see detailed metrics around specific components of the system. &lt;/p&gt;  &lt;p&gt;Profiling is a great way to start building a history of your application’s performance. You can run regular profiling tests and compare the historical performance to ensure you’re not ending up with performance regressions.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Start small, start smart&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;As you’ve seen in this post, performance testing can be particularly complex when you’re looking to ensure high performance, reliability, and scalability. You need to approach the effort with good planning, and you need to ensure you’re not changing variables as you move through the testing.&lt;/p&gt;  &lt;p&gt;Make sure your performance efforts get you the information you need. Start with small environments and scenarios, ensure you’ve clearly laid out your goals and expectations, and keep a careful eye out as you’re running your tests.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/EVDpD_r35fc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/2394895845174315090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=2394895845174315090" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/2394895845174315090" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/2394895845174315090" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/EVDpD_r35fc/31-days-of-testingday-22-getting.html" title="31 Days of Testing—Day 24: Getting Serious About Performance" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/01/31-days-of-testingday-22-getting.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-2279784650389916361</id><published>2012-01-04T13:05:00.001-05:00</published><updated>2012-01-04T15:19:41.941-05:00</updated><title type="text">31 Days of Testing—Day 23: Acceptance Tests &amp; Criteria in the Real World</title><content type="html">&lt;p&gt;&lt;strong&gt;UPDATED:&lt;/strong&gt; I goofed and Andy caught it, thankfully. They’re using &lt;em&gt;Watir&lt;/em&gt;, not &lt;em&gt;WatiN&lt;/em&gt; in their work. I knew that and still fat-fingered the post. Fixed!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testing-kickoff.html"&gt;Index to all posts in this series is here&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;Today’s post is by &lt;a href="http://twitter.com/#!/andrewvida"&gt;Andrew Vida&lt;/a&gt;, another smart pal in the Heartland region. I’ve chatted with Andy a number of times at various conferences, and I’ve enjoyed hearing about the work he and &lt;a href="http://twitter.com/#!/bramhaghosh"&gt;Bramha Ghosh&lt;/a&gt; do at Grange Insurance in Columbus, OH. &lt;/p&gt;  &lt;p&gt;We three have spent a pretty good amount of time moaning about our shared pain in getting great, reliable, valuable functional test suites in place. Andy and Bramha are working in Ruby and Watir, but their issues are my issues are the same issues seen in any technology: dealing with data, environments, timing, and of course the inevitable hardest part: “soft” problems in ensuring clarity of communication between folks on the project team.&lt;/p&gt;  &lt;p&gt;Andy offered up the following article for my series based on the work they’ve done trying to get a smooth flow around well-defined acceptance criteria. This is a perfect follow on to &lt;a href="http://frazzleddad.blogspot.com/2012/01/31-days-of-testingday-22-why.html"&gt;yesterday’s post by Jon Kruger&lt;/a&gt;!&lt;/p&gt;  &lt;hr /&gt;  &lt;h3&gt;Using Acceptance Tests to Define Done&lt;/h3&gt;  &lt;p&gt;Have you ever been on a team and was asked &amp;quot;What is the definition of done?&amp;quot;&amp;#160; You respond by saying, &amp;quot;When all of your automated tests pass, and there are no bugs, then you have satisfied the acceptance criteria.&amp;#160; Done!&amp;quot;&amp;#160; Which then is responded to by &amp;quot;Well, how do I define the acceptance criteria?&amp;quot; Good question!&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Understanding the Feature&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;First things first - you have to understand what feature you'll be building. Building the right product and building the product right takes communication and collaboration between your product owner and your team.&lt;/p&gt;  &lt;p&gt;The reason for all of the collaboration is that we're trying to build a shared understanding of what needs to be done and also produce examples that are easy to maintain. There are many ways to work collaboratively and ultimately, you have to decide what works best for your team. &lt;/p&gt;  &lt;p&gt;The team I'm currently on has found that smaller workshops work best for us. Those workshops, otherwise known as &amp;quot;Three Amigos&amp;quot;, include a business analyst, a developer and a tester who share a similar understanding of the domain.&lt;/p&gt;  &lt;p&gt;Lets hypothetically say you're discussing a shopping cart feature for your site.&amp;#160; Start by defining the goals of this feature. By starting with the goal, you'll let everyone know why they're spending their time on implementing the feature.&amp;#160; If you can't come up with a good reason why, then maybe the product owner is wasting everyone's time.&amp;#160; &lt;/p&gt;  &lt;p&gt;We've used the Feature Injection template from Chris Matts and Liz Keogh to help us successfully describe why:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;As a&lt;/b&gt; &amp;lt;type of stakeholder&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; I want&lt;/b&gt; &amp;lt;a feature&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;So that&lt;/b&gt; &amp;lt;I can meet some goal&amp;gt;&lt;/p&gt;  &lt;p&gt;Here's our feature description:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;As an online shopper&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;I want to add items to my shopping cart&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;So that I can purchase them&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;Determining Acceptance Criteria&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Next, your team needs to determine what the system needs to do to meet those goals-the Acceptance Criteria. &lt;/p&gt;

&lt;p&gt;In your Three Amigos meeting, be sure to ask questions to clear up assumptions, such as &amp;quot;Are there any products that cannot be purchased online?&amp;quot; or &amp;quot;Does the shopper need to be authenticated to purchase?” &lt;/p&gt;

&lt;p&gt;Remember, the scope of feature should be high level as we only want to identify &lt;b&gt;&lt;i&gt;what &lt;/i&gt;&lt;/b&gt;the application needs to do and not &lt;b&gt;&lt;i&gt;how&lt;/i&gt;&lt;/b&gt; it's implemented. Leave that part to the people that know how to design software. It was determined by the team that the following are in scope:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Only authenticated shoppers can add items to the shopping cart. &lt;/li&gt;

  &lt;li&gt;Cannot add refrigerators to shopping cart. &lt;/li&gt;

  &lt;li&gt;Only 25 items can be added. &lt;/li&gt;

  &lt;li&gt;Shopper can remove items from shopping cart. &lt;/li&gt;

  &lt;li&gt;Shopper can change quantity of items after adding it to the cart. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hey, now we have some acceptance criteria!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Acceptance Criteria lead to Acceptance Tests&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We've used communication and collaboration to determine why a feature is necessary and what the system needs to do to at a high level, so now we can come up with some examples to test our acceptance criteria.&lt;/p&gt;

&lt;p&gt;To do this, we'll write some Cucumber scenarios.&amp;#160; We've chosen Cucumber for all of the reasons mentioned in &lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testingday-15-cucumber-is.html"&gt;Tim Wingfield's post on Day 15&lt;/a&gt;. If you haven't read it, go back and check it out.&amp;#160; It's an excellent post on the benefits of employing Cucumber.&lt;/p&gt;

&lt;p&gt;Here are a few scenarios that were created:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Given the shopper is a guest&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;When they try to add an item to their shopping cart&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Then they will receive the error &amp;quot;Only authenticated shoppers can add items to their shopping cart&lt;span style="color: #ff0000"&gt;.&lt;/span&gt;&amp;quot;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Given an authenticated shopper&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;When they click the &amp;quot;Add Item to Cart&amp;quot; button&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Then they will have an item in their shopping cart&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&amp;#160;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Given an authenticated shopper with an item in their shopping cart&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;When they click the &amp;quot;Remove Item&amp;quot; button&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;Then that item is no longer in their shopping cart&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;These are only a few of the examples that were developed as part of the Three Amigos meeting.&amp;#160; On our team, the output of the Three Amigos is a Cucumber feature file.&amp;#160; We now have a shared understanding and a definition of done!&amp;#160; We can pass on our failing acceptance tests to the Dev team to begin their work.&amp;#160; They will begin by creating failing unit tests and writing enough code to make them pass.&amp;#160; Once they are passing, they can then run the acceptance tests.&amp;#160; Once those are passing then the feature is complete.&amp;#160; We're done!&amp;#160; Those acceptance tests will be added to the regression suite to be ran anytime to ensure that the feature remains done.&amp;#160; Now the feature can be demonstrated to the product owner at the next review.&amp;#160; &lt;/p&gt;

&lt;p&gt;What we've just done is taken a trip around the Acceptance Test Driven Development cycle.&amp;#160; Just remember, it's not about the tools or the technology, but rather the communication and collaboration.&amp;#160; Our ultimate goal is to deliver high quality software that functions as the product owner intended.&amp;#160; By including QA in the entire process, we can eliminate many of the problems that plague us earlier so that they don't make it to production.&amp;#160; Quality is not just a QA function, it's a team function.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/qwnMjTCR6As" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/2279784650389916361/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=2279784650389916361" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/2279784650389916361" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/2279784650389916361" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/qwnMjTCR6As/31-days-of-testingday-23-acceptance.html" title="31 Days of Testing—Day 23: Acceptance Tests &amp;amp; Criteria in the Real World" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/01/31-days-of-testingday-23-acceptance.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-6303121038657628668</id><published>2012-01-03T12:19:00.001-05:00</published><updated>2012-01-03T12:49:58.847-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#31DaysOfTesting" /><title type="text">31 Days of Testing—Day 22: Why Collaboration Matters (A Real World Example)</title><content type="html">&lt;p&gt;&lt;strong&gt;Updated:&lt;/strong&gt; &lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testing-kickoff.html"&gt;Index to all posts in this series is here&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;Today’s post is reposted from &lt;a href="http://jonkruger.com/"&gt;Jon Kruger’s blog&lt;/a&gt;. Jon is a tremendously smart, passionate indie working out of Columbus, Ohio. I was lucky enough to work with Jon some years back, and I’ve always had great regard for his views and thoughts.&lt;/p&gt;  &lt;p&gt;Jon’s post today really hit home for me because it’s all about communication and collaboration &lt;strong&gt;&lt;em&gt;early &lt;/em&gt;&lt;/strong&gt;in the cycle. I can’t jump up and down enough about how critical this is--and Jon’s post is a real-world example of why it’s so important.&lt;/p&gt;  &lt;p&gt;I read Jon’s blog this morning and immediately pinged him on IM to see if he’d let me drop his article in to my #31DaysOfTesting series. Thankfully he agreed!&lt;/p&gt;  &lt;p&gt;Follow &lt;a href="http://twitter.com/jonkruger"&gt;Jon on Twitter&lt;/a&gt;, and definitely bookmark or subscribe to his blog. Lots of great stuff in both spots!&lt;/p&gt;  &lt;hr /&gt;  &lt;h3&gt;Just Another Run of the Mill Wednesday&lt;/h3&gt;  &lt;p&gt;On my current project, we release every 2 weeks. We do the push to production on Saturday, so we set a deadline of Wednesday night for everything to be developed and tested so that we can have two days for demos and UAT. &lt;/p&gt;  &lt;p&gt;I remember a certain Wednesday a couple of months ago where things were chaotic to say the least. We looked at the board on Wednesday in the early afternoon and there were 20 items where testing was not complete. We were running around trying to make sure that everything got tested. The entire development team was helping out with testing. Many people stayed past dinnertime to get everything done.&lt;/p&gt;  &lt;p&gt;This past Wednesday was much different. Everyone was very relaxed. There was only one item on the board that was still being tested. We were all working on getting stuff ready for the next iteration. And oh by the way, one of the QA testers was out on vacation and another one had been moved to another project.&lt;/p&gt;  &lt;p&gt;I immediately thought back to that chaotic Wednesday a few months ago and thought about everything that has happened since then. We certainly had come a long way to get to the point where things were much more relaxed. So what happened?&lt;/p&gt;  &lt;h5&gt;The Three Amigos&lt;/h5&gt;  &lt;p&gt;Before development can start on a feature, we have a “three amigos” meeting where developers, business analysts, and QA people get together and decide on the acceptance criteria for the feature. This helps us all get on the same page and make sure that we know what we’re building. It also gets the QA team involved very early in the process, so when it comes time for them to manually test the feature, they already know it inside out.&lt;/p&gt;  &lt;h5&gt;Automating acceptance tests&lt;/h5&gt;  &lt;p&gt;The outcome of the three amigos meeting is acceptance criteria. Developers take these and automate them whenever possible (we use a combination of unit tests and acceptance tests using SpecFlow). The development workflow now looks something like this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Work with the QA team to write out the acceptance tests in SpecFlow &lt;/li&gt;    &lt;li&gt;Develop all of the components needed to make the feature work, writing unit tests along the way &lt;/li&gt;    &lt;li&gt;Try and get the acceptance tests to pass, fixing any problems we find along the way &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;When I’m working on the “try and get the acceptance tests to pass” phase, I’m going to find pretty much all of the coding errors that we made during development. The development ticket is still marked as “In Development” at this point, which is very important. We all take quality seriously, both QA testers and developers. I’m not going to hand it over to be tested by the QA team until I can get all of the acceptance tests to pass. &lt;/p&gt;  &lt;h5&gt;Almost no bugs&lt;/h5&gt;  &lt;p&gt;Because we knew what we were building up front and because we automated pretty much all of the testing, the QA team is finding very few bugs in the new features that we’re developing. One of our testers brought this up in our retrospective this past week and mentioned how they got everything tested so much faster because they weren’t finding bugs, writing up bugs, waiting for bugs to be fixed, and retesting bug fixes. &lt;/p&gt;  &lt;p&gt;We had looked at the schedule earlier in the week and we had thought that developers might have to help out with testing because one of the testers was on vacation and they had some items to test that we thought would take a long time. In the end, no developers had to help with testing and testing got done ahead of schedule! &lt;/p&gt;  &lt;p&gt;Everyone talks about how bugs are a waste of time, how they slow you down, etc., but it was really cool to see it play out. Yeah, getting those acceptance tests to pass takes a little extra time, but now I can hand a completed feature over to QA and have a good chance of not having any bugs. We had two developers working for a week on the feature that we completed, and we did it with no bugs. Not only that, we have automated acceptance tests that will do our regression testing for us. &lt;/p&gt;  &lt;h5&gt;Recap&lt;/h5&gt;  &lt;p&gt;A lot of the changes that we’ve made seem to be relatively minor, but they’ve produced huge dividends. Much of it comes down to discipline, not cutting corners, communicating effectively, and taking pride in your work. I’m really excited about what we’re going to be able to do from here and I expect to have even more stories to tell in the near future. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/-rU522kGUb4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/6303121038657628668/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=6303121038657628668" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/6303121038657628668" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/6303121038657628668" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/-rU522kGUb4/31-days-of-testingday-22-why.html" title="31 Days of Testing—Day 22: Why Collaboration Matters (A Real World Example)" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2012/01/31-days-of-testingday-22-why.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-10748614.post-4865631582653662484</id><published>2011-12-28T01:20:00.001-05:00</published><updated>2011-12-28T01:20:48.552-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="#31DaysOfTesting" /><title type="text">31 Days of Testing—Day 21: Data Driving Your Functional Tests</title><content type="html">&lt;p&gt;&lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testing-kickoff.html"&gt;Index to all posts in this series is here&lt;/a&gt;!&lt;/p&gt;  &lt;p&gt;This post shouldn’t be confused with Seth’s awesome post he lent me on &lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testingday-17-rules-for.html"&gt;Rules for Effective Data-Driven Tests&lt;/a&gt;. He was talking about testing interactions with the database. This post will show you how to push sets of data through a functional test.&lt;/p&gt;  &lt;p&gt;This post’s examples are in C# with Selenium. If you’d like to see how the same test rolls in &lt;a href="http://www.telerik.com/automated-testing-tools.aspx"&gt;Test Studio&lt;/a&gt;, please go check out the short video I recorded on &lt;a href="http://tv.telerik.com/watch/automated-testing-tools/ajax-data-driving-dynamically-loaded-elements"&gt;Data Driving Dynamically Loaded Elements&lt;/a&gt; for Telerik TV.&lt;/p&gt;  &lt;p&gt;I’m going to refer back to the post I wrote on &lt;a href="http://frazzleddad.blogspot.com/2011/12/31-days-of-testingday-13-functional.html"&gt;day 13: Functional Test 201 (Common Problems)&lt;/a&gt;, specifically, case 3 where the elements you are working with are loaded up in the DOM, but have no content. That example used the &lt;a href="http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx"&gt;ASP.NET AJAX Cascading Drop Down site&lt;/a&gt;. Feel free to go explore the original post and AJAX site if you need to refresh yourselves. I’ll wait.&lt;/p&gt;  &lt;p&gt;The example site I used offers up three option lists (make, model, color) and gives you a matrix of combinations to deal with. Writing up separate test scripts for each combination would be insanity, so let’s not. Instead, we’ll create a list of items to pass through one test, and iterate that test repeatedly through the list.&lt;/p&gt;  &lt;p&gt;First off, I’ve refactored the original example from day 13 to make it more modular and readable. Day 13 worked for an elementary example, but let’s move on to something more real-world-ish. Here’s the crux of the new test:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt; &lt;strong&gt;Test: Working_with_no_content_data_driven&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Working_with_no_content_data_driven()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     IList&amp;lt;Car&amp;gt; cars = CarFactory.Return_three_valid_cars();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     browser.Navigate().GoToUrl(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color: #006080"&gt;&amp;quot;http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     WebDriverWait wait = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WebDriverWait(browser, TimeSpan.FromSeconds(10));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (Car car &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; cars)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         browser.Navigate().Refresh();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         Select_make(car, wait);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         Select_model(car, wait);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         Select_color(car, wait);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         Validate_message(car, wait);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;First I’m using a factory to build a list of three cars. Here’s what that looks like:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt; &lt;strong&gt;Class: CarFactory&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CarFactory&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IList&amp;lt;Car&amp;gt; Return_three_valid_cars()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Car&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Car { Make = &lt;span style="color: #006080"&gt;&amp;quot;Acura&amp;quot;&lt;/span&gt;, Model = &lt;span style="color: #006080"&gt;&amp;quot;Integra&amp;quot;&lt;/span&gt;, Color = &lt;span style="color: #006080"&gt;&amp;quot;Sea Green&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;                 Message = &lt;span style="color: #006080"&gt;&amp;quot;Sea Green Acura Integra&amp;quot;&lt;/span&gt; },&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Car { Make = &lt;span style="color: #006080"&gt;&amp;quot;Audi&amp;quot;&lt;/span&gt;, Model = &lt;span style="color: #006080"&gt;&amp;quot;S4&amp;quot;&lt;/span&gt;, Color = &lt;span style="color: #006080"&gt;&amp;quot;Metallic&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;                 Message = &lt;span style="color: #006080"&gt;&amp;quot;Metallic Audi S4&amp;quot;&lt;/span&gt; },&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Car { Make = &lt;span style="color: #006080"&gt;&amp;quot;BMW&amp;quot;&lt;/span&gt;, Model = &lt;span style="color: #006080"&gt;&amp;quot;7 series&amp;quot;&lt;/span&gt;, Color = &lt;span style="color: #006080"&gt;&amp;quot;Brown&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;                 Message = &lt;span style="color: #006080"&gt;&amp;quot;Brown BMW 7 series&amp;quot;&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         };&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here I’m simply creating a list of Cars right in the method. This factory method could just as easily reach out to a database, read from an Excel file, etc., etc. The point being, the test itself has no idea what the data source is—&lt;strong&gt;&lt;em&gt;and that’s exactly how it should be!&lt;/em&gt;&lt;/strong&gt; Hiding the data source in the Factory lets me change the source as needed without impacting any of the tests which rely on that Factory.&lt;/p&gt;

&lt;p&gt;Here’s the inspiring Car class:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt; &lt;strong&gt;Class: Car&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Car&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Make { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Model { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Color { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Message { get; set; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Back to the actual test now!&lt;/p&gt;

&lt;p&gt;Lines 6-8 navigate to the site and set up our wait, quite similarly to day 13’s example.&lt;/p&gt;

&lt;p&gt;Lines 10-18 let us iterate through our list of Cars. If you’re working in Python, Java, Ruby, or some other platform then obviously things will look different. The idea is we loop through our cars and run the same test each time.&lt;/p&gt;

&lt;p&gt;Note that line 12 explicitly refreshes the browser each time through. Because we’re pulling data back from service calls, I’ve found the page DOM can hold old contents around. Refreshing each iteration ensures I have exactly the DOM I expect to work with.&lt;/p&gt;

&lt;p&gt;Line 14, Select_make() calls a newly extracted method to interact with the page’s drop down for Make.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Select_make(Car car, WebDriverWait wait)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     var listOfMakes = browser.FindElement(By.Id(&lt;span style="color: #006080"&gt;&amp;quot;ctl00_SampleContent_DropDownList1&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     wait.Until&amp;lt;IWebElement&amp;gt;((d) =&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; d.FindElement(By.XPath(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;                                       &lt;span style="color: #006080"&gt;&amp;quot;id('ctl00_SampleContent_DropDownList1')/option[text()='&amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;                                       car.Make + &lt;span style="color: #006080"&gt;&amp;quot;']&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     });&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     var makeOptions = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SelectElement(listOfMakes);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     makeOptions.SelectByText(car.Make);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This works exactly the same as described in the previous post: get the drop down list, wait until its contents populate with the desired make for this iteration. I’m passing in the Car class here, which as I’m writing this makes me realize I should instead be passing in only the Make property from the Car, not the entire Car. Select_make shouldn’t have to know how to deal with a Car, only with what it expects to.&lt;/p&gt;

&lt;p&gt;Enough ponderings on software design for now. I’ll refactor later.&lt;/p&gt;

&lt;p&gt;The calls to Select_model() and Select_color() work in exactly the same fashion:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Select_model(Car car, WebDriverWait wait)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     var listOfModels = browser.FindElement(By.Id(&lt;span style="color: #006080"&gt;&amp;quot;ctl00_SampleContent_DropDownList2&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     wait.Until&amp;lt;IWebElement&amp;gt;((d) =&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; d.FindElement(By.XPath(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;                                       &lt;span style="color: #006080"&gt;&amp;quot;id('ctl00_SampleContent_DropDownList2')/option[text()='&amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;                                       car.Model + &lt;span style="color: #006080"&gt;&amp;quot;']&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     });&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     var modelOptions = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SelectElement(listOfModels);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     modelOptions.SelectByText(car.Model);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Select_color(Car car, WebDriverWait wait)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;     var listOfColors = browser.FindElement(By.Id(&lt;span style="color: #006080"&gt;&amp;quot;ctl00_SampleContent_DropDownList3&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     wait.Until&amp;lt;IWebElement&amp;gt;((d) =&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; d.FindElement(By.XPath(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;                                       &lt;span style="color: #006080"&gt;&amp;quot;id('ctl00_SampleContent_DropDownList3')/option[text()='&amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;                                       car.Color + &lt;span style="color: #006080"&gt;&amp;quot;']&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;     });&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;     var colorOptions = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SelectElement(listOfColors);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;     colorOptions.SelectByText(car.Color);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Now for the validation which checks that the expected message is correctly displayed:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Validate_message(Car car, WebDriverWait wait)&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     var messageActual = wait.Until&amp;lt;IWebElement&amp;gt;((d) =&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; d.FindElement(By.XPath(&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;                                       &lt;span style="color: #006080"&gt;&amp;quot;id('ctl00_SampleContent_Label1')[contains(.,'&amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;                                       car.Message + &lt;span style="color: #006080"&gt;&amp;quot;')]&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     });&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     Assert.IsTrue(messageActual.Text.Contains(car.Message), &lt;span style="color: #006080"&gt;&amp;quot;Message: &amp;quot;&lt;/span&gt; +&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;                                                             messageActual.Text);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The XPath in this method uses the “contains” function to check contents under the element pointed to by id ct100_SampleContent_Label1. I don’t check for an exact match—I only want to check that the message property’s contents for the current car are somewhere in that element.&lt;/p&gt;

&lt;p&gt;There you have it: a simple data driven example for your functional test. Key takeaway: Construct your actual data list behind some sort of façade, be it a Factory or some other equivalent. Never let your tests themselves be responsible for constructing the data list. This ensures you’ll always have the easy flexibility to change how the data is built, where it’s built from, what it looks like, etc.&lt;/p&gt;

&lt;p&gt;I should also point out that, as with all my examples, I’m not making use of the Page Object pattern. My examples here are all very linear with locators defined right in the tests. Why am I not using Page Objects for you to read? Two reasons. First, the examples are long enough and I’m trying to keep things fairly simple. Secondly, quite frankly I’ve not worked with it enough to be confident in showing you proper examples. Go do your own research on it, get to know it, and decide if it’s a sensible path for you to follow.&lt;/p&gt;

&lt;p&gt;If you’re interested, you can find the complete source for this example (and the ones from Day 13) in &lt;a href="https://github.com/jimholmes/TestStudioDemos/tree/master/31Days-FunctionalTestIntro"&gt;my GitHub repository&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div class="lqm_ad" lqm_publisher="lqm.frazzleddad.site" lqm_zone="ron" lqm_format="125x125" lqm_tgs="HTML5%2cWeb%2cAgile%2cALM%2cVS2010%2cSharePoint%2cWPF%2cXML%2cSilverlight%2cTesting%2cTFS%2cMVC%2cAJAX%2c"&gt;&lt;/div&gt;
&lt;script type='text/javascript' language='Javascript' src='http://s1.lqcdn.com/m.min.js?dt=2.3.110104.1'&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Frazzleddad/~4/kCPbzRBs6MU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://frazzleddad.blogspot.com/feeds/4865631582653662484/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=10748614&amp;postID=4865631582653662484" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/4865631582653662484" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/10748614/posts/default/4865631582653662484" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Frazzleddad/~3/kCPbzRBs6MU/31-days-of-testingday-21-data-driving.html" title="31 Days of Testing—Day 21: Data Driving Your Functional Tests" /><author><name>Jim Holmes</name><uri>http://www.blogger.com/profile/05869146736565695900</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="28" height="32" src="http://3.bp.blogspot.com/_LOCL59IyTaA/Spykv6_NRpI/AAAAAAAAAAM/S2ZeQAzrL5o/s1600-R/3853180914_14858ae15f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://frazzleddad.blogspot.com/2011/12/31-days-of-testingday-21-data-driving.html</feedburner:origLink></entry></feed>
