Comment préparer des bases de données de test pour les tests Rails Rails sans exécuter de spécification rake?

Après un dépannage important, j’ai compris que je devais exécuter rake spec fois la rake spec (je peux abandonner avec control-c) avant de pouvoir exécuter rspec directement (par exemple sur un sous-ensemble de nos spécifications). Nous exécutons Rails 3.0.7 et RSpec 2.5.0.

De toute évidence, rake exécute des tâches / codes de configuration de firebase database importants (nous avons du code personnalisé dans les rails de niveau racine Rakefile et éventuellement d’autres endroits).

Comment puis-je exécuter les tâches / le code de configuration de la firebase database de test rake sans exécuter les rake spec ?

En plus de pouvoir exécuter rspec sur un sous-ensemble de fichiers, j’utilise specjour pour répartir nos spécifications sur plusieurs cœurs (sans succès pour les diffuser sur le réseau local), mais le même comportement que pour l’exécution de rspec directement: je dois exécuter des rake spec sur chaque firebase database de test (en supposant deux cœurs) avant que le travail de spécification ne fonctionne:

 rake spec TEST_ENV_NUMBER=1 control-c (after tests start) rake spec TEST_ENV_NUMBER=2 control-c (after tests start) specjour 

Note: mon config / database.yml a cette entrée pour le test (comme il est courant pour les gemmes de test en parallèle):

 test: adapter: postgresql encoding: unicode database: test username: user password: 

parallel_tests semble configurer ses bases de données correctement, mais beaucoup de nos spécifications échouent.

Je devrais également mentionner que l’exécution de specjour prepare oblige Postgres à enregistrer les erreurs qu’il ne trouve pas dans les bases de données, mais les crée (sans tables). Lors d’une exécution ultérieure, aucune erreur n’est consignée, mais aucune table n’est également créée. Il est possible que tout mon problème soit simplement un bogue dans la prepare , donc je l’ai signalé sur github.

Je pense que je peux exécuter du code arbitraire sur chaque firebase database de test en définissant Specjour::Configuration.prepare dans .specjour / hooks.rb. Par conséquent, si des tâches de râteau ou un autre code doivent être exécutés, cela peut fonctionner.

J’ai eu un problème similaire lors de la configuration du système CI au travail, alors j’ai graduellement mis au point un système pour gérer cela. Ce n’est peut-être pas la meilleure solution, mais cela fonctionne pour moi dans ma situation et je suis toujours à la recherche de meilleures façons de faire les choses.

J’ai une firebase database de test que j’avais besoin de configurer, mais aussi des données de départ chargées pour que nos tests fonctionnent.

L’essentiel du dépannage des tâches de rake consiste à exécuter rake avec l’option –trace pour voir ce qui se passe sous le capot. Lorsque je l’ai fait, j’ai constaté que l’exécution de spécifications de rake faisait un certain nombre de choses que je pouvais reproduire (ou modifier à ma guise) dans une tâche de râteau personnalisée.

Voici un exemple de ce que nous faisons.

 desc "Setup test database - drops, loads schema, migrates and seeds the test db" task :test_db_setup => [:pre_reqs] do Rails.env = ENV['RAILS_ENV'] = 'test' Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke result = capture_stdout { Rake::Task['db:schema:load'].invoke } File.open(File.join(ENV['CC_BUILD_ARTIFACTS'] || 'log', 'schema-load.log'), 'w') { |f| f.write(result) } Rake::Task['db:seed:load'].invoke ActiveRecord::Base.establish_connection Rake::Task['db:migrate'].invoke end 

Ceci n’est qu’un exemple spécifique à notre situation, vous devrez donc déterminer ce qui doit être fait pour obtenir la configuration de votre firebase database de test, mais il est assez facile de déterminer avec l’option –trace de rake.

De plus, si vous trouvez que la configuration du test prend trop de temps (comme dans notre cas), vous pouvez également vider la firebase database au format .sql et la transférer directement dans mysql pour la charger. Nous économisons ainsi plusieurs minutes sur la configuration de la firebase database de test. Je ne montre pas cela ici parce que cela complique beaucoup les choses – il faut le générer correctement sans se vider, etc.

HTH