[TFUI] Re: [agile-testing] Unit Testing the Presentation Layer
Phlip <[email protected]> Thu, 11 Jun 2009 14:41:32 -0700
| Newsgroups | gmane.comp.programming.test-first-user-interfaces,gmane.comp.misc.agile.testing |
|---|---|
| Message-ID | <[email protected]> |
--XulcS903wesi6H8xoOInTyDyK3JeQDeJTv4Bcrt
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
John Overbaugh wrote:
> One of the challenges we are facing at Medicity is implementing unit
> tests which validate the logic in various layers. Right now, for
> instance, a lot of logic is in stored procedures and our code just
> bubbles that data up. We're working on refactoring that logic into the
> business logic layer, where it'll be more easily unit tested. Another
> problem we face, however, is unit testing the work done in the
> presentation layer. We have implemented various versions of
> .NET/ASP/ASPX and Ajax, so our presentation layer is chock-full of
> session management, some data manipulation/event handling, view state
> management and other Ajax functionality. I've been digging around and I
> have found a lot of stuff on the Web proving a lot of companies are
> grappling with this issue, but no really solid suggestions.
Will ASP allow you to cook a web page without sending it over the wire?
If you Mock The Server, you can then test - even TDD - by writing assertions
that parse the HTML back and extract the inserted data.
You are not testing that the page renders correctly. (That's okay, because you
are not writing the web browser itself.) You are affirming that when you
refactor the page will continue to render the same way it did before.
> I haven't looked at our code yet, but apparently there was some
> investigation into integrating Webaii as a headless test running in
> Cruise Control. Right now, I'd be happy to just have tests running on
> developer machines prior to check-in!
>
> Does anyone have a good solution they can talk about? What are some
> directions I can take to develop either a headless or a low-impact unit
> test framework, which can validate the presentation layer when it's a
> very dynamic layer?
Some web stacks don't let you Mock The Server, because they don't want you to
replace >cough< IIS with some other server. These corporate games should never
hold projects hostile...
--
Phlip
--XulcS903wesi6H8xoOInTyDyK3JeQDeJTv4Bcrt
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: 470px; margin:0; padding:0 25px 0 0; float:left; z-index:1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->
<div id="ygrp-text" >
<!--~-|**|PrettyHtmlStart|**|-~-->
<br><br>
<!--~-|**|PrettyHtmlEnd|**|-~-->
<p>John Overbaugh wrote:<br>
<br>
> One of the challenges we are facing at Medicity is implementing unit <br>
> tests which validate the logic in various layers. Right now, for <br>
> instance, a lot of logic is in stored procedures and our code just <br>
> bubbles that data up. We're working on refactoring that logic into the <br>
> business logic layer, where it'll be more easily unit tested. Another <br>
> problem we face, however, is unit testing the work done in the <br>
> presentation layer. We have implemented various versions of <br>
> .NET/ASP/ASPX and Ajax, so our presentation layer is chock-full of <br>
> session management, some data manipulation/<wbr>event handling, view state <br>
> management and other Ajax functionality. I've been digging around and I <br>
> have found a lot of stuff on the Web proving a lot of companies are <br>
> grappling with this issue, but no really solid suggestions.<br>
<br>
Will ASP allow you to cook a web page without sending it over the wire?<br>
<br>
If you Mock The Server, you can then test - even TDD - by writing assertions <br>
that parse the HTML back and extract the inserted data.<br>
<br>
You are not testing that the page renders correctly. (That's okay, because you <br>
are not writing the web browser itself.) You are affirming that when you <br>
refactor the page will continue to render the same way it did before.<br>
<br>
> I haven't looked at our code yet, but apparently there was some <br>
> investigation into integrating Webaii as a headless test running in <br>
> Cruise Control. Right now, I'd be happy to just have tests running on <br>
> developer machines prior to check-in!<br>
> <br>
> Does anyone have a good solution they can talk about? What are some <br>
> directions I can take to develop either a headless or a low-impact unit <br>
> test framework, which can validate the presentation layer when it's a <br>
> very dynamic layer?<br>
<br>
Some web stacks don't let you Mock The Server, because they don't want you to <br>
replace >cough< IIS with some other server. These corporate games should never <br>
hold projects hostile...<br>
<br>
-- <br>
Phlip<br>
</p>
</div>
<!--~-|**|PrettyHtmlStart|**|-~-->
<div width="1" style="color: white; clear: both;">__._,_.___</div>
<!-- Start the section with Message In topic -->
<div id="ygrp-actbar" style="clear: both; margini-bottom: 25px; white-space:nowrap; color: #666; text-align: right;">
<span class="left" style="float: left; white-space:nowrap;">
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/message/1043;_ylc=X3oDMTM0aGc2MjVnBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNDMEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMjQ0NzczNDY3BHRwY0lkAzEwNDM-">
Messages in this topic </a> (<span class="bld" style="font-weight:bold;">1</span>)
</span>
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJwZWc5ZTZoBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNDMEc2VjA2Z0cgRzbGsDcnBseQRzdGltZQMxMjQ0NzczNDY3?act=reply&messageNum=1043">
<span class="bld" style="font-weight:bold;">
Reply </span> (via web post)
</a> |
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJlc2NraG91BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI0NDc3MzQ2Nw--" class="bld" style="font-weight:bold;">
Start a new topic </a>
</div>
<!------- Start Nav Bar ------>
<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vitnav" style="padding-top: 10px; font-family: Verdana; font-size: 77%; margin: 0;">
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/messages;_ylc=X3oDMTJlNTFsMmdpBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21zZ3MEc3RpbWUDMTI0NDc3MzQ2Nw--">Messages</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/files;_ylc=X3oDMTJmY2t1anQ3BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2ZpbGVzBHN0aW1lAzEyNDQ3NzM0Njc-">Files</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/photos;_ylc=X3oDMTJlMHAwZjZoBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3Bob3QEc3RpbWUDMTI0NDc3MzQ2Nw--">Photos</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/links;_ylc=X3oDMTJmMzA4ZW1uBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2xpbmtzBHN0aW1lAzEyNDQ3NzM0Njc-">Links</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/database;_ylc=X3oDMTJjODVpMWU3BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2RiBHN0aW1lAzEyNDQ3NzM0Njc-">Database</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/polls;_ylc=X3oDMTJmNWM2aHBqBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3BvbGxzBHN0aW1lAzEyNDQ3NzM0Njc-">Polls</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/members;_ylc=X3oDMTJlbGw5dXU0BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA21icnMEc3RpbWUDMTI0NDc3MzQ2Nw--">Members</a>
| <a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/calendar;_ylc=X3oDMTJkazhpbnY2BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2NhbARzdGltZQMxMjQ0NzczNDY3">Calendar</a>
</div>
<!-- |**|end egp html banner|**| -->
<div id="ygrp-grft" style="font-family: Verdana; font-size: 77%; padding: 15px 0;">
</div>
<div id="ygrp-mkp">
<div id="hd">MARKETPLACE</div>
<div id="ads">
<div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
<a href="http://us.ard.yahoo.com/SIG=14kqj623n/M=733250.13450162.13535738.10835568/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1244780667/L=/B=YhZ3AEPDhEc-/J=1244773467933405/K=oABbk1SJdXjltZw.3sZBXQ/A=5754786/R=0/SIG=12eblfli8/*http://www.socialtrack.net/redir.aspx?CID=18601&AFID=43106&DID=81069&SID=350">I Make $350 per Day. Learn how I make 10k a month after I Got Fired!.</a> </div>
<div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
<hr size=1 noshade>
<a href="http://us.ard.yahoo.com/SIG=14klo3ibd/M=733250.13450161.13535737.10835568/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1244780667/L=/B=YxZ3AEPDhEc-/J=1244773467933405/K=oABbk1SJdXjltZw.3sZBXQ/A=5754783/R=0/SIG=12havo8bp/*http://www.socialtrack.net/redir.aspx?CID=24801&AFID=43106&DID=108590&SID=group">How Many Triangles? 92.6% of Americans Fail this Question!.</a> </div>
<div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
<hr size=1 noshade>
<a href="http://us.ard.yahoo.com/SIG=14kon1s0r/M=493064.12016295.13271503.10835568/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1244780667/L=/B=ZBZ3AEPDhEc-/J=1244773467933405/K=oABbk1SJdXjltZw.3sZBXQ/A=5697381/R=0/SIG=11eaa5dke/*http://groups.yahoo.com/group/mompowergroup/">Mom Power: Discover the community of moms doing more for their families, for the world and for each other</a> </div>
</div>
</div>
<!-- yahoo logo -->
<!-- |**|begin egp html banner|**| -->
<div id="ygrp-ft" style="font-family: verdana; font-size: 77%; border-top: 1px solid #666; padding: 5px 0;">
<a href="http://groups.yahoo.com/;_ylc=X3oDMTJkam9tNGxvBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMjQ0NzczNDY3">
<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=X3oDMTJmbTRtbTFjBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA3N0bmdzBHN0aW1lAzEyNDQ3NzM0Njc-">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=X3oDMTJkNGVrZzlqBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2hwZgRzdGltZQMxMjQ0NzczNDY3">
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:160px; float:right; clear:none; margin:0 0 25px 0; background: white;">
<!-- Network content -->
<!-- Start Recommendations -->
<div id="ygrp-reco">
</div>
<!-- End Recommendations -->
<!-- Start vitality -->
<div id="ygrp-vital" style="background-color: #e0ecee; margin-bottom: 20px; padding: 2px 0 8px 8px;">
<div id="vithd" style="font-size: 77%; font-family: Verdana; font-weight: bold; color: #333; text-transform: uppercase;">Recent Activity</div>
<ul style="list-style-type:none; padding: 0; margin: 2px 0;">
<li style="clear: both; list-style-type: none; border: 1px solid #e0ecee;">
<div class="ct" style="float: right; font-weight: bold; color: #ff7900; float: right; width: 2em; text-align:right; padding-right: .5em;"><span style="display:none"> </span>1</div>
<div class="cat" style="font-weight: bold;"><a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/members;_ylc=X3oDMTJmcDVqNG41BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEyNDQ3NzM0Njc-">New Members</a></div>
</li>
</ul>
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJlZnNuM3NmBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTI0NDc3MzQ2Nw--">
Visit Your Group </a>
</div>
<!-- Network content -->
<div style="background-color:#EEEEEE; margin-bottom:20px; padding:10px 8px;"> <div id="nc">
<div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
<div id="hd1">Yahoo! Finance</div>
<p><a href="http://us.ard.yahoo.com/SIG=14hdgg7ob/M=493064.12016257.12445664.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1244780667/L=/B=ZRZ3AEPDhEc-/J=1244773467933405/K=oABbk1SJdXjltZw.3sZBXQ/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" style="color:#628C2A; font-family:Arial; font-weight:bold;">
<div id="hd1">Need traffic?</div>
<p><a href="http://us.ard.yahoo.com/SIG=14h2ac36j/M=493064.12016308.12445700.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1244780667/L=/B=ZhZ3AEPDhEc-/J=1244773467933405/K=oABbk1SJdXjltZw.3sZBXQ/A=3848644/R=0/SIG=131l83flq/*http://searchmarketing.yahoo.com/arp/srchv2.php?o=US2006&cmp=Yahoo&ctv=Groups5&s=Y&s2=&s3=&b=50">Drive customers</a></p>
<p>With search ads</p>
<p>on Yahoo!</p> </div>
<div class="ad" style="color:#628C2A; font-family:Arial; font-weight:bold;">
<div id="hd1">Yahoo! Groups</div>
<p><a href="http://us.ard.yahoo.com/SIG=14hq2ubri/M=493064.12662708.12980600.8674578/D=groups/S=1705007207:NC/Y=YAHOO/EXP=1244780667/L=/B=ZxZ3AEPDhEc-/J=1244773467933405/K=oABbk1SJdXjltZw.3sZBXQ/A=5349275/R=0/SIG=11nhsqmjq/*http://advision.webevents.yahoo.com/EverydayWellness/">Everyday Wellness Zone</a></p>
<p>Check out featured</p>
<p>healthy living groups.</p> </div>
</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=1043/stime=1244773467/nc1=4507179/nc2=3848644/nc3=5349275" width="1" height="1"> <br>
<div style="color: white; clear: both;">__,_._,___</div>
<!--~-|**|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;
}
dd.last p a {
font-family: Verdana;
font-weight: bold;
}
#ygrp-vitnav{
padding-top: 10px;
font-family: Verdana;
font-size: 77%;
margin: 0;
}
#ygrp-vitnav a{
padding: 0 1px;
}
#ygrp-mlmsg #logo{
padding-bottom: 10px;
}
#ygrp-reco {
margin-bottom: 20px;
padding: 0px;
}
#ygrp-reco #reco-head {
font-weight: bold;
color: #ff7900;
}
#reco-category{
font-size: 77%;
}
#reco-desc{
font-size: 77%;
}
#ygrp-vital a{
text-decoration: none;
}
#ygrp-vital a:hover{
text-decoration: underline;
}
#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;
font-weight: normal;
color: #000000;
}
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}
dd.last p span {
margin-right: 10px;
font-family: Verdana;
font-weight: bold;
}
dd.last p span.yshortcuts {
margin-right: 0;
}
div.photo-title a,
div.photo-title a:active,
div.photo-title a:hover,
div.photo-title a:visited {
text-decoration: none;
}
div.file-title a,
div.file-title a:active,
div.file-title a:hover,
div.file-title a:visited {
text-decoration: none;
}
#ygrp-msg p#attach-count {
clear: both;
padding: 15px 0 3px 0;
overflow: hidden;
}
#ygrp-msg p#attach-count span {
color: #1E66AE;
font-weight: bold;
}
div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
font-family: Verdana;
font-size: 10px;
font-weight: normal;
}
#ygrp-msg p a {
font-family: Verdana;
font-size: 10px;
}
#ygrp-mlmsg a {
color: #1E66AE;
}
div.attach-table div div a {
text-decoration: none;
}
div.attach-table {
width: 400px;
}
-->
</style>
</head>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</html><!--End group email -->
--XulcS903wesi6H8xoOInTyDyK3JeQDeJTv4Bcrt--