On Dec 11, 2010, at 11:47 AM, Shea Levy wrote:
> Hi all,
> 
> I was recently brought onto a Rails 2.2.3 project which was itself an 
> emergency rescue of a spaghetti-coded PHP project (complete with hard-coded 
> SQL statements!). Due to the fact that the code was already in production and 
> has required fairly constant maintenance and feature additions, the dev who 
> switched everything over to Rails hasn't written a single test. The eventual 
> goal, the achievement of which is one of my primary responsibilities on the 
> project, is to have the project be migrated to Rails 3, fully spec'd at all 
> levels and documented at the top level with Cucumber features, matching Rails 
> conventions (e.g. the database table for the Shop model is currently 
> 'shops_master' and will eventually be 'shops') and with all vestiges of the 
> original project completely removed (there's still some PHP code running on 
> the production site). My question is: what's the best approach to get from 
> here to there? Is it possible to do this gradually while development 
> continues on the current project, or is a total refresh going to be 
> necessary? I'd much prefer a gradual approach because the other dev on the 
> project is working full-time on adding features to and maintaining the 
> current site and all of my responsibilities outside of the migration will be 
> focused on adding features to the current site, so if I were to do a complete 
> refresh any work from here on out would be completely duplicated. 
> Additionally, the other dev on the project (who has much more general coding 
> experience than I do) won't be able to spare time to help me out with 
> problems on a refresh the way he would if any gradual changes were 
> implemented on the current project. The only problem with the gradual 
> approach is that I have no idea how to actually do it! Do I start with 
> unit-tests of the already-existing code and work my way out to features, or 
> do I start with features describing things already implemented and work my 
> way in? Do I try to convince the other dev to start outside-in with all new 
> features now, or do I wait until I've done more with what's already there? 
> Are there any good resources out there for tasks like this? Also, if a 
> refresh IS necessary: what's the best way to go about replicating the 
> functionality of an existing project?
> 
> tl;dr: Is it possible to save a test-free project via gradual steps, or is a 
> complete refresh necessary? If the former, how do I go about doing that? If 
> the latter, how do I do it in a way that keeps overall functionality of the 
> resulting project the same as the original?
> 
> Cheers,
> Shea Levy
> 

There's a great book by Michael Feathers called "Working Effectively with 
Legacy Code," in which he defines legacy code as code without tests. The 
examples are mostly in C++ and Java, but many of the concepts are 
technology-independent.

The short version is: do it gradually. Start with a "characterization" test 
(generally end to end tests, probably using Cucumber) that describes an 
existing feature and covers the parts of the code you're about to change for a 
new feature. Feathers' book provides strategies for figuring out what to test 
in characterization tests.

Once you've got the coverage you think you need to get you safely through a 
feature you're about to write, then drive it out using whatever process you 
would normally use on a well tested app.

If you do this consistently as you add new features, you'll build up a 
meaningful suite pretty quickly.

Make sense?

Cheers,
David

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to