<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-12467669.post399787451062068332..comments</id><updated>2011-07-21T08:38:03.465-04:00</updated><category term='RailsConf2007'/><category term='books'/><category term='validations'/><category term='hash'/><category term='mocha'/><category term='codeline management'/><category term='contains?'/><category term='gui patterns'/><category term='include'/><category term='array'/><category term='expectations'/><category term='module'/><category term='restarting'/><category term='TDD'/><category term='memfn'/><category term='extension'/><category term='not'/><category term='rails'/><category term='rss'/><category term='unless'/><category term='one assertion per test'/><category term='Testing Refactorings'/><category term='validatable'/><category term='patch'/><category term='poro'/><category term='arbs'/><category term='java'/><category term='anti-pattern'/><category term='singleton class'/><category term='success'/><category term='RailsConf07'/><category term='InfoQ'/><category term='MMS'/><category term='lambda'/><category term='gems'/><category term='method_missing'/><category term='good to great'/><category term='goruco'/><category term='staying current'/><category term='class_eval'/><category term='initial development time'/><category term='code ownership'/><category term='controller'/><category term='interview'/><category term='iPhone'/><category term='state based'/><category term='starting'/><category term='functional testing'/><category term='expressive software'/><category term='unit testing'/><category term='mac os-x'/><category term='parameter'/><category term='static typing'/><category term='principle of least surprise'/><category term='subversion'/><category term='ruby'/><category term='pressure'/><category term='gotham ruby conference'/><category term='blocks'/><category term='podcast'/><category term='ActiveRecord'/><category term='Selenium'/><category term='DRY'/><category term='ActionScript'/><category term='essence'/><category term='eval'/><category term='web sockets'/><category term='sqldsl'/><category term='get-in'/><category term='arrogance'/><category term='Business Natural Language'/><category term='login error'/><category term='language adoption'/><category term='leadership'/><category term='java interop'/><category term='routes'/><category term='apprentice'/><category term='frameworks'/><category term='initialize_with'/><category term='language features'/><category term='split test suite'/><category term='learning'/><category term='if'/><category term='comments'/><category term='Time.now'/><category term='alias'/><category term='state pattern'/><category term='law of demeter'/><category term='true'/><category term='silverlight'/><category term='RailsConf'/><category term='stub'/><category term='software is art'/><category term='class methods'/><category term='migration'/><category term='erb'/><category term='technical debt'/><category term='literals'/><category term='Team Size'/><category term='luminaries'/><category term='instance_method'/><category term='presenter'/><category term='sql'/><category term='operator precedence'/><category term='caller'/><category term='sets'/><category term='master'/><category term='block'/><category term='clojure'/><category term='ampersand'/><category term='erlang'/><category term='Acceptance Tests'/><category term='false'/><category term='define_method'/><category term='functions'/><category term='method'/><category term='convention'/><category term='c#'/><category term='test'/><category term='individuals over people'/><category term='library loading'/><category term='DSL'/><category term='TextMate'/><category term='custom assertions'/><category term='macro'/><category term='and'/><category term='strings'/><category term='composing'/><category term='get'/><category term='facets'/><category term='blogs'/><category term='maintainable code'/><category term='xml'/><category term='SMS'/><category term='test names'/><category term='==='/><category term='retrospective'/><category term='refactoring'/><category term='confidence'/><category term='security'/><category term='sequence'/><category term='destructuring'/><category term='schema'/><category term='object'/><category term='Gmail'/><category term='extend'/><category term='RailsConf Europe 2007'/><category term='state'/><category term='flex'/><category term='oracle'/><category term='yaml'/><category term='xUnit'/><category term='pair programming'/><category term='feature toggle'/><category term='dynamic typing'/><category term='journeyman'/><category term='internal DSL'/><category term='to_proc'/><category term='static methods'/><category term='metaclass'/><category term='ria'/><category term='stories'/><category term='testing'/><category term='serialize'/><category term='feature branch'/><category term='examples'/><category term='ide'/><category term='Symbol.to_proc'/><category term='clojure functions'/><category term='simplicity'/><category term='setup'/><category term='javascript'/><category term='forwardable'/><category term='initializer'/><category term='def'/><category term='debugging'/><category term='mock'/><category term='behavior based'/><category term='ThoughtWorks'/><category term='conference'/><category term='or'/><category term='stack trace'/><category term='mail.app'/><category term='as'/><category term='java classes'/><category term='developers'/><category term='agile'/><category term='*'/><category term='screencasts'/><category term='joda'/><category term='class'/><category term='LocalJumpError'/><category term='testing immaturity'/><category term='windows'/><category term='activesupport'/><category term='open'/><category term='mockito'/><category term='testing private methods'/><category term='rake'/><category term='presentations'/><category term='linux'/><category term='upcoming presentations'/><category term='lean'/><category term='dependency injection'/><category term='niche language'/><category term='process'/><category term='railsconfeurope07'/><category term='metaprogramming'/><category term='context'/><category term='blog'/><category term='netnewswire'/><category term='time'/><category term='enumerable'/><category term='symbols'/><category term='disk inventory x'/><category term='inject'/><category term='languages'/><category term='instance_eval'/><category term='dust'/><category term='ddl'/><category term='maps'/><category term='estimation'/><category term='singleton methods'/><title type='text'>Comments on Jay Fields' Thoughts: The High-Level Test Whisperer</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.jayfields.com/feeds/399787451062068332/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12467669/399787451062068332/comments/default'/><link rel='alternate' type='text/html' href='http://blog.jayfields.com/2011/07/high-level-test-whisperer.html'/><author><name>jaycfields</name><uri>http://www.blogger.com/profile/14491442812573747680</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12467669.post-1486370390884015929</id><published>2011-07-21T08:38:03.465-04:00</published><updated>2011-07-21T08:38:03.465-04:00</updated><title type='text'>Always great to hear about other people&amp;#39;s expe...</title><content type='html'>Always great to hear about other people&amp;#39;s experiences. Thanks for sharing Lisa!&lt;br /&gt;&lt;br /&gt;Cheers, Jay</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12467669/399787451062068332/comments/default/1486370390884015929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12467669/399787451062068332/comments/default/1486370390884015929'/><link rel='alternate' type='text/html' href='http://blog.jayfields.com/2011/07/high-level-test-whisperer.html?showComment=1311251883465#c1486370390884015929' title=''/><author><name>jaycfields</name><uri>http://www.blogger.com/profile/14491442812573747680</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.jayfields.com/2011/07/high-level-test-whisperer.html' ref='tag:blogger.com,1999:blog-12467669.post-399787451062068332' source='http://www.blogger.com/feeds/12467669/posts/default/399787451062068332' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-831726224'/></entry><entry><id>tag:blogger.com,1999:blog-12467669.post-6379595265578420174</id><published>2011-07-20T16:31:29.129-04:00</published><updated>2011-07-20T16:31:29.129-04:00</updated><title type='text'>It&amp;#39;s great to see a post on this topic. I use ...</title><content type='html'>It&amp;#39;s great to see a post on this topic. I use the term &amp;quot;high level tests&amp;quot; to mean something totally different, but our team has had a suite of what you call &amp;quot;high level tests&amp;quot; and we call &amp;quot;smoke tests&amp;quot; (though technically, I think they are not smoke tests either) that we started in 2004. Initially, when we had no automated tests, this was our only line of defense against regression failures. Now we have good coverage with 5500+ JUnits and 500+ FitNesse test pages, and the GUI tests are our last line of defense, as you say.&lt;br /&gt;&lt;br /&gt;These test scripts are mostly happy path, they do a few negative tests such as verifying required fields. Yet, they have caught many serious bugs over the years that couldn&amp;#39;t be detected at lower levels, especially in our &amp;quot;legacy&amp;quot; or old code. They&amp;#39;ve been fairly cheap to maintain, because they have little logic, and we designed them to extract out duplication into modules. Great ROI. I can think of two severe regressions that made it into production over the past 7 years, both were edge cases that we consciously decided not to have an automated regression test for (oops).</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12467669/399787451062068332/comments/default/6379595265578420174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12467669/399787451062068332/comments/default/6379595265578420174'/><link rel='alternate' type='text/html' href='http://blog.jayfields.com/2011/07/high-level-test-whisperer.html?showComment=1311193889129#c6379595265578420174' title=''/><author><name>Lisa</name><uri>http://www.blogger.com/profile/10230090963033880060</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_x_qG1BYcWzw/SEcfkuAQh6I/AAAAAAAAADc/2TS3I2WzYHc/S220/LisaCrispinPhoto.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.jayfields.com/2011/07/high-level-test-whisperer.html' ref='tag:blogger.com,1999:blog-12467669.post-399787451062068332' source='http://www.blogger.com/feeds/12467669/posts/default/399787451062068332' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-504540824'/></entry></feed>
