Командная строка для запуска всех примеров в RSpec, включая те, которые отфильтрованы?

Есть несколько примеров, которые являются медленными, которые отфильтровываются следующим образом:

RSpec.configure do |c|
  c.filter_run_excluding slow: true
end

describe 'get averages but takes a long time', slow: true do
  it 'gets average foo' do
    ....
  end

  it 'gets average bar' do
    ...
  end
end

Это отлично работает и не запускает медленные тесты.

rspec

Но что такое команда RSpec для запуска всех примеров из командной строки, включая медленные, которые отфильтрованы?

Ответ 1

Если вы запустите rspec --help, вывод включает в себя следующее:

    -t, --tag TAG[:VALUE]        Run examples with the specified tag, or exclude examples
                                 by adding ~ before the tag.
                                   - e.g. ~slow
                                   - TAG is always converted to a symbol

Вы можете запустить rspec --tag slow, чтобы запустить все примеры с тегами как медленные; однако, это не все примеры, как вы хотите. Я не думаю, что есть простой способ получить то, что вы хотите; фильтр exclusion был разработан для случаев, когда вы не хотели бы переопределять его в командной строке (например, на основе Ruby-версии или чего-то еще), не имеет смысла принудительно запускать спецификацию, которая не применяется к вашей рубиновая версия). Вы можете открыть основную проблему rspec, чтобы мы могли обсудить потенциальные изменения, чтобы добавить то, что вы хотите. Тем временем вы можете получить его с помощью переменных среды:

RSpec.configure do |c|
  c.filter_run_excluding slow: true unless ENV['ALL']
end

При этой настройке rspec будет запускать все спецификации, кроме медленных, и ALL=1 rspec будет запускать все спецификации, включая медленные.

Ответ 2

Исключение медленных тестов

Если вы хотите, чтобы rake исключал медленные тесты по умолчанию, ответ Myron, вероятно, ваш лучший выбор. Это, однако, более простое решение, которое будет хорошо работать для большинства людей.

# Run all tests
rspec

# Run tests, excluding the ones marked slow
rspec --tag ~slow

Я использую guard для запуска моих тестов во время разработки. Вы можете сказать, что охранник должен исключать медленные тесты, когда он запускает все тесты. Таким образом, вы сможете запускать только быстрые тесты во время разработки, и вы можете запустить полный пакет с помощью rake или rake --tag slow, когда захотите. Это также отлично, потому что ваш сервер CI может запускать ваш полный пакет без необходимости знать специальные переменные ENV.

Guardfile:

guard :rspec, cli: '--drb', run_all: {cli: '--tag ~slow'} do
  ...
end

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