Re: [TFUI] Test-driving ASP.NET

Rick Mugridge <[email protected]> Thu, 08 Nov 2007 09:52:09 +1300
Newsgroups gmane.comp.programming.test-first-user-interfaces
Organization Rimu Research
Message-ID <[email protected]>
--sxtl7RlGYgDPUVrTsamMHOf2lY7qJXWt0wxs1S8
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Hi Rob,
> On the agile-testing list, I've been gathering info WRT acceptance
> tests for this and comparing WatiR, WatiN, Selenium, etc...
>
> So now I've noticed that our WatiN tests are very slow. (We have some
> NUnitAsp tests too which are worse.) We have 100s+ tests in FitNesse
> that take about 80s to run. And <10 in WatiN that take about 80s to
> run.
Yes, UI tests are very slow, whether it's web-based or GUI. That's one 
of the big problems with them. Sometimes you're forced to decide on 
timeout periods, and so have to balance speed against spurious fails. 
The other problem is that the UI tests are verbose and tend to be 
fragile under changes to the UI (I'm working on solving this problem).
>
> So I'm theorizing that Fit tests are really going to be the stronger
> set. It'll be 1 layer down, but as long as we do some sort of MVC/MVP
> or simple command pattern, we only won't be testing the client-side
> validation. I'm debating whether or not those tests are even worth
> writing? Especially if for example, we submit some form and the server
> side validates fields as well.
I recommend using Fit for testing below the UI layer. Then have some 
UI-based tests that verify end-to-end behavior, so that pages are 
'wired" together correctly, etc.

If the UI tests are too slow, you can run a two-stage build process, 
with fast feedback from Fit storytests. I've also had success with 
running lots of Selenium tests in parallel.
>
> Furthermore, for reuse of the validation logic, I'm leaning towards
> less JavaScript in the page for AJAX calls that get their results from
> the server.
That's a tricky one, as Fit is only good for validating logic on the 
server. I'd use Javascript unit tests for testing the AJAX and 
validation logic in Javascript. And, again, have some UI tests to check 
end-to-end.

Cheers, Rick

PS, if GWT was used, the Java code intended for translation to 
Javascript could be tested with Fit
>
> Thoughts?
> Comments?
>
> .rob.



--sxtl7RlGYgDPUVrTsamMHOf2lY7qJXWt0wxs1S8
Content-Type: text/html; charset=ISO-8859-1
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: #ffffff;">

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="width:655px; position:relative;">
  <div id="ygrp-msg" style="width: 490px; padding: 0 15px 0 0; float:left;  z-index:1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text">
            <p>Hi Rob,<br>
&gt; On the agile-testing list, I've been gathering info WRT acceptance<br>
&gt; tests for this and comparing WatiR, WatiN, Selenium, etc...<br>
&gt;<br>
&gt; So now I've noticed that our WatiN tests are very slow. (We have some<br>
&gt; NUnitAsp tests too which are worse.) We have 100s+ tests in FitNesse<br>
&gt; that take about 80s to run. And &lt;10 in WatiN that take about 80s to<br>
&gt; run.<br>
Yes, UI tests are very slow, whether it's web-based or GUI. That's one <br>
of the big problems with them. Sometimes you're forced to decide on <br>
timeout periods, and so have to balance speed against spurious fails. <br>
The other problem is that the UI tests are verbose and tend to be <br>
fragile under changes to the UI (I'm working on solving this problem).<br>
&gt;<br>
&gt; So I'm theorizing that Fit tests are really going to be the stronger<br>
&gt; set. It'll be 1 layer down, but as long as we do some sort of MVC/MVP<br>
&gt; or simple command pattern, we only won't be testing the client-side<br>
&gt; validation. I'm debating whether or not those tests are even worth<br>
&gt; writing? Especially if for example, we submit some form and the server<br>
&gt; side validates fields as well.<br>
I recommend using Fit for testing below the UI layer. Then have some <br>
UI-based tests that verify end-to-end behavior, so that pages are <br>
'wired&quot; together correctly, etc.<br>
<br>
If the UI tests are too slow, you can run a two-stage build process, <br>
with fast feedback from Fit storytests. I've also had success with <br>
running lots of Selenium tests in parallel.<br>
&gt;<br>
&gt; Furthermore, for reuse of the validation logic, I'm leaning towards<br>
&gt; less JavaScript in the page for AJAX calls that get their results from<br>
&gt; the server.<br>
That's a tricky one, as Fit is only good for validating logic on the <br>
server. I'd use Javascript unit tests for testing the AJAX and <br>
validation logic in Javascript. And, again, have some UI tests to check <br>
end-to-end.<br>
<br>
Cheers, Rick<br>
<br>
PS, if GWT was used, the Java code intended for translation to <br>
Javascript could be tested with Fit<br>
&gt;<br>
&gt; Thoughts?<br>
&gt; Comments?<br>
&gt;<br>
&gt; .rob.<br>
<br>
</p>
    </div>  

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <span width="1" style="color: white;">__._,_.___</span>
    <!-- Start the section with Message In topic -->
    <div id="ygrp-actbar">
              <span class="left">
          <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/message/999;_ylc=X3oDMTMzYnU3bzhqBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwMDAEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMTk0NDY4ODI2BHRwY0lkAzk5OQ--">
            Messages in this topic          </a> (<span class="bld">0</span>)
        </span>
        <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJwYTdzZXNuBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwMDAEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxMTk0NDY4ODI2?act=reply&messageNum=1000">
          <span class="bld">
            Reply          </span> (via web post)
        </a>  | 
        <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJlcWE3b2w3BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTE5NDQ2ODgyNg--" class="bld">
          Start a new topic        </a>
          </div> 
    <!-------     Start Nav Bar  ------>
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-vitnav">
                <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/messages;_ylc=X3oDMTJlbmlkYjh1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21zZ3MEc3RpbWUDMTE5NDQ2ODgyNg--">Messages</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/files;_ylc=X3oDMTJma25xbGpvBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2ZpbGVzBHN0aW1lAzExOTQ0Njg4MjY-">Files</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/photos;_ylc=X3oDMTJlZDZqazdoBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3Bob3QEc3RpbWUDMTE5NDQ2ODgyNg--">Photos</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/links;_ylc=X3oDMTJmM2MybjFxBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2xpbmtzBHN0aW1lAzExOTQ0Njg4MjY-">Links</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/database;_ylc=X3oDMTJjczE4bm5qBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2RiBHN0aW1lAzExOTQ0Njg4MjY-">Database</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/polls;_ylc=X3oDMTJmMjVsb2dvBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3BvbGxzBHN0aW1lAzExOTQ0Njg4MjY-">Polls</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/members;_ylc=X3oDMTJlaGlpaHFjBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21icnMEc3RpbWUDMTE5NDQ2ODgyNg--">Members</a>  
            |    <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/calendar;_ylc=X3oDMTJkMW9mN2Y1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2NhbARzdGltZQMxMTk0NDY4ODI2">Calendar</a>  
    </div>  
    <!-- |**|end egp html banner|**| -->

                <div id="ygrp-grft">
                  

              </div>
    
    <!-- yahoo logo -->
    <!-- |**|begin egp html banner|**| -->
    <div id="ygrp-ft">
      <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkYjlrcWVlBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMTk0NDY4ODI2">
      <img src="http://us.i1.yimg.com/us.yimg.com/i/yg/img/logo/ma_grp_160.gif" height="15" width="106" border="0" alt="Yahoo! Groups"></a> <br>
      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/join;_ylc=X3oDMTJmNHJhZWI1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3N0bmdzBHN0aW1lAzExOTQ0Njg4MjY-">Change settings via the Web</a> (Yahoo! ID required) <br>
      Change settings via email: <a href="mailto:TestFirstUserInterfaces-digest-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Email Delivery: Digest">Switch delivery to Daily Digest</a> | <a href = "mailto:TestFirstUserInterfaces-traditional-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Change Delivery Format: Traditional">Switch format to Traditional</a> <br>

      <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJkbDBydm9hBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2hwZgRzdGltZQMxMTk0NDY4ODI2">
        Visit Your Group 
      </a> |
      <a href="http://docs.yahoo.com/info/terms/">
        Yahoo! Groups Terms of Use      </a> |
      <a href="mailto:TestFirstUserInterfaces-unsubscribe-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=">
        Unsubscribe      </a> 
    </div>     <!-- |**|end egp html banner|**| -->
  </div> <!-- ygrp-msg -->

  
  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:140px;float: left; clear: none; margin-left: 5px; background:white; margin-bottom:25px ;position:absolute; top:0; right: 0;">
    <!-- Network content -->
    
    <!-- Start vitality -->
    <div id="ygrp-vital">
            <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJlNWIxOW1yBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTE5NDQ2ODgyNg--">
        Visit Your Group      </a>
    </div> 
              
    <!-- Network content -->
              <div id="nc">
              <div class="ad">
                      <div id="hd1">Yahoo! Finance</div> 
<p><a href="http://us.ard.yahoo.com/SIG=12j1tcb96/M=493064.10729649.11333340.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1194476026/A=4507179/R=0/SIG=12de4rskk/*http://us.rd.yahoo.com/evt=50284/*http://finance.yahoo.com/personal-finance">It's Now Personal</a></p> 
<p>Guides, news,</p> 
<p>advice & more.</p>                   </div>
                    <div class="ad">
                      <div id="hd1">Official Samsung</div> 
<p><a href="http://us.ard.yahoo.com/SIG=12jdc9vgj/M=493064.10972170.11554072.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1194476026/A=4706133/R=0/SIG=11f8fj6tf/*http://tech.groups.yahoo.com/group/samsunghd/">Yahoo! Group for</a></p> 
<p>supporting your</p> 
<p>HDTVs and devices.</p>                  </div>
                    <div class="ad">
                      <div id="hd1">Popular Y! Groups</div> 
<p><a href="http://us.ard.yahoo.com/SIG=12jrei1su/M=493064.11127061.11695037.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1194476026/A=4763761/R=0/SIG=11ou7otip/*http://advision.webevents.yahoo.com/bestofyahoogroups/">Is your group one&#63;</a></p> 
<p>Check it out and</p> 
<p>see.</p>                  </div>
          </div>
    
  </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=1000/stime=1194468826/nc1=4507179/nc2=4706133/nc3=4763761" width="1" height="1"> <br>

<span  style="color: white;">__,_._,___</span>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</body>
<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
<style type="text/css">
<!--
#ygrp-mkp{
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 14px 0px;
  padding: 0px 14px;
}
#ygrp-mkp hr{
  border: 1px solid #d8d8d8;
}
#ygrp-mkp #hd{
  color: #628c2a;
  font-size: 85%;
  font-weight: bold;
  line-height: 122%;
  margin: 10px 0px;
}
#ygrp-mkp #ads{
  margin-bottom: 10px;
}
#ygrp-mkp .ad{
  padding: 0 0;
}
#ygrp-mkp .ad a{
  color: #0000ff;
  text-decoration: none;
}
-->
</style>
</head>
<head>
<style type="text/css">
<!--
#ygrp-sponsor #ygrp-lc{
  font-family: Arial;
}
#ygrp-sponsor #ygrp-lc #hd{
  margin: 10px 0px;
  font-weight: bold;
  font-size: 78%;
  line-height: 122%;
}
#ygrp-sponsor #ygrp-lc .ad{
  margin-bottom: 10px;
  padding: 0 0;
}
-->
</style>
</head>
<head>
<style type="text/css">
<!--
#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-text{
    font-family: Georgia;	
}
#ygrp-text p{
    margin: 0 0 1em 0;
}
#ygrp-tpmsgs{
    font-family: Arial;	
    clear: both;
}
#ygrp-vitnav{
	padding-top: 10px;
	font-family: Verdana;
	font-size: 77%;
	margin: 0;
}
#ygrp-vitnav a{
	padding: 0 1px;
}
#ygrp-actbar{
	clear: both;
	margin: 25px 0;
	white-space:nowrap;
	color: #666;
	text-align: right;
}
#ygrp-actbar .left{
	float: left;
	white-space:nowrap;
}
.bld{font-weight:bold;}
#ygrp-grft{
	font-family: Verdana;
	font-size: 77%;
	padding: 15px 0;
}
#ygrp-ft{
  font-family: verdana;
  font-size: 77%;
  border-top: 1px solid #666; 
  padding: 5px 0; 
}
#ygrp-mlmsg #logo{
  padding-bottom: 10px;
}

