I'm attempting to put together a framework for testing a DB application. I've done this before for other apps, but am wondering if there's a cleaner way of doing things.
The scenario is I'm building a web-based app, and for tests I want to have a real DB with a known set of data to test against. I need to be able to:
- Easily revert to this known state
- Deal with changes in the schema
- Add more data to the known state as I add more tests (since the data structures are complex, this will mostly be done by adding things via the app itself).
I don't need it to be DB independant (I'm using MySQL).
My current approach is to script a reload of the DB schema, and my known set of data as insert statements.
Each time I update the schema, I have to refresh the DB as if I was about to run the tests (but don't actually run the tests, since they may add data), apply the patch (I keep each change to the schema as a patch file containing alter table, etc. statements), then re-dump the known set of data. This makes sure the insert statements will work with the new schema.
To add more data, I also have to refresh the DB, then add data using the app, and re-dump it.
One enhancement I'm looking at is to use YAML to store the data set (which I think I can do with
SQL::Translator). This should make small changes and tweaks fairly easy. But apart from that, does anyone have any suggestions on how I can improve this?