I’ve been a subscriber for a bit, but now I have a question for those more knowledgeable than I.
I’ve inherited a Rails 2.3.x app, and have had some issues installing the right versions of rspec / rubygems / etc. to find compatible versions, but I pretty much have discovered that I may need a modified approach to testing other than the straightforward tutorials. The app came with no working tests (although there are stubs for fixtures-based tests inheriting from ActionController::TestCase). I’ve been playing with Rails part-time but this is my first “big” project. We’ll be doing significant mods soon, but I don’t want to do too much until we have a good testing strategy. I replaced a manual deploy with capistrano, etc. so we’re pretty ok for small mods but wholesale changes scare me without any tests.
The application doesn’t manage its own login – the accounts / passwords are stored on an external system. There is a fairly intimate coordination of data between the external system and the rails app: authentication takes place remotely, but app permissions are stored on the rails side. The app will modify data both on the Rails side and the external side, but some initial setup on the external site is needed before anything can happen on Rails, and periodic tasks have to be performed on the external server (manually) in order to simulate a true workflow. So, we can’t really authenticate in a test, or do anything meaningful, without setup on both the external system and the rails system. This leads me to believe that using the ‘test’ database, which is regenerated / rolled back often, is a problem. I also can’t believe that I’m the only one who faces issues like this in designing tests for a Rails application.
Additional complications include the following:
Data must be uploaded to the rails side, processed, and then sent over manually to the external server, and processed there with multiple human interactions. Only after that happens can some of the tests be performed on the rails side, and the tests change both rails data and external data. If a test were to be performed after all that setup, and the rails side of the database was to be “rolled back”, there would be inconsistencies between the rails db and the external db which might confound any future test results without cleaning everything up and starting over again, something which would take between 10 and 50 minutes to create (depending upon how much of a “clean slate” we want on both sides).
We have dependencies upon the web server (webrick doesn’t work, and only older versions of passenger work). This is due to some nasty encoding we do to send encoded ‘/’ characters via URL params, and we end up with double encodings with certain servers. If any of the test mechanisms also have this issue with sending / retrieving / and generating links with the ‘/’ encoded URL parameters, we’d again have confounding results. I’d like to break this dependency, but again, it would be nice to have some tests first!
I’ve thought of possibly using an existing set of test data on the remote side (with matched data on the Rails side), and running the tests with the data on the rails side until we’ve “used up” that data set (after certain sets of operations on the rails side, the particular data item is no longer modifiable in the same manner), but that doesn’t appear to be obvious how I’d do that with either unit tests / fixtures or rspec. Additionally, uploading a file in a particular format is an integral step in many of the rails-side tests – integrating that into the testing framework would be nice, but there’s probably a lot that could be done before we had to do that.
It almost seems that we need to have a GUI-based driver for the more complicated things (such as uploading files / checking results). On the other hand, the basic get requests do require a lot of setup (as I’ve described above) that doesn’t seem obvious to me with the current test options.
Any suggestions for test infrastructure gems, tutorials, blog posts, etc. that might be of use would be appreciated. Right now, I’d rather get the tests working rather than try to bring this app up to 3.x in order to pull in the fanciest new tools
If anyone has some ideas and needs more info, I’ll try to provide that as well, it seems like this post is long enough already!
Thanks and best wishes,