Rails:如何使用 Minitest 为并行测试准备测试数据库

Rails: How to prepare test-DBs for parallelized tests with Minitest

我正在为一个应用程序进行测试,现在刚刚超过 50 个测试,这意味着并行测试开始了。有了它,我目前收到错误消息告诉我 ActiveRecord::ConnectionNotEstablished: Access denied for user 'user'@'localhost' to database 'test_DB-0''test_DB-1' , 'test_DB-2' 等等。那是因为我在 database.yml.

中只指定了一个测试数据库

我在 rails guides 中读到,显然我必须在 test_helper.rb

中使用之前和之后的操作
ENV["RAILS_ENV"] ||= "test"
require_relative "../config/environment"
require "rails/test_help"
require "minitest/autorun"
require "minitest/reporters"
Minitest::Reporters.use!

class ActiveSupport::TestCase

  parallelize_setup do |worker|
    # setup databases
  end

  parallelize_teardown do |worker|
    # setup databases
  end

  # Run tests in parallel with specified workers
  parallelize(workers: :number_of_processors)

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

但是我该怎么做,我可以将旧测试数据库的数据保留在 database.yml 中吗?我可以通过在操作前后使用这些来绕过手动创建数据库吗?

提前致谢!

编辑

我的database.yml的测试部分是:

test:
  adapter: mysql2
  database: <%= ENV["testDB"] %>
  username: <%= ENV["testDB-username"] %>
  password: <%= ENV["testDB-password"] %>
  host: localhost
  encoding: utf8
  collation: utf8_unicode_ci

localhost 上的testDB-username 可以访问testDB,但没有全局root 权限。

感谢 edariedl 的提示,我能够设置并行测试。我必须向 dev-sql 用户授予全局权限。这与我通常的设置不同,我只向 dev-database.

授予权限

向我的 dev-sql 用户授予全局权限后:

mysql > GRANT ALL PRIVILEGES ON *.* TO user@localhost;
mysql > FLUSH PRIVILEGES;

Minitest 完成剩下的工作并分叉测试。它创建 n 个数据库,其中 n 是系统的 cpu-cores 数量。

在我的例子中,这种并行化似乎比线程测试更可靠、更快。