[TFUI] My book on TDD for Views is available online

"Phlip" <[email protected]> Sat, 3 Apr 2010 09:09:38 -0700
Newsgroups gmane.comp.programming.test-first-user-interfaces
Message-ID <[email protected]>
--hfnU9rkRi7waufJbZf02WbmYuzQfsgJRRpR0Umk
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

http://zeroplayer.com/tfui/TestFirstUserInterfaces.pdf

It addresses these industry abuses:

 - skipping the View layer in TDD
 - testing the View thru a user-emulator (such as Watir!)
 - writing the View code first, then testing it (a little!)

The goal is new test cases drive new View features, without looking at or 
driving the View too often.

That is a tall hill to scale, hence the book is very dense. However, each 
chapter and case study contains its own Best Practices that can be learned 
alone, just by reading them.

Work with the book inspired my subsequent research with RoR, including 
assert{ 2.0 }, assert_xhtml{}, and assert_rjs_. An alternate Web chapter is 
my O'Reilly paper on TDD for Ajax: http://oreilly.com/catalog/9780596510657

-- 
  Phlip 




--hfnU9rkRi7waufJbZf02WbmYuzQfsgJRRpR0Umk
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: 7bit




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>







<body style="background-color: #fff;">
<span style="display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p><a href="http://zeroplayer.com/tfui/TestFirstUserInterfaces.pdf">http://zeroplayer.<wbr>com/tfui/<wbr>TestFirstUserInt<wbr>erfaces.pdf</a><br>
<br>
It addresses these industry abuses:<br>
<br>
- skipping the View layer in TDD<br>
 - testing the View thru a user-emulator (such as Watir!)<br>
 - writing the View code first, then testing it (a little!)<br>
<br>
The goal is new test cases drive new View features, without looking at or <br>
driving the View too often.<br>
<br>
That is a tall hill to scale, hence the book is very dense. However, each <br>
chapter and case study contains its own Best Practices that can be learned <br>
alone, just by reading them.<br>
<br>
Work with the book inspired my subsequent research with RoR, including <br>
assert{ 2.0 }, assert_xhtml{<wbr>}, and assert_rjs_. An alternate Web chapter is <br>
my O'Reilly paper on TDD for Ajax: <a href="http://oreilly.com/catalog/9780596510657">http://oreilly.<wbr>com/catalog/<wbr>9780596510657</a><br>
<br>
-- <br>
  Phlip <br>
<br>
</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

        
  
   
    <div id="ygrp-actbar" style="clear: both; margin-bottom: 10px; white-space: nowrap; color: #666; padding-top: 15px;">
      <div>
        <a href="mailto:[email protected]?subject=My book on TDD for Views is available online" style="margin-right: 0; padding-right: 0;">
	  Reply to <span style="font-weight: 700;">sender</span></a> |
        <a href="mailto:[email protected]?subject=My book on TDD for Views is available online">
	  Reply to <span style="font-weight: 700;">group</span></a> |
        	  <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJwY3VqZTRuBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNTMEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxMjcwMzExMDA5?act=reply&messageNum=1053">Reply <span style="font-weight: 700;">via web post</span></a> |
            	<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJlc2NjOGNjBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI3MDMxMTAwOQ--" style="font-weight: 700;">Start a New Topic</a>
      </div>

                <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/message/1053;_ylc=X3oDMTM0cmd2MG5zBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNTMEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMjcwMzExMDA5BHRwY0lkAzEwNTM-">Messages in this topic</a>
          (<span style="font-weight: 700;">1</span>)
          </div> 
<!------- Start Nav Bar ------>

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #e0ecee; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">
      <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; ">Recent Activity:</span>

    <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
                                                    </ul>
    
  <div style="clear: both; padding-top: 2px; color: #1e66ae;">
    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJlOTJsZTAxBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTI3MDMxMTAwOQ--" style="text-decoration: none;">Visit Your Group</a>
  </div>
</div>

        <div id="ygrp-grft" style="font-family: Verdana; font-size: 12px; padding: 15px 0;">
      
<!-- |**|begin egp html banner|**| -->

      To unsubscribe, email:<BR>
TestFirstUserInterfaces-unsubscribe-hHKSG33TihhbjbujkaE4pw@public.gmane.org<BR>
      