#ygrp-vital{
	background-color: #e0ecee;
	margin-bottom: 20px;
	padding: 2px 0 8px 8px;
}
#ygrp-vital #vithd{
	font-size: 77%;
	font-family: Verdana;
	font-weight: bold;
	color: #333;
	text-transform: uppercase;
}
#ygrp-vital ul{
	padding: 0;
	margin: 2px 0;
}
#ygrp-vital ul li{
  list-style-type: none;
  clear: both;
  border: 1px solid #e0ecee;  
}
#ygrp-vital ul li .ct{
  font-weight: bold;
  color: #ff7900;
  float: right;
  width: 2em;
  text-align:right;
  padding-right: .5em;
}
#ygrp-vital ul li .cat{
  font-weight: bold;
}
#ygrp-vital a{
	text-decoration: none;
}

#ygrp-vital a:hover{
  text-decoration: underline;
}

#ygrp-sponsor #hd{
	color: #999;
	font-size: 77%;
}
#ygrp-sponsor #ov{
	padding: 6px 13px;
	background-color: #e0ecee;
	margin-bottom: 20px;
}
#ygrp-sponsor #ov ul{
	padding: 0 0 0 8px;
	margin: 0;
}
#ygrp-sponsor #ov li{
	list-style-type: square;
	padding: 6px 0;
	font-size: 77%;
}
#ygrp-sponsor #ov li a{
	text-decoration: none;
	font-size: 130%;
}
#ygrp-sponsor #nc{
  background-color: #eee;
  margin-bottom: 20px;
  padding: 0 8px;
}
#ygrp-sponsor .ad{
	padding: 8px 0;
}
#ygrp-sponsor .ad #hd1{
	font-family: Arial;
	font-weight: bold;
	color: #628c2a;
	font-size: 100%;
	line-height: 122%;
}
#ygrp-sponsor .ad a{
	text-decoration: none;
}
#ygrp-sponsor .ad a:hover{
	text-decoration: underline;
}
#ygrp-sponsor .ad p{
	margin: 0;
}
o{font-size: 0; }
.MsoNormal{
   margin: 0 0 0 0;
}
#ygrp-text tt{
  font-size: 120%;
}
blockquote{margin: 0 0 0 4px;}
.replbq{margin:4}
-->
</style>
</head>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</html><!--End group email -->


--sxtl7RlGYgDPUVrTsamMHOf2lY7qJXWt0wxs1S8--