<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: The Forgotten Layer of the Test Automation Pyramid</title>
	<atom:link href="http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid</link>
	<description>Succeeding With Agile®</description>
	<lastBuildDate>Fri, 10 Feb 2012 03:51:54 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Mike Cohn</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-226568</link>
		<dc:creator>Mike Cohn</dc:creator>
		<pubDate>Sat, 25 Jun 2011 17:01:27 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-226568</guid>
		<description>Hi John-
I think the key point you make is &quot;You want to automate UI based on how well units are done.&quot;  Absolutely, testing is an investment and the investment we make at one layer should be influenced by how well testing has been done at the other layers.</description>
		<content:encoded><![CDATA[<p>Hi John-<br />
I think the key point you make is &#8220;You want to automate UI based on how well units are done.&#8221;  Absolutely, testing is an investment and the investment we make at one layer should be influenced by how well testing has been done at the other layers.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John VanDamme</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-226565</link>
		<dc:creator>John VanDamme</dc:creator>
		<pubDate>Sat, 25 Jun 2011 16:58:49 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-226565</guid>
		<description>Your use of &quot;UI&quot; accurately describes the situation - the technology is hidden from the user, despite its being used in many different ways.  It seems to be most difficult to discuss a pattern with the layer of the UI as being expressed as a tip; however, the tip points to a lightning stike of possibilities.  Why this test, when another could &quot;touch&quot; more of what the units do?  This leads to wanting to invert the triangle when viewing &quot;from the UI&quot; thus the discussion about &quot;end-to-end&quot;.  

I am a tester and my most fun thing is discovering where units are not complete or are too simplistic.  Once I identify them, I can manage my efforts (lightning strike endings effectively).  The service testing capacity also follows this pattern of probablistic pathways and also point to the exclusivity of the patterns.  Understanding the unit tests is when I do my work most effectively in the UI for the customer, who could care less about the technical details about why the UI doesn&#039;t work when things go wrong.  You want to automate UI based on how well units are done.</description>
		<content:encoded><![CDATA[<p>Your use of &#8220;UI&#8221; accurately describes the situation &#8211; the technology is hidden from the user, despite its being used in many different ways.  It seems to be most difficult to discuss a pattern with the layer of the UI as being expressed as a tip; however, the tip points to a lightning stike of possibilities.  Why this test, when another could &#8220;touch&#8221; more of what the units do?  This leads to wanting to invert the triangle when viewing &#8220;from the UI&#8221; thus the discussion about &#8220;end-to-end&#8221;.  </p>
<p>I am a tester and my most fun thing is discovering where units are not complete or are too simplistic.  Once I identify them, I can manage my efforts (lightning strike endings effectively).  The service testing capacity also follows this pattern of probablistic pathways and also point to the exclusivity of the patterns.  Understanding the unit tests is when I do my work most effectively in the UI for the customer, who could care less about the technical details about why the UI doesn&#8217;t work when things go wrong.  You want to automate UI based on how well units are done.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mike Cohn</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-66484</link>
		<dc:creator>Mike Cohn</dc:creator>
		<pubDate>Sun, 21 Feb 2010 03:38:20 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-66484</guid>
		<description>Hi Todd--
Thanks for the detailed comments. I can see the value in your renaming of the levels. And I agree this pyramid can be used in various ways to help teams at different points in their learning about testing. The first time I drew it was for a team I wanted to educate about UI testing. They were trying to do all testing through the UI and I wanted to show them how they could avoid that. Perhaps since that was my first use it, that&#039;s the use I&#039;ve stuck with most commonly.</description>
		<content:encoded><![CDATA[<p>Hi Todd&#8211;<br />
Thanks for the detailed comments. I can see the value in your renaming of the levels. And I agree this pyramid can be used in various ways to help teams at different points in their learning about testing. The first time I drew it was for a team I wanted to educate about UI testing. They were trying to do all testing through the UI and I wanted to show them how they could avoid that. Perhaps since that was my first use it, that&#8217;s the use I&#8217;ve stuck with most commonly.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: todd</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-66473</link>
		<dc:creator>todd</dc:creator>
		<pubDate>Sat, 20 Feb 2010 23:28:42 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-66473</guid>
		<description>I have been using Mike&#039;s Test Automation Pyramid to explain to clients testers and developers how to structure a test strategy. It has proved the most effective rubric (say compared with the Brian Marick&#039;s Quadrant&#039;s model - as further evolved from Crispin and Gregory) to get people thinking about what going on in testing the actual application and its stress points. I want to add that JB Rainsberger&#039;s talk mentioned above is crucial to understanding why that top level set of tests can&#039;t prove integrity of the product by itself. 

It has got me thinking that perhaps that we need to rethink some assumptions behind these labels. The difference of opinion in this blogs also suggests this. So I thought I would spend some time talking about how I use the pyramid and then come back to rethinking its underlying assumptions. I&#039;d love any feedback.

I have renamed some parts of the pyramid so that at a first glance it is easily recognisable by clients. This particularly renaming is in the context of writing MVC web applications. I get teams to what their pyramid looks like for their project - or what they might want it to be because it is often upside down.

My layers:

  - System (smoke, acceptance)
  - Integration
  - Unit

I also add a cloud on top (I think from Crispin and Gregory) for exploratory testing. This is important for two reasons: (1) I want automated testing so that I can allow more time for manual testing and to emphasise that (2) there should be no manual regression tests. This supports Rainsberger&#039;s argument not to use the top-level testing as proof of the systems integrity - to me the proof is in the use of the system. Put alternatively, automated tests are neither automating your tester&#039;s testing nor are they a silver bullet.  So if I don&#039;t have a cloud people forget that manual testing is part of the automated test strategy (plus with a cloud when the pyramid is inverted it makes a good picture of ice cream in a cone and you can have the image of a person licking the ice cream and it falling off ;-).)

In the context of an MVC application, this type pyramid has lead me to some interesting findings at the code base level. Like everyone is saying, we want to drive testing down towards the Unit tests because they are foundational, discrete and cheapest. To do this, it means that I need to create units that can be tested without boundary crossing. For an asp.net MVC (just like Rails), this means that I can unit test (with the aid of isolation frameworks):

 - models and validations (particularly using MotherObjects)
 - routes coming in 
 - controller rendering of actions/views
 - controller redirection to actions/views
 - validation handling (from errors from models/repositories)
 - all my jQuery plugin code for UI-based rendering
 - any HTML generation from HtmlHelpers (although I find this of little value and brittle)
 - any of course all my business &quot;services&quot;

I am always surprised at how many dependencies I can break throughout my application to make unit tests - in all of these cases I don&#039;t not need my application to be running in a webserver (IIS or Cassini). They are quick to write, quick to fail. They also require additional code to be written or libraries to be provided (eg MvcContrib Test Helpers).

For integration tests, I now find that the only piece of the application that I still requires a dependency is the connection to the database. Put more technically, I need to check that my repository pattern correctly manages my object&#039;s lifecycle and its identity; it is also ensuring that I correctly code the impedance mismatch between the object layer of my domain and relational layer of the database.  In practice, this is ensuring a whole load of housekeeping rather than business logic: eg my migrations scripts are in place (eg schema changes, stored procs); my mapping code (eg ORM) and that the code links all this up correctly. Interestingly, I now find that this layer in terms of lines of code is less than the pyramid suggests because there is a lot of code in a repository service that can be unit tested - it is really only the code that checks identity that requires a real database. The integration tests left tend then to map linearly to the CRUD functions. I follow the rule, one test per dependency. If my integration tests get more complicated it is often time to go looking for domain smells - in the domain driven design sense I haven&#039;t got that bounded context right for the current state/size of the application.

For the top layer, like others I see it as the end-to-end tests and it covers any number of dependencies to satisfy the test across scenarios.

I have also found that there are actually different types of tests inside this layer. Because it is web application, there is the smoke test - some critical path routes that show that all the ducks are lined up - selenium, watir/n and even Steve Sanderson&#039;s MVCIntegationTest are all fine. I might use these tests to target parts of the application that are known to be problematic so that I get as earlier a warning as possible.

Then there are the acceptance tests. This is where I find the most value not only because it links customer abstractions of workflow with code but also as importantly because it makes me attend to code design. I find that to run maintainable acceptance tests you need to create yet another abstraction. Rarely can you just hook up the SUT api and it works. You need setup/teardown data and various helper methods. To do this, I explicitly create &quot;profiles&quot; in code for the setup of  data and exercising of the system. For example, when I wrote a Banner delivery tool for a client (think OpenX or GoogleAds) I needed to create a &quot;Configurator&quot; and an &quot;Actionator&quot; profile. The Configurator was able to create a number banner ads into the system (eg html banner on this site, a text banner on that site) and the Actionator then invoked 10,000 users on this page on that site. In both cases, I wrote C# code to do the job (think an internal DSL as a fluent interface) rather than say in fitnesse.

Why are these distinctions important? A few reasons. The first is that the acceptance tests in this form are a test of the design of the code rather than the function. I always have to rewrite parts of my code so that the acceptance tests can hook in. It has only ever improved my design such as separation of concerns and it often has given my greater insight into my domain model and its bounded contexts. For me, these acceptance tests are yet another conversation with my code - but by the time I have had unit, integration and acceptance test conversations about the problem the consensus decision isn&#039;t a bad point to be at.

Second is that I can easily leverage my DSL for performance testing. This is going help me in the non-functional testing (or the fourth quarter of the Test Quadrants model).

Third is that this is precisely the setup you need for a client demo. So at any point, I can crank up the demo data for the demo or exploratory testing. I think it is at this point that we have a closed loop: desired function specified, code to run, and data to run against.

Hopefully, that all makes some sense. Now back to thinking about the underlying assumptions of what is going on at each layer. I think we are still not clear on what we really testing at each layer in the pyramid: most tend to be around the physical layers, the logical layers or the roles within the team. For example, some are mapping it to the MVC particularly because the V maps closely to the UI. Others are staying in a traditional unit, functional and integration partly because the separation of roles within a team. 

I want to suggest that complexity is a better underlying organisation. Happy to leave the nomenclature alone: the bottom is where there are no dependencies (unit), the second has one dependency (integration) and top have as many as you need to make it work (system). It seems to me that the bottom two layers require you to have a very clear understanding of your physical and logical architecture expressed in terms of boxes and directed lines ensure that you test each line for every boundary. 

If you look back to my unit tests it identified logical parts of the application and tested at boundaries. Here&#039;s one you might not expect. The UI is often seen as a low value place to test. Yet, frameworks like jQuery suggest otherwise and breakdown our layering: I can unit test a lot of the browser code which is traditionally seens as UI layer. I can widgetize any significant interactions or isolate any specific logic and unit test this outside the context of the application running (StoryQ has done this). 

The integration tests tested across a logical and often physical boundary. It has really only one dependency. Because there is one dependency the nature of complexity here is still linear. One dependency equals no interaction with other contexts.

The top level is all about putting it together so that people across different roles can play with the application and use complex heuristics to check its coding. But I don&#039;t think the top level is really about the user interface per se. It only looks that way because the GUI is most generalised abstraction that we believe that customers and testers believe that they understand the workings of the software. Working software and the GUI should not be conflated.  Complexity at the top-most level is that of many dependencies interacting with each other - context is everything. Complexity here is not linear. We need automated system testing to follow critical paths that create combinations or interactions that we can prove do not have negative side effects. We also need exploratory testing which is deep, calculative yet ad hoc that attempts to create negative side effects that we can then automate. Neither strategy aspires for illusive, exhaustive testing - or as JB Rainsberger argues - which is the scam of integration testing. 

There&#039;s a drawback when you interpret the pyramid along these lines. Test automation requires a high level of understanding of your solution architecture, its boundaries and interfaces, the impedance mismatches in the movement between them, and a variety of toolsets required to solve each of these problems. And I find requires a team with a code focus. Many teams and managers I work with find the hump of learning and its associated costs too high. I like the pyramid because I can slowly introduce more subtle understandings of the pyramid as the team gets more experience.

Cheers todd</description>
		<content:encoded><![CDATA[<p>I have been using Mike&#8217;s Test Automation Pyramid to explain to clients testers and developers how to structure a test strategy. It has proved the most effective rubric (say compared with the Brian Marick&#8217;s Quadrant&#8217;s model &#8211; as further evolved from Crispin and Gregory) to get people thinking about what going on in testing the actual application and its stress points. I want to add that JB Rainsberger&#8217;s talk mentioned above is crucial to understanding why that top level set of tests can&#8217;t prove integrity of the product by itself. </p>
<p>It has got me thinking that perhaps that we need to rethink some assumptions behind these labels. The difference of opinion in this blogs also suggests this. So I thought I would spend some time talking about how I use the pyramid and then come back to rethinking its underlying assumptions. I&#8217;d love any feedback.</p>
<p>I have renamed some parts of the pyramid so that at a first glance it is easily recognisable by clients. This particularly renaming is in the context of writing MVC web applications. I get teams to what their pyramid looks like for their project &#8211; or what they might want it to be because it is often upside down.</p>
<p>My layers:</p>
<p>  &#8211; System (smoke, acceptance)<br />
  &#8211; Integration<br />
  &#8211; Unit</p>
<p>I also add a cloud on top (I think from Crispin and Gregory) for exploratory testing. This is important for two reasons: (1) I want automated testing so that I can allow more time for manual testing and to emphasise that (2) there should be no manual regression tests. This supports Rainsberger&#8217;s argument not to use the top-level testing as proof of the systems integrity &#8211; to me the proof is in the use of the system. Put alternatively, automated tests are neither automating your tester&#8217;s testing nor are they a silver bullet.  So if I don&#8217;t have a cloud people forget that manual testing is part of the automated test strategy (plus with a cloud when the pyramid is inverted it makes a good picture of ice cream in a cone and you can have the image of a person licking the ice cream and it falling off <img src='http://blog.mountaingoatsoftware.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .)</p>
<p>In the context of an MVC application, this type pyramid has lead me to some interesting findings at the code base level. Like everyone is saying, we want to drive testing down towards the Unit tests because they are foundational, discrete and cheapest. To do this, it means that I need to create units that can be tested without boundary crossing. For an asp.net MVC (just like Rails), this means that I can unit test (with the aid of isolation frameworks):</p>
<p> &#8211; models and validations (particularly using MotherObjects)<br />
 &#8211; routes coming in<br />
 &#8211; controller rendering of actions/views<br />
 &#8211; controller redirection to actions/views<br />
 &#8211; validation handling (from errors from models/repositories)<br />
 &#8211; all my jQuery plugin code for UI-based rendering<br />
 &#8211; any HTML generation from HtmlHelpers (although I find this of little value and brittle)<br />
 &#8211; any of course all my business &#8220;services&#8221;</p>
<p>I am always surprised at how many dependencies I can break throughout my application to make unit tests &#8211; in all of these cases I don&#8217;t not need my application to be running in a webserver (IIS or Cassini). They are quick to write, quick to fail. They also require additional code to be written or libraries to be provided (eg MvcContrib Test Helpers).</p>
<p>For integration tests, I now find that the only piece of the application that I still requires a dependency is the connection to the database. Put more technically, I need to check that my repository pattern correctly manages my object&#8217;s lifecycle and its identity; it is also ensuring that I correctly code the impedance mismatch between the object layer of my domain and relational layer of the database.  In practice, this is ensuring a whole load of housekeeping rather than business logic: eg my migrations scripts are in place (eg schema changes, stored procs); my mapping code (eg ORM) and that the code links all this up correctly. Interestingly, I now find that this layer in terms of lines of code is less than the pyramid suggests because there is a lot of code in a repository service that can be unit tested &#8211; it is really only the code that checks identity that requires a real database. The integration tests left tend then to map linearly to the CRUD functions. I follow the rule, one test per dependency. If my integration tests get more complicated it is often time to go looking for domain smells &#8211; in the domain driven design sense I haven&#8217;t got that bounded context right for the current state/size of the application.</p>
<p>For the top layer, like others I see it as the end-to-end tests and it covers any number of dependencies to satisfy the test across scenarios.</p>
<p>I have also found that there are actually different types of tests inside this layer. Because it is web application, there is the smoke test &#8211; some critical path routes that show that all the ducks are lined up &#8211; selenium, watir/n and even Steve Sanderson&#8217;s MVCIntegationTest are all fine. I might use these tests to target parts of the application that are known to be problematic so that I get as earlier a warning as possible.</p>
<p>Then there are the acceptance tests. This is where I find the most value not only because it links customer abstractions of workflow with code but also as importantly because it makes me attend to code design. I find that to run maintainable acceptance tests you need to create yet another abstraction. Rarely can you just hook up the SUT api and it works. You need setup/teardown data and various helper methods. To do this, I explicitly create &#8220;profiles&#8221; in code for the setup of  data and exercising of the system. For example, when I wrote a Banner delivery tool for a client (think OpenX or GoogleAds) I needed to create a &#8220;Configurator&#8221; and an &#8220;Actionator&#8221; profile. The Configurator was able to create a number banner ads into the system (eg html banner on this site, a text banner on that site) and the Actionator then invoked 10,000 users on this page on that site. In both cases, I wrote C# code to do the job (think an internal DSL as a fluent interface) rather than say in fitnesse.</p>
<p>Why are these distinctions important? A few reasons. The first is that the acceptance tests in this form are a test of the design of the code rather than the function. I always have to rewrite parts of my code so that the acceptance tests can hook in. It has only ever improved my design such as separation of concerns and it often has given my greater insight into my domain model and its bounded contexts. For me, these acceptance tests are yet another conversation with my code &#8211; but by the time I have had unit, integration and acceptance test conversations about the problem the consensus decision isn&#8217;t a bad point to be at.</p>
<p>Second is that I can easily leverage my DSL for performance testing. This is going help me in the non-functional testing (or the fourth quarter of the Test Quadrants model).</p>
<p>Third is that this is precisely the setup you need for a client demo. So at any point, I can crank up the demo data for the demo or exploratory testing. I think it is at this point that we have a closed loop: desired function specified, code to run, and data to run against.</p>
<p>Hopefully, that all makes some sense. Now back to thinking about the underlying assumptions of what is going on at each layer. I think we are still not clear on what we really testing at each layer in the pyramid: most tend to be around the physical layers, the logical layers or the roles within the team. For example, some are mapping it to the MVC particularly because the V maps closely to the UI. Others are staying in a traditional unit, functional and integration partly because the separation of roles within a team. </p>
<p>I want to suggest that complexity is a better underlying organisation. Happy to leave the nomenclature alone: the bottom is where there are no dependencies (unit), the second has one dependency (integration) and top have as many as you need to make it work (system). It seems to me that the bottom two layers require you to have a very clear understanding of your physical and logical architecture expressed in terms of boxes and directed lines ensure that you test each line for every boundary. </p>
<p>If you look back to my unit tests it identified logical parts of the application and tested at boundaries. Here&#8217;s one you might not expect. The UI is often seen as a low value place to test. Yet, frameworks like jQuery suggest otherwise and breakdown our layering: I can unit test a lot of the browser code which is traditionally seens as UI layer. I can widgetize any significant interactions or isolate any specific logic and unit test this outside the context of the application running (StoryQ has done this). </p>
<p>The integration tests tested across a logical and often physical boundary. It has really only one dependency. Because there is one dependency the nature of complexity here is still linear. One dependency equals no interaction with other contexts.</p>
<p>The top level is all about putting it together so that people across different roles can play with the application and use complex heuristics to check its coding. But I don&#8217;t think the top level is really about the user interface per se. It only looks that way because the GUI is most generalised abstraction that we believe that customers and testers believe that they understand the workings of the software. Working software and the GUI should not be conflated.  Complexity at the top-most level is that of many dependencies interacting with each other &#8211; context is everything. Complexity here is not linear. We need automated system testing to follow critical paths that create combinations or interactions that we can prove do not have negative side effects. We also need exploratory testing which is deep, calculative yet ad hoc that attempts to create negative side effects that we can then automate. Neither strategy aspires for illusive, exhaustive testing &#8211; or as JB Rainsberger argues &#8211; which is the scam of integration testing. </p>
<p>There&#8217;s a drawback when you interpret the pyramid along these lines. Test automation requires a high level of understanding of your solution architecture, its boundaries and interfaces, the impedance mismatches in the movement between them, and a variety of toolsets required to solve each of these problems. And I find requires a team with a code focus. Many teams and managers I work with find the hump of learning and its associated costs too high. I like the pyramid because I can slowly introduce more subtle understandings of the pyramid as the team gets more experience.</p>
<p>Cheers todd</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kerry Kimbrough</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-63975</link>
		<dc:creator>Kerry Kimbrough</dc:creator>
		<pubDate>Tue, 12 Jan 2010 18:45:14 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-63975</guid>
		<description>I&#039;ve also seen this 3-level structure in interactive systems, but from a different perspective. There tends to be (should be!) a layer that is the *model* of the UI. That is, a model of the elements and behaviors of the system *as experienced by the user*. This is typically not identical to the domain model of the system -- instead, it is a model of the work people do when using this system within this domain model. It might the M of your MVC architecture, but only if you understand that there a M(ui) that wraps your M(domain). But it also encompasses the C of your MVC because the work model governs the task sequence structure. I think this work model is somewhat broader that a collection of &quot;services&quot;, since it also governs how services are used. At any rate, I think Mike&#039;s main point is the crucial one: this UI work model can be (should be!) represented as an API that can be tested like any other (i.e. independently of any particular View). And if those tests are thorough, the remaining View-specific tests required can be (should be!) much smaller.</description>
		<content:encoded><![CDATA[<p>I&#8217;ve also seen this 3-level structure in interactive systems, but from a different perspective. There tends to be (should be!) a layer that is the *model* of the UI. That is, a model of the elements and behaviors of the system *as experienced by the user*. This is typically not identical to the domain model of the system &#8212; instead, it is a model of the work people do when using this system within this domain model. It might the M of your MVC architecture, but only if you understand that there a M(ui) that wraps your M(domain). But it also encompasses the C of your MVC because the work model governs the task sequence structure. I think this work model is somewhat broader that a collection of &#8220;services&#8221;, since it also governs how services are used. At any rate, I think Mike&#8217;s main point is the crucial one: this UI work model can be (should be!) represented as an API that can be tested like any other (i.e. independently of any particular View). And if those tests are thorough, the remaining View-specific tests required can be (should be!) much smaller.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kerry Kimbrough</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-63974</link>
		<dc:creator>Kerry Kimbrough</dc:creator>
		<pubDate>Tue, 12 Jan 2010 18:27:51 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-63974</guid>
		<description>Elisabeth makes a great point. There&#039;s a bit of ambiguity in the pyramid because it could illustrate two different concerns. One concern is the structure of the &quot;testables&quot; as a stack of layers, each of which could be target of a different set of tests. Another concern is the &quot;depth&quot; of a test: how may layers would a test traverse? In other words, is it end-to-end, one layer only, etc.? There are other concerns for testers, too (for example, the nature of &quot;use case&quot; for this test, etc.) Clearly, the pyramid can&#039;t illustrate them all. I think the pyramid picture most clearly shows the &quot;structure of testables&quot; dimension, in which case &quot;External Interface&quot; might be an accurate name for the top level. I&#039;ve worked with many &quot;headless&quot; systems in which this top level was an API or RESTful protocol, etc. But I must say that every system has a UI. Inasmuch as every system exists to benefit some person(s), there must always be a way for those people to interact with the system, if only to check that something beneficial happened!</description>
		<content:encoded><![CDATA[<p>Elisabeth makes a great point. There&#8217;s a bit of ambiguity in the pyramid because it could illustrate two different concerns. One concern is the structure of the &#8220;testables&#8221; as a stack of layers, each of which could be target of a different set of tests. Another concern is the &#8220;depth&#8221; of a test: how may layers would a test traverse? In other words, is it end-to-end, one layer only, etc.? There are other concerns for testers, too (for example, the nature of &#8220;use case&#8221; for this test, etc.) Clearly, the pyramid can&#8217;t illustrate them all. I think the pyramid picture most clearly shows the &#8220;structure of testables&#8221; dimension, in which case &#8220;External Interface&#8221; might be an accurate name for the top level. I&#8217;ve worked with many &#8220;headless&#8221; systems in which this top level was an API or RESTful protocol, etc. But I must say that every system has a UI. Inasmuch as every system exists to benefit some person(s), there must always be a way for those people to interact with the system, if only to check that something beneficial happened!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sohan</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-61834</link>
		<dc:creator>Sohan</dc:creator>
		<pubDate>Fri, 18 Dec 2009 23:20:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-61834</guid>
		<description>I think your layers and the comments strongly hint to the Rails test laters:
1. Unit test
2. Functional test
3. Integration test
I really liked the functional test part. Because they made it so simple. But can you share your views on end-to-end or integration testing? Because this seems to be the hardest thing to achieve in synch within a sprint cycle. We tried it a few times, but we found that it was hard for QA people to produce the test code in parallel to the UI implementation. And too often you need to spend a lot of time to fix the integration test code just because of changes in UI.</description>
		<content:encoded><![CDATA[<p>I think your layers and the comments strongly hint to the Rails test laters:<br />
1. Unit test<br />
2. Functional test<br />
3. Integration test<br />
I really liked the functional test part. Because they made it so simple. But can you share your views on end-to-end or integration testing? Because this seems to be the hardest thing to achieve in synch within a sprint cycle. We tried it a few times, but we found that it was hard for QA people to produce the test code in parallel to the UI implementation. And too often you need to spend a lot of time to fix the integration test code just because of changes in UI.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mike Cohn</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-61807</link>
		<dc:creator>Mike Cohn</dc:creator>
		<pubDate>Fri, 18 Dec 2009 18:46:27 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-61807</guid>
		<description>Hi Duane--
Yes, I do think these can be thought of as mapping closely to MVC in an MVC architecture.</description>
		<content:encoded><![CDATA[<p>Hi Duane&#8211;<br />
Yes, I do think these can be thought of as mapping closely to MVC in an MVC architecture.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Duane Wesley</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-61804</link>
		<dc:creator>Duane Wesley</dc:creator>
		<pubDate>Fri, 18 Dec 2009 18:04:15 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-61804</guid>
		<description>Mike,

I agree that the service layer, as you describe it, is often ignored.  As for the top layer, whether you call it UI or End-To-End, is it not the View of the MVC architecture?  And, is not the service layer the Controller wherein services and business logic may reside?  Depending upon the system, the degree to which the software maps to MVC can vary widely--one can imagine various degenerate cases, for example--yet, I nonetheless believe that the MVC is an instructive, alternative &quot;view&quot; of the analysis you are presenting.

Thanks for getting me thinking!

Best Regards,

Duane</description>
		<content:encoded><![CDATA[<p>Mike,</p>
<p>I agree that the service layer, as you describe it, is often ignored.  As for the top layer, whether you call it UI or End-To-End, is it not the View of the MVC architecture?  And, is not the service layer the Controller wherein services and business logic may reside?  Depending upon the system, the degree to which the software maps to MVC can vary widely&#8211;one can imagine various degenerate cases, for example&#8211;yet, I nonetheless believe that the MVC is an instructive, alternative &#8220;view&#8221; of the analysis you are presenting.</p>
<p>Thanks for getting me thinking!</p>
<p>Best Regards,</p>
<p>Duane</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Matt Robb</title>
		<link>http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid/comment-page-1#comment-61799</link>
		<dc:creator>Matt Robb</dc:creator>
		<pubDate>Fri, 18 Dec 2009 17:13:50 +0000</pubDate>
		<guid isPermaLink="false">http://blog.mountaingoatsoftware.com/?p=555#comment-61799</guid>
		<description>I would definately change UI to End-to-End, mainly because you can test the UI as a &quot;service layer&quot; independently of the layers it interacts with by mocking those layers just as you would with any other service layer.</description>
		<content:encoded><![CDATA[<p>I would definately change UI to End-to-End, mainly because you can test the UI as a &#8220;service layer&#8221; independently of the layers it interacts with by mocking those layers just as you would with any other service layer.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

