2015-03-10 3 views
0

Мне поручено заблокировать базу данных разработки, прежде чем запускать серию миниатюрных тестовых скриптов, а затем разблокировать базу данных после завершения теста.блокировка и разблокировка таблиц при запуске minitest

Все тесты выполняются путем выполнения файла рейка с использованием теста рейка.

Каков наиболее эффективный способ сделать это?

  1. Редактирование каждого тестового скрипта «before_suite» и «after_suite»?
  2. Есть ли параметр или какой-то конкретный код, который можно добавить в Rakefile?
  3. Есть ли настройка или какой-то специальный код, который я могу добавить в test_helper.ds?
  4. Что-то еще?

ответ

0

Я думаю, что 1. путь. Затем в Rakefile вы можете обрабатывать все тесты одинаково, и если каждый тест независим или блокирует общий ресурс (база данных в вашем случае), у вас есть хорошо зарекомендовавший себя набор тестов.

Конечно, вы не хотите, чтобы на самом деле скопировали код блокировки/разблокировки. Я думаю, что способ поделиться кодом между вашими тестовыми примерами - это определить настраиваемый модуль, например, рекомендацию по документации (http://docs.seattlerb.org/minitest/), и включить этот модуль в те тесты, которые необходимо заблокировать базу данных, или сделать ваши тестовые таблицы наследуемыми из настраиваемого класса, который наследует Minitest :: Test, оба из которых вы можете добавить в свой тестовый помощник.

EDIT - В Коде:

module LockDb 
    #Replace this with the path to your actual database 
    DB_FILE = 'db' 

    def setup 
    @f = File.open(DB_FILE, 'r+') 
    @f.flock(File::LOCK_EX) 
    end 
    def teardown 
    @f.flock(File::LOCK_UN) 
    end 
end 

Вы бы включить это в тестовых классах, которые вы хотите заблокировать дб, как так:

class TestMeme < Minitest::Test 
include LockDb 
#Your tests 
end 

Чтобы увидеть, что это работает, вы можете настроить простой скрипт без рамки без ограничений, как и следующий, и повеселиться, запустив его в нескольких окнах (перед тем, как вы его запустите, обязательно запустите его touch db):

#!/usr/bin/env ruby 
# -*- coding: utf-8 -*- 

module LockDb 
    #Replace this with the path to your actual database 
    DB_FILE = 'db' 

    def setup 
    @f = File.open(DB_FILE, 'r+') 
    @f.flock(File::LOCK_EX) 
    end 
    def teardown 
    @f.flock(File::LOCK_UN) 
    end 
end 

extend LockDb 

#The setup hook is run before each test method in minitest 
setup 
puts "Locked" 

#This would be one of your test methods 
puts "Press Enter to unlock" 
gets 
#^This would be the end of one of your test methods 

#The teardown hook is run before each test method in minitest 
teardown 
puts "Unlocked" 

На комментарии: Если у вас уже есть эти методы, они будут замещать те, предоставляемый модуль, так что вам нужно изменить эти уже определенные методы для вызова super так что версия предоставлена модуль также вызывается. (Деление модуля не имеет смысл и логически, вы всегда будете должны вызвать целую пару)

Если это кажется, что слишком много работы, вы также можете попробовать взять маршрут рейки, например,

namespace :old do 
    #put the old :test definition here 
end 

task :teardown => 'old:test' do 
    #the code 
end 
task 'old:test' => :setup 
task :setup do 
    #the code 

end 
task :test => :teardown 

Или вы можете использовать https://github.com/guillermo/rake-hooks.

+0

Да, я понял, что поэтому я удалил комментарий. Я не контролирую, какие камни можно установить. Я дам вам знать, как я, наконец, решил это. Спасибо за помощь. Я хотел бы отметить ваш ответ как правильный, но не вижу этого. – user1344131

+1

Резолюция оказалась намного проще, чем ожидалось. В test_helper.ds я добавил класс, который заблокировал базу данных. После этого класса я использовал Minitest.after_run {}, чтобы разблокировать базу данных. Нет необходимости в модулях или обновлении существующих тестовых классов! – user1344131

Смежные вопросы