<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Jason Barile - Testing Testing</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/jasonba/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/jasonba/feed.xml</link>
    <description>Discussions about Software Testing</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:02:12 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>What's Your Problem?</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/whats-your-problem</link>
      <pubDate>Mon, 22 Oct 2012 10:01:36 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2012/10/22/whats-your-problem/</guid>
      <description><![CDATA[It sounds obvious enough, but time after time I see testers in particular taking action before...]]></description>
      <content:encoded><![CDATA[<p>It sounds obvious enough, but time after time I see testers in particular taking action before they've clearly identified what their end goal is or worse, what problem they're trying to solve. &nbsp;I'm guilty of it myself, I'm afraid to admit! &nbsp;Maybe it's a personality trait of people who naturally gravitate towards testing, or maybe it's just a pet peeve that I've started growing more aware of recently.</p>
<p>As testers, we're often incredibly busy with the wide variety of work we do (spec feedback, test plan writing, bug-finding, automation writing &amp; run analysis, etc.). &nbsp;In fact, we're often so busy that when new work comes up,&nbsp;it's incredibly tempting to fall back on patterns that have brought us success in the past without thinking through whether or not the actual problem or situation surrounding the problem has changed. &nbsp;</p>
<p>However, the fact that we're so busy is <em>exactly why</em> we should take a moment to make sure we're not doing unnecessary work or worse, causing unnecessary work for others! &nbsp;</p>
<p>Even if the problem <em>sounds</em> similar to something you've solved in the past, taking just a couple of minutes to answer the following questions can literally save hours for you or your co-workers:</p>
<ul>
<li>Can you clearly state the <strong>problem</strong>&nbsp;you're solving in 15 words or less? &nbsp;&nbsp;</li>
<ul>
<li>e.g. "We do not know if we have enough QA capacity for this sprint."</li>
</ul>
<li>Can you clearly state the goal you're trying to reach? &nbsp;&nbsp;</li>
<ul>
<li>e.g. - "Ensure our team is appropriately staffed for the QA work required in this sprint."</li>
</ul>
<li>Can you separate out <strong>actions&nbsp;</strong>from your <strong>end goal</strong>? &nbsp;</li>
<ul>
<li>e.g. "Discuss options with feature stakeholders" is an <em>action</em> towards solving the problem "Stakeholders are not all in agreement on the strategy for ensuring the new Whizbang Feature ships with high quality" or the goal "Stakeholders are all in agreement on our testing strategy"</li>
</ul>
</ul>
<div>Like I said, it sounds simple, but you might find that it actually takes a bit of practice to tease apart problem statements from goals from actions. &nbsp;Give it a try... I hope it helps!</div>
<div></div>]]></content:encoded>
    </item>
    <item>
      <title>Basic Instincts</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/basic-instincts</link>
      <pubDate>Wed, 08 Feb 2012 21:55:41 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2012/02/08/basic-instincts/</guid>
      <description><![CDATA[I was involved in a conversation today that started something like this:  Team X:&#160; “Feature Y...]]></description>
      <content:encoded><![CDATA[<p>I was involved in a conversation today that started something like this:</p>  <p>Team X:&#160; “Feature Y is completely broken, but we don’t want to fix it because we don’t think any users will actually use it this way.”</p>  <p>My first instinct was, “Are you crazy?&#160; The fix is so easy and low risk!&#160; Of course you should fix it!”&#160; After all, if we as testers can help our teams validate fixes with high confidence, why wouldn’t we?</p>  <p>My first instinct was <em>dead wrong</em>.</p>  <p>This is a trap I still occasionally fall into, admittedly.&#160; But it’s a dangerous one that can have repercussions long after the decision is made.&#160; Essentially, my first instinct would have signed up Team X to spend the next decade supporting, manually testing, automation testing, statically analyzing, re-testing, servicing, and likely re-engineering several times a feature that <em>nobody would ever use</em>.</p>  <p>In cases like this, the right question to ask is “why is that feature even in the product?”&#160; If you wouldn’t fix a bad bug in a given feature, then why bother building that feature in the first place?</p>  <p>As testers, we need to change our basic instincts from “fix every bug” to “what’s in it for the user?”&#160; If we aren’t getting enough value for the long-term cost of building and maintaining the feature, we should negotiate to get those features removed from our products.&#160; </p>  <p>Complexity leads to cost, cost leads to fatigue, fatigue leads to shortcuts, shortcuts lead to holes, holes lead to dark places you don’t want to find yourself in, lest you be eaten by a Grue.</p>]]></content:encoded>
    </item>
    <item>
      <title>Canaries and Scouts in Software Testing</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/canaries-and-scouts-in-software-testing</link>
      <pubDate>Mon, 18 Jul 2011 09:00:37 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2011/07/18/canaries-and-scouts-in-software-testing/</guid>
      <description><![CDATA[In software testing, what you don’t know is often your biggest risk.  As smart as we think we all...]]></description>
      <content:encoded><![CDATA[<p>In software testing, what you <em>don’t</em> know is often your biggest risk.</p>  <p>As smart as we think we all are, no reasonable amount of brainstorming and careful test planning can discover all possible tests that should be put in place for a given system.&#160; Even for seemingly simple systems, “test space” can be huge.&#160; I say “reasonable”, because at some point every test planning process, you cross the cost/benefit threshold where further planning approaches pure guesswork as to what will actually pay off.</p>  <p>So what do you do next?&#160; As an alternative to exhaustive brainstorming, consider using “<strong>canaries</strong>” and “<strong>scouts</strong>” in your testing to help you quickly discover which parts of uncharted test space are worth venturing into.</p>  <p>The term “canaries” comes from the old practice of placing canaries in cages in underground mines.&#160; Birds’ bones are hollow, and what they breathe permeates their entire body nearly immediately.&#160; Unfortunately for the canaries, this made them a great early-warning system for miners.&#160; If dangerous gas was present in a mine, the canary would breathe it in and would quickly die, and the miners would be alerted to leave the area as fast as possible.</p>  <p>In software testing, canaries are mechanisms that provide an early indication of impending problems.&#160; They can take any number of forms, and they don’t have to be automated.&#160; For example, getting a couple of customer bug reports around the same issue can warn you that you have a test hole in a scenario that’s more common than you thought.&#160; An automated canary might look like a set of automated Pri0 integration tests that runs on every daily build before anyone else picks it up for deeper testing. If any of the tests fail, it’s a good sign that the build has major flaws and shouldn’t be evaluated further. </p>  <p>“Scouts” venture forth into uncharted territory looking for something interesting to report back.&#160; It could be an “all clear” report, or it could be along the lines of “danger approaching – to the battle stations!”.&#160; I consider automated exploratory tests using real-world data to be scouting tests. For example, tests that leverage actual customer documents or databases can help you discover test holes around specific data even if you have great code coverage for your system under test.&#160; Beta testers are also great scouts.</p>  <p>In summary, canaries alert you to impending danger, and scouts forge ahead to help you decide where to look next.&#160; Both are invaluable in the testing process.&#160; </p>  <p>So what canaries and scouts are you using?</p>]]></content:encoded>
    </item>
    <item>
      <title>Don’t Assume If Something Worked Once, It’ll Work Again</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/dont-assume-if-something-worked-once-itll-work-again</link>
      <pubDate>Tue, 12 Jul 2011 08:19:25 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2011/07/12/dont-assume-if-something-worked-once-itll-work-again/</guid>
      <description><![CDATA[My team discovered a bug recently that had been around in our daily builds a while.&#160; We did a...]]></description>
      <content:encoded><![CDATA[<p>My team discovered a bug recently that had been around in our daily builds a while.&#160; We did a retrospective after the fact and found some interesting facts.&#160; We had a test case covering the scenario, and it had been passing with no problems over the past several weeks.&#160; There were no bugs in the test automation – it reliably did exactly what we wanted it to do.&#160; The scenario even had 100% code coverage via test automation.</p>  <p>So what went wrong?</p>  <p>The problem was that running the scenario once worked fine, but it left behind some side-effects in the system that caused it to fail it you executed the scenario again.&#160; So the next time you ran it (and every time after that), the user was presented a nice unhandled exception message rather than completing the task they were attempting.</p>  <p>How did we find the bug?&#160; Since the daily build had passed initial tests, one of our engineers picked it up to do some “real world” exploratory testing.&#160; As soon as he tried to do something “real” with the build, he quickly ran into the problem.&#160; This scenario was one that any real user would almost certainly execute multiple times under normal operating conditions.</p>  <p>So how could we have found this bug sooner?&#160; I’d like to say we discovered some key indicator in our retrospective that should have warned us we had a hole, but the truth is the scenario was covered well and passed the sniff test.&#160; What was missing was an automated repetition test.&#160; As our real world testing illustrated, this was a “high repetition” type of scenario.&#160; We should have had a test in place ensuring that the scenario worked reliably over and over.&#160; This particular scenario was difficult to automate because it actually required two computers.&#160; That’s not impossible, and in fact a task for adding that automation was on our backlog.&#160; However, the fact that we had a highly repetitive user scenario that wasn’t automated should have been our indicator to focus on the scenario with manual testing more frequently until we had the automation in place.&#160; It turned out that a simple tweak to our existing automation was all it took to put this test in place. As an added bonus, we can now also use this automated test as a canary for finding memory leaks and performance degradation issues over time.</p>  <p>Obviously this isn’t the only way to catch this type of bug.&#160; Additional code reviews and pre-commit unit tests might have also helped.&#160; But the code <em>was</em> code reviewed, and our unit tests also had high code coverage for this scenario. So this was the next most obvious and easiest way for us to ensure the right coverage. </p>  <p>So, next time you’re scratching your head thinking of ways to find more bugs in your system under test, maybe try running your existing tests… again (and again, and again, and again…).</p>]]></content:encoded>
    </item>
    <item>
      <title>No More Test Plans</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/no-more-test-plans</link>
      <pubDate>Tue, 05 Oct 2010 21:44:46 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2010/10/05/no-more-test-plans/</guid>
      <description><![CDATA[I’m saying goodbye to the term “Test Plan”.&#160; To me, “Test Plan” implies a plan that details how...]]></description>
      <content:encoded><![CDATA[<p>I’m saying goodbye to the term “Test Plan”.&#160; To me, “Test Plan” implies a plan that details how the test team will measure the quality of the product is and report it back to the team.&#160; While this an important piece of the a quality strategy, it’s not sufficient by itself.</p>  <p>I’m replacing the term “Test Plan” with “Quality Plan”.&#160; This is a plan that explains how various people working on a feature will work <em>together</em> to ensure it’s delivered with high quality.</p>  <p>Quality isn’t just the responsibility of a single person, and as such, Quality Plans don’t have a single author.&#160; Rather, multiple people will contribute to them at various points throughout the feature development cycle.&#160; For practical purposes, I’ll have a tester being the &quot;guardian” of the document, making sure it’s complete, up to date, that everyone is bought into the plan, etc.&#160; Developers, program managers, and testers will work together on a unified testing strategy for the feature:</p>  <ul>   <li>The developer will describe how she’ll validate the code before she commits changes, which scenarios will be covered by pre-check-in tests, any testability considerations in the code, etc.&#160; </li>    <li>The tester will describe the additional testing he’ll do post-check-in and any other processes, procedures, test tools, etc. he’ll use to get the job done.&#160; </li>    <li>A program manager might contribute by ensuring the plan covers validation of end-user scenarios, making sure those scenarios are well documented, and tracking progress during feature development.</li> </ul>  <p>It may sound like a subtle difference in terminology, but I think it encourages a much bigger change in how a team thinks about designing in quality from Day 1 as opposed to the extreme opposite: “testing in quality” after the feature is “complete”.</p>]]></content:encoded>
    </item>
    <item>
      <title>Oh The Times, They Are A Changing</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/oh-the-times-they-are-a-changing</link>
      <pubDate>Fri, 16 Jul 2010 13:42:51 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2010/07/16/oh-the-times-they-are-a-changing/</guid>
      <description><![CDATA[With mixed emotions, I want to announce that I’ve decided to leave the Team Foundation Server team...]]></description>
      <content:encoded><![CDATA[<p>With mixed emotions, I want to announce that I’ve decided to leave the Team Foundation Server team for a new opportunity within Microsoft.&#160; I’ve been on the TFS team for the past 7 years in various capacities from tester to test lead to test manager to test architect.&#160; I’ve watched this product grow from its infancy as a “new enterprise class source control tool” to the great all-up ALM solution it is today.&#160; I’ve thoroughly enjoyed getting to know the ALM space, our customers, and especially our awesome MVPs.&#160; I’ve learned a <strong>ton</strong> on this team, more than I could possibly begin to enumerate.&#160; It’s hard to leave this great team.&#160; </p>  <p>However, I’ve found an opportunity I consider to be very exciting and one I couldn’t pass up.&#160; I’ll be switching back from a Test Architect to a Test Manager position for one.&#160; Among other things, one feature I’ll own testing for is the F12 debugging experience inside Internet Explorer.&#160; If you’ve tried the <a href="http://ie.microsoft.com/testdrive/" target="_blank">IE9 preview</a>, you’ve seen that there’s a lot going on here, and I’m really looking forward to being a part of that.</p>  <p>This also means I’ll be moving my family from Chapel Hill, NC back to Redmond, WA.&#160; Our exact move date isn’t settled yet, but we’re planning to be there before September so we can get our kids registered in school before the start of the year.&#160; Leaving North Carolina is also a very difficult decision, as we have family and some very good friends here.&#160; We also left some great friends in Redmond when we moved to NC, so it will be fun getting re-acquainted with them.</p>  <p>So… that’s my news.&#160; Here’s to change.&#160; Cheers!</p>]]></content:encoded>
    </item>
    <item>
      <title>Thinking About ROI for Test Automation</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/thinking-about-roi-for-test-automation</link>
      <pubDate>Tue, 06 Jul 2010 11:12:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2010/07/06/thinking-about-roi-for-test-automation/</guid>
      <description><![CDATA[After we shipped Team Foundation Server 2010, I took on a new role on the TFS team as a Test...]]></description>
      <content:encoded><![CDATA[<p>After we shipped Team Foundation Server 2010, I took on a new role on the TFS team as a Test Architect.&nbsp; I&rsquo;m excited about this role because it&rsquo;s a little more hands-on than being a manager and because I get to help tackle some of the most challenging test problems we have across the product.</p>
<p>One of my first projects is to find ways to improve the return on investment (ROI) we&rsquo;re getting with our test automation.&nbsp; In general, there are 2 options to improve ROI: decrease investment or increase return (or both).</p>
<p>Left unchecked, test automation can be like a horde of <a target="_blank" href="http://en.wikipedia.org/wiki/Tribbles">Tribbles</a>.&nbsp; Sure, in the beginning it&rsquo;s cute and fuzzy and makes you happy, but when your automated tests multiply and grow out of control until you&rsquo;re up to your neck in them, you suddenly realize perhaps automation is not the silver bullet you may have initially thought it was.</p>
<p>I&rsquo;ll attempt to cover in this post what we&rsquo;re doing to improve test automation ROI, and depending on interest in the comments, I may go into more detail in follow-up posts.</p>
<h2>Costs of Test Automation</h2>
<p>Often, product teams are so focused on the <em>product</em> lifecycle that they forget about the lifecycle for test automation.&nbsp; Like any other software project, writing code for automated tests has certain costs.&nbsp; For example:</p>
<ul>
<li>Initial coding and testing time (including time spent developing any &ldquo;helper&rdquo; libraries or layers)</li>
<li>Maintenance &ndash; keeping the test code up to date as the product under test changes over time </li>
<li>Investigation time when a test fails &ndash; is it a product bug or a bug in the test itself? </li>
<li>Test execution time &ndash; think of it as an opportunity cost; what other processes are blocked pending the outcome of the automation results?</li>
<li>Infrastructure, CPU cycles, electricity, lab maintenance costs, licenses &amp; fees, etc.</li>
</ul>
<p>There are many more costs, of course (see <a target="_blank" href="http://www.softwarequalitymethods.com/Papers/Star99%20model%20Paper.pdf">here</a> for a good list including fixed and variable costs), but I think this short list represents some of the more impactful among them.</p>
<h2>Taming the Automation Cost Beast</h2>
<p>In our effort to improve automation ROI, we&rsquo;re looking at several aspects of our automation.&nbsp; I&rsquo;ll walk through some of them and explain how we&rsquo;re thinking about them in terms of ROI.&nbsp; As we look at these metrics, we consider them all in concert and then decide on an appropriate action to take.&nbsp; This could be the merging of 2 or more tests into a single case, making improvements to the test automation, or even deleting the automation altogether!</p>
<h3>1. How long does the test take to run on average?</h3>
<p>Tests that take a long time to run may be more susceptible to being broken by changes in the product because they&rsquo;re touching a larger surface area of the product.&nbsp; Consider whether these are truly worthwhile to be running at their current frequency and whether it might be more prudent to factor these into multiple smaller tests that could be run more often.&nbsp; This might not be possible if the test is an end-to-end scenario and each step depends on the outcome of the previous step.&nbsp; This type of scenario is sometimes more beneficial to run by hand though, since testers acting as customers would get a true feel for the flow through the code under test.&nbsp; </p>
<p>Other times, tests that take a long time to run may be hung waiting for an unexpected modal dialog to be dismissed.&nbsp; To give you an example, some of our integration tests specified a 10 minute default timeout before our test harness would kill them.&nbsp; If the test timed out 15 seconds into the scenario, it would sit there doing nothing for the remaining 9 minutes and 45 seconds until the harness stopped the test process and moved on to the next test.&nbsp; Clearly this time could have been better spent!</p>
<p>Another related metric is to look at the standard deviation of runtimes for the test.&nbsp; If the test runtime varies greatly over time when you look across <em>all</em> runs but is relatively consistent when the test passes or fails, you might have found a test that hangs on failure until it times out and otherwise passes very quickly when it succeeds</p>
<h3>2. How often did the test fail for test-related problems vs. product bugs?</h3>
<p>Did the test find more test problems or product problems?&nbsp; More test bugs means the test is either poorly written or it&rsquo;s too dependent on product behaviors and interfaces that are changing over time.&nbsp; For example, if the test is driving the product via UI automation and someone redesigns a particular dialog box or web page to use a checkbox control instead of a radio button, the test will likely break.</p>
<p>After analyzing each test failure, we use a custom field in our TFS Bug work items to indicate whether the test failure was due to an intended product change or a flaky test.&nbsp; If analysis shows us a test failure is because of a test bug, we will often either fix it immediately or disable the test so it doesn&rsquo;t get run again until it&rsquo;s fixed.&nbsp; Otherwise, the test will continue to fail in runs for the same issue until it is fixed, thus wasting time.</p>
<p>If the test breaks most often because of test issues, perhaps either it or the product code should be re-factored to be more testable.&nbsp; There is a wealth of information on the web about coding for testability.&nbsp; For starters, have a look at the <a target="_blank" href="http://blog.objectmentor.com/articles/2009/02/12/getting-a-solid-start">SOLID principles</a>.&nbsp; </p>
<h3>3. How many <em>unique</em> test and product failures did the test find?</h3>
<p>Closely related to the previous metric is the concept of <em>unique</em> number of test bugs and product bugs found.&nbsp; A test that&rsquo;s finding a lot of unique product bugs <em>might</em> be too big a test.&nbsp; That is, while it&rsquo;s failing often for valid product problems, it might be failing before it finishes even setting up everything it needs to test a specific scenario.&nbsp; Alternatively, if a test fails in 9 runs out of 10 for a test bug, it would be a lot more interesting to know the test found 9 unique issues than the same issue over and over.</p>
<h3>4. What is the average pass % for the test?</h3>
<p>The pass rate for a test is the number of times it passed divided by the number of times it was executed.</p>
<p>Now, this may seem counter-intuitive at first, but if you have a test that has <em>always</em> passed, that test may be providing little value.&nbsp; Sure it&rsquo;s telling you <em>something</em> is working, but it&rsquo;s likely that&rsquo;s because it has always worked and the feature hasn&rsquo;t been changed.&nbsp; The <a target="_blank" href="https://channel9.msdn.com/posts/ChrisKoenig/How-Do-I-Test-Impact-Analysis-in-Visual-Studio-2010/">test impact analysis feature in Visual Studio 2010</a> is a great way to make sure these tests aren&rsquo;t executed when the code they test hasn&rsquo;t been modified.&nbsp; Another possibility is that the test doesn&rsquo;t actually <em>verify</em> anything!&nbsp; You might be surprised at what you find when you start investigating these tests.</p>
<p>If a test is failing a large percentage of the time for test bugs, say &gt; 50%, then you should probably remove it from your runs and figure out what needs to be fixed.&nbsp; If it&rsquo;s failing a high % of the time for product bugs, ask yourself if the test could be executed further &ldquo;upstream&rdquo; in the production pipeline (say, as part of a <a target="_blank" href="https://channel9.msdn.com/posts/ChrisKoenig/How-Do-I-Test-Impact-Analysis-in-Visual-Studio-2010/">gated checkin</a>?) so these bugs are caught before the code that cause them is committed.</p>
<h2>Wrapping Up</h2>
<p>By looking at test metrics over time, you can find candidate tests to delete or merge into other tests.&nbsp; I&rsquo;ve covered just a few of the ways we&rsquo;re combing through our test automation to determine which tests are useful and which are candidates to be deleted or merged into other tests.&nbsp; By keeping our automation arsenal lean and mean, we&rsquo;re optimizing the automation to test what it&rsquo;s good at testing.&nbsp; When we delete a test, we keep the scenario around to cover through exploratory or strict manual testing, usually on a much less frequent basis than it would execute in automation runs.</p>]]></content:encoded>
    </item>
    <item>
      <title>TFS Command Line Katas: Part 1 – Basic TF.exe Concepts</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/tfs-command-line-katas-part-1-basic-tf-exe-concepts</link>
      <pubDate>Tue, 06 Jul 2010 08:38:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2010/07/06/tfs-command-line-katas-part-1-basic-tf-exe-concepts/</guid>
      <description><![CDATA[The TFS command line client, tf.exe, is a powerful tool that may be somewhat intimidating or elusive...]]></description>
      <content:encoded><![CDATA[<p>The TFS command line client, tf.exe, is a powerful tool that may be somewhat intimidating or elusive to learn if you primarily work through within Visual Studio.&nbsp; In fact, you can do many things in tf.exe that are not available through the Visual Studio source control interface.&nbsp; tf.exe has been around since the earliest days of Team Foundation Server 2005, yet many developers don&rsquo;t even know it exists.</p>
<p>To help you become more familiar with it, I&rsquo;ll be blogging a short series of <a target="_blank" href="http://en.wikipedia.org/wiki/Kata">katas</a> &ndash; small exercises you can repeat over and over until you&rsquo;ve mastered the interface.&nbsp; Today, I present the first kata &ndash; basic tf.exe commands.</p>
<h2>Getting Started:</h2>
<p>In order to use these katas, you&rsquo;ll need to first do the following:</p>
<ol>
<li>Open the Visual Studio command prompt: <strong>Start &ndash;&gt; All Programs &ndash;&gt; Microsoft Visual Studio 2010&ndash;&gt; Visual Studio Tools &ndash;&gt; Visual Studio Command Prompt</strong>.&nbsp; This will ensure that tf.exe is in your %PATH% environment variable so you don&rsquo;t have to type the full path to it each time you use it. </li>
<li>cd into a folder where you have an existing TFS workspace mapped. This is how tf.exe will know what workspace and server to work against. </li>
</ol>
<h2>&nbsp;</h2>
<h2>TFS Command Line Kata #1 &ndash; TF.EXE Basics</h2>
<p>My first kata introduces some of the most used commands in the command line client.&nbsp; In particular, all of these can work without any additional parameters other than the command name.&nbsp; I&rsquo;ll address more complex commands in future posts.</p>
<ol>
<li><strong>tf /?</strong> &ndash; list all available tf.exe commands </li>
<li><strong>tf workspace</strong> &ndash; view details about the current workspace </li>
<li><strong>tf workfold</strong> &ndash; view a list of server folders and the local folders they&rsquo;re mapped to for the current workspace </li>
<li><strong>tf workspaces</strong> &ndash; view a list of all workspaces on the current machine </li>
<li><strong>tf dir &ndash; </strong>view a listing of files &amp; folders in the source repository folder mapped to the current local folder </li>
<li><strong>tf status </strong>&ndash; view pending changes in the current workspace </li>
</ol>
<p>That&rsquo;s enough for now.&nbsp; Remember, katas are short and simple, easy to memorize and repeat daily.&nbsp; Work on these for a few days while I prepare the next post in the series.&nbsp; If you have questions about the command line interface to TFS, please post comments.</p>]]></content:encoded>
    </item>
    <item>
      <title>Speaking at TriNUG Wednesday, June 9th</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/speaking-at-trinug-wednesday-june-9th</link>
      <pubDate>Tue, 08 Jun 2010 07:24:24 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2010/06/08/speaking-at-trinug-wednesday-june-9th/</guid>
      <description><![CDATA[I'll be doing a talk at the Triangle .NET User Group tomorrow night on "Real World ALM with Team...]]></description>
      <content:encoded><![CDATA[<p>I'll be doing a talk at the Triangle .NET User Group tomorrow night on "Real World ALM with Team Foundation Server". It's a no-slides introduction to TFS 2010 with some practical tips thrown in.</p>
<p>More info <a href="http://www.trinug.org">here</a>.&nbsp; If you're in the area, I hope to see you there!</p>]]></content:encoded>
    </item>
    <item>
      <title>Should I test the individual layers in my app or test from an end-to-end perspective?</title>
      <link>https://docs.microsoft.com/archive/blogs/jasonba/should-i-test-the-individual-layers-in-my-app-or-test-from-an-end-to-end-perspective</link>
      <pubDate>Tue, 30 Mar 2010 13:58:10 GMT</pubDate>
      <dc:creator><![CDATA[Jason Barile]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jasonba/2010/03/30/should-i-test-the-individual-layers-in-my-app-or-test-from-an-end-to-end-perspective/</guid>
      <description><![CDATA[I have this debate with other testers and developers from time to time, so I thought I post my own...]]></description>
      <content:encoded><![CDATA[<p>I have this debate with other testers and developers from time to time, so I thought I post my own thoughts on the subject.&#160; </p>  <p>Many applications today consist of multiple layers.&#160; For example, a typical ASP.NET MVC web application may have views, controllers, services, data repositories, a domain model, etc.&#160; A typical IT type application might have a WinForms or WPF GUI, some client side logic, web services, and a database layer.</p>  <p>The question is, when testing a layered application, should we test each layer independently or just test the product from an end-to-end perspective?</p>  <p>My answer (and yours may vary), is “both”.&#160; The key goal in my mind is to find each class of bug in the most efficient way possible while keeping the efficiency of your overall quality process in check too.</p>  <h3>Why test layers?</h3>  <p>Often, the argument <em>against</em> testing layers sounds something like “we’ll end up with the same test written N times” or “it’s too inefficient to test each layer independently”.&#160; While I completely disagree with the 1st point, there may be validity to the 2nd.&#160; I’ll tackle each individually.&#160; I’ll point out here that I’m mainly talking about the layers that <em>your product</em> has created (i.e. code that you own).&#160; If you depend on 3rd party products such as a database or web server or user controls, you may or may not want to do some testing to ensure they meet your needs.</p>  <h4>Argument #1 - We’ll end up with the same layer N times!</h4>  <p>If your app is layered, there’s a really good chance each layer does something slightly different (why else would there be layers?).&#160; If you target your test at each layer and mock away the layers below it, then you can write tests to each layer that target the specific behavior of that layer and nothing else.&#160; This is typically what unit testing covers.</p>  <p>In my experience, people who use point #1 against testing layers often misunderstand the point/value/cost of mocking and they’re thinking about the problem as testing the whole stack in increments.&#160; I agree this would probably not be an efficient use of time and resources.&#160; Imagine testing the database, then the database + the data access layer, then the database + the data access layer + the business logic, then finally the database + the data access layer + the business logic + the client code that sits on top of the business logic…&#160; you get the point.&#160; In this approach, you’d be testing the bottom-most layer 4 times, the DAL 3 times, the business logic twice, etc.&#160; I don’t think that’s efficient or necessary at all in most cases.&#160; </p>  <h4>Argument #2 – It’s too inefficient to test each layer independently</h4>  <p>This is where mocking comes in handy, and in particular mocking frameworks.&#160; The common misperception is that you have to write and maintain a bunch of code to create a mock for things your code depends on.&#160; Mocking frameworks such as RhinoMocks, TypeMock, Moq, etc. help you by automatically creating the mocks for you at runtime.&#160; You simply tell them how to respond when certain methods are called or properties accessed.&#160; For example, if your code under test depends on a class with 50 methods, but only 1 is called by the code under test, you only have to write about 2 lines of code to create the mock object and tell it how to behave when your code calls it.&#160; That’s all!&#160; How is that expensive?</p>  <p>A variation on this argument is the classic “why automate testing at all?” argument: “it’s too expensive to maintain test automation”.&#160; My response is, “it’s usually too expensive <em>not</em> to”.&#160; Sure, if you change the product code to do something differently, then you should change the test code accordingly. In fact, you should <em>want</em> to.&#160; Otherwise, how do you know the code you just wrote even works?&#160; You could go as far as writing the tests first in fact, but since I’m trying to convince you to write tests at all, I’m going to stop there for now :)</p>  <h4>Argument #3 – We’ll end up wasting time fixing bugs that would never impact our users</h4>  <p>Are you sure? How can you be certain that that particular code path will <em>never</em> be hit by customers using the product from a layer higher up or possibly by a change in a dependency further down the layer stack?&#160; Why would you knowingly write code that’s full of bugs and rely on the fact that what’s true at a specific point in time will always be true?&#160; Think about all the time you’ve saved by testing in layers and finding bugs early instead of late in the development cycle when integration testing usually happens. Why not use a <em>little</em> of that time to fix this type of bug?&#160; I’m speaking in broad terms, of course… I’m sure everyone can come up with specific examples where this doesn’t make sense.&#160; </p>  <h3>Why test end-to-end?</h3>  <p>Testing layers doesn’t give you an excuse to <em>not</em> test from an end-user/end-to-end perspective.&#160; It doesn’t matter if all the parts of a car are tested independently and work fine if they don’t fit together in the end.&#160; It’s critical to understand how components work together in a system and validate that assumptions made about the interfaces between them align from both sides of the fit.&#160; If you’re having the “no testing of layers” argument with me, chances are you’re more interested in end-to-end testing anyway, so I’m not going to spend a lot of time on this part.</p>  <h3>Why test both?</h3>  <p>I think of it this way: when building a house, you wouldn’t just get an inspection after the whole house is finished just to discover that the electrical wiring was done incorrectly, would you?&#160; Nor would you <em>only</em> test the electrical wiring once before all the drywall was up and forego the final walkthrough. To really have confidence that your house is built correctly, you have inspections for each major sub-system along the way (framing, plumbing, electrical, insulation, drywall, etc.) and then you do a final walkthrough for an integration/end-to-end kind of test.&#160; </p>  <p>By testing all the components/layers independently, you’re finding bugs in those components more efficiently than waiting until the whole system is put together.&#160; By testing from an integration perspective, you’re testing the coupling of those individual components and their interactions.&#160; In both cases, you’re using the right tool for the right job.</p>  <p>So that’s my pitch! Convinced?</p>]]></content:encoded>
    </item>
  </channel>
</rss>