Posted almost 9 years ago. Visible to the public.

Preparing your test database: mind the differences

Instead of running all missing migrations on your test database with rake db:migrate RAILS_ENV=test you can also use a handful of rake tasks to prepare the database structure directly. They can produce different results, though.

In a nutshell, to ensure your test database gains the correct structure:

  • Don't use rake db:test:prepare carelessly
  • or use rake db:test:clone_structure ← preferred :)
  • or use rake db:migrate RAILS_ENV=test and don't mix it with other ways, like some of the rake tasks.

rake db:test:prepare

Be default, this loads you schema.rb into the test database. You may need to run a rake db:schema:dump before to get an updated schema.rb -- else you might load an outdated database structure.

Since the schema.rb does not hold any SQL specific information, like charsets or collations, your test database may differ from your development database in such aspects (because they will be defined by the database defaults when tables are created without further information).

To avoid this problem, your environment.rb needs to say:

Copy
config.active_record.schema_format = :sql

This will make a db/development_structure.sql appear which is then also read and loaded when you do a db:test:prepare.

rake db:test:clone

You don't need to dump your database schema explicitly when calling this rake task (it generates the schema.rb for you) -- but you may run into problems. The task's description reads:

Copy
rake db:test:clone # Recreate the test database from the current environment's database schema

This is exactly what happens. Even if your environment.rb defines a different schema_format (like above) it will not be used but instead the test database's structure is read from the schema.rb file.

Using rake db:test:clone will then again result in a different structure if you have any tables or columns whose charset or collation differ from the database default.

rake db:test:clone_structure

Using this command will save you the above hassle. Though it is pretty cumbersome to type, it's doing what you want:

Copy
rake db:test:clone_structure # Recreate the test databases from the development structure

That will make your test database have the same structure, including charsets and collations, like your development database.

Once an application no longer requires constant development, it needs periodic maintenance for stable and secure operation. makandra offers monthly maintenance contracts that let you focus on your business while we make sure the lights stay on.

Owner of this card:

Avatar
Arne Hartherz
Last edit:
about 6 years ago
by Henning Koch
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Arne Hartherz to makandra dev
This website uses short-lived cookies to improve usability.
Accept or learn more