[TFUI] doesn't... even... have... assert... match
Phlip <[email protected]> Fri, 06 Nov 2009 04:49:08 -0800
| Newsgroups | gmane.comp.programming.test-first-user-interfaces |
|---|---|
| Message-ID | <[email protected]> |
--yKwuRf09VsAi6DGyPy2aGmHIgIyVAu7rAZsNtwn
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
[sorry about the premature submit!]
TFUI:
Testing views is not always about testing thru-the-view, like capture-playback
tests, or Watir or Selenium tests, that drive user interfaces.
It's about writing unit tests directly into the layer that runs the view. To get
there, you must treat controls as objects, and learn to bypass your
GUI's event loop.
One of the leading examples of TFUI is Ruby on Rails, and its exemplary support
for unit tests HTML views. When a unit test collects the HTML that would have
traveled out the web server, it can parse it to spot the programmatic details.
In RoR, anything you write into an HTML template with <%= %>, you should
generally specify with a test. This "MockTheServer" pattern bypasses the web
server's and browser's event loops.
This pattern allows your tests to lead development. You can write them first, to
force your view to upgrade. That achieves TFUI.
So now we come to Django, another fine web platform that both learns from and
teaches RoR a thing or two about pragmatism. Its developer test rig allows us to
simulate page generation, collect the HTML, and parse it back.
In theory. I have only begun to study Django, but I suspect it doesn't have the
equivalent of assert_select(), to fetch up HTML elements via CSS selector. (And
it certainly has no assert_xpath() or assert_xhtml()!;)
Do any Djangoists in the house have any confessions to make here? any explainin'
to do? or any code samples I have missed? I have yet to find any difference
between today's pyunit and the one I used in 2002!
--
Phlip
http://c2.com/cgi/wiki?ZeekLand
--yKwuRf09VsAi6DGyPy2aGmHIgIyVAu7rAZsNtwn
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: #fff;">
<span style="display:none"> </span>
<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
<div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->
<div id="ygrp-text" >
<p>[sorry about the premature submit!]<br>
<br>
TFUI:<br>
<br>
Testing views is not always about testing thru-the-view, like capture-playback <br>
tests, or Watir or Selenium tests, that drive user interfaces.<br>
<br>
It's about writing unit tests directly into the layer that runs the view. To get<br>
there, you must treat controls as objects, and learn to bypass your<br>
GUI's event loop.<br>
<br>
One of the leading examples of TFUI is Ruby on Rails, and its exemplary support<br>
for unit tests HTML views. When a unit test collects the HTML that would have <br>
traveled out the web server, it can parse it to spot the programmatic details. <br>
In RoR, anything you write into an HTML template with <%= %>, you should <br>
generally specify with a test. This "MockTheServer" pattern bypasses the web <br>
server's and browser's event loops.<br>
<br>
This pattern allows your tests to lead development. You can write them first, to <br>
force your view to upgrade. That achieves TFUI.<br>
<br>
So now we come to Django, another fine web platform that both learns from and <br>
teaches RoR a thing or two about pragmatism. Its developer test rig allows us to <br>
simulate page generation, collect the HTML, and parse it back.<br>
<br>
In theory. I have only begun to study Django, but I suspect it doesn't have the <br>
equivalent of assert_select(<wbr>), to fetch up HTML elements via CSS selector. (And <br>
it certainly has no assert_xpath(<wbr>) or assert_xhtml(<wbr>)!;)<br>
<br>
Do any Djangoists in the house have any confessions to make here? any explainin' <br>
to do? or any code samples I have missed? I have yet to find any difference <br>
between today's pyunit and the one I used in 2002!<br>
<br>
-- <br>
Phlip<br>
<a href="http://c2.com/cgi/wiki?ZeekLand">http://c2.com/<wbr>cgi/wiki?<wbr>ZeekLand</a><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=doesn't... even... have... assert... match">
Reply to <span style="font-weight: 700;">sender</span></a>
| <a href="mailto:[email protected]?subject=doesn't... even... have... assert... match">
Reply to <span style="font-weight: 700;">group</span></a>
</div>
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/message/1051;_ylc=X3oDMTM0dW1pZnY1BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BG1zZ0lkAzEwNTEEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMjU3NTExODEzBHRwY0lkAzEwNTE-">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;">
<li style="border-right: 1px solid #000; font-weight: 700; display: inline; padding: 0 5px; margin-left: 0;">
<span class="cat"><a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/members;_ylc=X3oDMTJmOHR1YTgzBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEyNTc1MTE4MTM-?o=6" style="text-decoration: none;">New Members</a></span>
<span class="ct" style="color: #ff7900;">1</span>
</li>
</ul>
<div style="clear: both; padding-top: 2px; color: #1e66ae;">
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces;_ylc=X3oDMTJlOGthaDdpBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTI1NzUxMTgxMw--" style="border-right: 1px solid #000; padding-right: 5px; margin-right: 2px; text-decoration: none;">Visit Your Group</a>
<a href="http://groups.yahoo.com/group/TestFirstUserInterfaces/post;_ylc=X3oDMTJlZTQybTE0BF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI1NzUxMTgxMw--" style="font-weight: 700; text-decoration: none;">Start a New Topic</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;">
<a href="http://us.ard.yahoo.com/SIG=14kv31h68/M=493064.12016295.13271503.10835568/D=groups/S=1705007207:MKP1/Y=YAHOO/EXP=1257519013/L=/B=3j5ZJ0PDhF4-/J=1257511813214315/K=TNpm7fFwPiWpRRMrqi5zfw/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>
<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=X3oDMTJkMGhidDMyBF9TAzk3MzU5NzE0BGdycElkAzg3NDQ3MDQEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMjU3NTExODEz" 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> • <a href="mailto:TestFirstUserInterfaces-unsubscribe-hHKSG33TihhbjbujkaE4pw@public.gmane.org?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> • <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=1051/stime=1257511813/nc1=4507179/nc2=3848643/nc3=5733770" 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 -->
--yKwuRf09VsAi6DGyPy2aGmHIgIyVAu7rAZsNtwn--