<!-- |**|end egp html banner|**| -->

    </div>
            <div id="ygrp-mkp" style="border: 1px solid #d8d8d8; clear: both; float: left; font-family: Arial; margin: 5px 0 10px 0; padding: 0 10px;">
      <div id="hd" style="color: #628c2a; font-size: 85%; font-weight: 700; line-height: 122%; margin: 10px 0;">MARKETPLACE</div>
      <div id="ads" style="margin-bottom: 10px;">
                  <div class="ad" style="color: #628C2A; font-family: Arial; font-weight: 700; padding: 0 0;">
            <p><a href="http://us.ard.yahoo.com/SIG=15oi88aj1/M=493064.13983314.13965207.13298430/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1270318210/L=60ac489a-3f3b-11df-a3cf-4b31620b206e/B=AmADDmKImiM-/J=1270311010200019/K=VCfWoRouWp.irCbHfg.dxA/A=6046497/R=0/SIG=11jls91tg/*http://advision.webevents.yahoo.com/domorefordogs">Do More for Dogs Group. Connect with other dog owners who do more.</a></p> <script language=javascript>
if(window.yzq_d==null)window.yzq_d=new Object();
window.yzq_d['AmADDmKImiM-']='&U=13c4o9b8c%2fN%3dAmADDmKImiM-%2fC%3d493064.13983314.13965207.13298430%2fD%3dMKP1%2fB%3d6046497%2fV%3d1';
</script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=60ac489a-3f3b-11df-a3cf-4b31620b206e&T=1dhq6h0k9%2fX%3d1270311010%2fE%3d1705007207%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d2970299825%2fH%3dY29udGVudD0iWWFob29fVGVjaDtHbztXaWRnZXRzO1dlYnNpdGVfU2VydmljZXM7UG9kY2FzdHM7RmxpY2tyO1lhaG9vX1NlYXJjaF9NYXJrZXRpbmc7RmluYW5jZTtCcmllZmNhc2U7Q2FsZW5kYXI7IiBkaXNhYmxlc2h1ZmZsaW5nPSIxIiBzZXJ2ZUlkPSI2MGFjNDg5YS0zZjNiLTExZGYtYTNjZi00YjMxNjIwYjIwNmUiIHNpdGVJZD0iMjc5NjA1MSIgdFN0bXA9IjEyNzAzMTEwMTAxOTI5NzYiIA--%2fQ%3d-1%2fS%3d1%2fJ%3d3B5EC442&U=13c4o9b8c%2fN%3dAmADDmKImiM-%2fC%3d493064.13983314.13965207.13298430%2fD%3dMKP1%2fB%3d6046497%2fV%3d1"></noscript>          </div>
                          <div class="ad" style="color: #628C2A; font-family: Arial; font-weight: 700; padding: 0 0;">
                          <hr style="border: 1px solid #d8d8d8;">
                        <p><a href="http://us.ard.yahoo.com/SIG=15oc98fgu/M=493064.13814537.13965224.10835568/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1270318210/L=60ac489a-3f3b-11df-a3cf-4b31620b206e/B=A2ADDmKImiM-/J=1270311010200019/K=VCfWoRouWp.irCbHfg.dxA/A=6042764/R=0/SIG=11jbo19n3/*http://advision.webevents.yahoo.com/momconnection">Welcome to Mom Connection! Share stories, news and more with moms like you.</a></p><script language=javascript>
