Testing database (was Re: [jifty-devel] Tutorial questions)
Rob Kinyon
rob.kinyon at gmail.com
Wed Jan 4 13:37:54 EST 2006
> > 5) Whenever I ran "make test", the weblogtest database would
> > disappear! This means I cannot run "make test" twice in a row. Why
> > does it disappear?!? This is a serious usability issue.
>
> Starting your testing with a dirty database is a serious probelm in my
> book. Can you explain what you're trying to do in a bit more detail?
>
> (Break this one out into a separate message?)
In Rails, the equivalent of "make test" does the following actions:
1) Logs into the testing database (as specified in the
conf/databases.yml, more on this later)
2) For each testcase (.t file in the Perl world), does the following:
a) Drops every table in reverse create order
b) Recreates every table
c) Reloads every table from fixtures (more on this later)
d) Runs the test
3) Reports on the final testing results
So, each testcase has a completely fresh database to work with that's
in a known state. That setup is very very very cool. Like, a lot and
stuff.
The two features you're missing are as follows:
1) conf/databases.yml - you'd call it etc/databases.yml. This is
critical. Even though all the rest of the configuration can be
defaulted, your database conf cannot be. A standard Rails
databases.yml looks something like:
development:
adapter: mysql
database: depot_dev
username: rob
password:
socket: /tmp/mysql.sock
# Connect on a TCP socket. If omitted, the adapter will connect on the
# domain socket given by socket instead.
#host: localhost
#port: 3306
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: depot_test
username: rob
password:
socket: /tmp/mysql.sock
production:
adapter: mysql
database: depot_production
username: depot_prod
password: depot_prod
socket: /tmp/mysql.sock
This allows for a number of things:
1) I can change the DB engine without changing the rest of my configuration
2) I can change the DB configuration on a per-machine basis
without touching the rest of the configuration.
2) Fixtures - this is arguably the second most powerful feature of
ActiveRecord (which is Ruby's ORM). If given a YAML file named
appropriately, it will load that file into the table when asked. These
are generally used for testing, but are really nice to have when
resetting the dev database or for demos. I've also found them really
handy for actually fleshing out how you want the schema to work.
A standard Ruby fixture would look something like:
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
first:
id: 1
title: Some book
description: It's a book, dummy
image_url: http://somewhere.com/foo.jpg
price: 0.99
date_available: 2001-01-01 00:00:00
second:
id: 2
title: Something else
....
The names are used when working with Rails's testing features. They
aren't actually loaded into the table. The rows -are- loaded in the
order they're seen, but that shouldn't be depended on. The indents,
obviously, are column names.
Rob
More information about the jifty-devel
mailing list