if(window.yzq_d==null)window.yzq_d=new Object();
window.yzq_d['A2ADDmKImiM-']='&U=13cbn5i03%2fN%3dA2ADDmKImiM-%2fC%3d493064.13814537.13965224.10835568%2fD%3dMKP1%2fB%3d6042764%2fV%3d1';
</script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=60ac489a-3f3b-11df-a3cf-4b31620b206e&T=1dfoutidi%2fX%3d1270311010%2fE%3d1705007207%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d51521499%2fH%3dY29udGVudD0iWWFob29fVGVjaDtHbztXaWRnZXRzO1dlYnNpdGVfU2VydmljZXM7UG9kY2FzdHM7RmxpY2tyO1lhaG9vX1NlYXJjaF9NYXJrZXRpbmc7RmluYW5jZTtCcmllZmNhc2U7Q2FsZW5kYXI7IiBkaXNhYmxlc2h1ZmZsaW5nPSIxIiBzZXJ2ZUlkPSI2MGFjNDg5YS0zZjNiLTExZGYtYTNjZi00YjMxNjIwYjIwNmUiIHNpdGVJZD0iMjc5NjA1MSIgdFN0bXA9IjEyNzAzMTEwMTAxOTI5NzYiIA--%2fQ%3d-1%2fS%3d1%2fJ%3d3B5EC442&U=13cbn5i03%2fN%3dA2ADDmKImiM-%2fC%3d493064.13814537.13965224.10835568%2fD%3dMKP1%2fB%3d6042764%2fV%3d1"></noscript>          </div>
                          <div class="ad" style="color: #628C2A; font-family: Arial; font-weight: 700; padding: 0 0;">
                          <hr style="border: 1px solid #d8d8d8;">
                        <p><a href="http://us.ard.yahoo.com/SIG=15onuri2k/M=493064.14012770.13963757.13298430/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1270318210/L=60ac489a-3f3b-11df-a3cf-4b31620b206e/B=BGADDmKImiM-/J=1270311010200019/K=VCfWoRouWp.irCbHfg.dxA/A=6015306/R=0/SIG=11vlkvigg/*http://advision.webevents.yahoo.com/hobbiesandactivitieszone/">Hobbies & Activities Zone: Find others who share your passions! Explore new interests.</a></p><script language=javascript>
if(window.yzq_d==null)window.yzq_d=new Object();
window.yzq_d['BGADDmKImiM-']='&U=13cb7pp6m%2fN%3dBGADDmKImiM-%2fC%3d493064.14012770.13963757.13298430%2fD%3dMKP1%2fB%3d6015306%2fV%3d1';
</script><noscript><img width=1 height=1 alt="" src="http://us.bc.yahoo.com/b?P=60ac489a-3f3b-11df-a3cf-4b31620b206e&T=1dhnusvl7%2fX%3d1270311010%2fE%3d1705007207%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d2754236505%2fH%3dY29udGVudD0iWWFob29fVGVjaDtHbztXaWRnZXRzO1dlYnNpdGVfU2VydmljZXM7UG9kY2FzdHM7RmxpY2tyO1lhaG9vX1NlYXJjaF9NYXJrZXRpbmc7RmluYW5jZTtCcmllZmNhc2U7Q2FsZW5kYXI7IiBkaXNhYmxlc2h1ZmZsaW5nPSIxIiBzZXJ2ZUlkPSI2MGFjNDg5YS0zZjNiLTExZGYtYTNjZi00YjMxNjIwYjIwNmUiIHNpdGVJZD0iMjc5NjA1MSIgdFN0bXA9IjEyNzAzMTEwMTAxOTI5NzYiIA--%2fQ%3d-1%2fS%3d1%2fJ%3d3B5EC442&U=13cb7pp6m%2fN%3dBGADDmKImiM-%2fC%3d493064.14012770.13963757.13298430%2fD%3dMKP1%2fB%3d6015306%2fV%3d1"></noscript>          </div>
              </div>
    </div>
  
<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkam1yaHFyBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMjcwMzExMDA5" style="float: left;"><img src="http://l.yimg.com/a/i/us/yg/logo/us.gif" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;">Switch to: <a href="mailto:TestFirstUserInterfaces-traditional-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Change Delivery Format: Traditional" style="text-decoration: none;">Text-Only</a>, <a href="mailto:TestFirstUserInterfaces-digest-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Email Delivery: Digest" class="margin-rt" style="text-decoration: none;">Daily Digest</a> &bull; <a href="mailto:TestFirstUserInterfaces-unsubscribe-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> &bull; <a href="http://docs.yahoo.com/info/terms/" style="text-decoration: none;">Terms of Use</a></div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=8744704/grpspId=1705007207/msgId=1053/stime=1270311009/nc1=4507179/nc2=3848641/nc3=5191955" width="1" height="1"> <br>

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  a {
    color: #1e66ae;
  }

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
  
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.file-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }

  #ygrp-mlmsg a {
    color: #1E66AE;
  }

  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  } 

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--hfnU9rkRi7waufJbZf02WbmYuzQfsgJRRpR0Umk--