2015-05-28 4 views
1

Есть ли способ перезапустить посеянную RSpec бежать от определенной точки, а не от начала?Как продолжить сеялку RSpec?

При внесении изменений, которые потенциально затрагивают все файлы (например, removing Bundler.require) в большой базе кода, я хочу запустить полный набор тестов RSpec, исправить первую ошибку, а затем повторно запустить тесты с тем же семена.

$ cd myproj 
$ rspec --seed=0 --fail-fast 

... 

Finished in 9 minutes 59 seconds (files took 12.09 seconds to load) 
9999 examples, 1 failure, 0 pending 

Failed examples: 

rspec ./spec/my_class_spec.rb:22 # MyClass #my_method 

Randomized with seed 0 

В этот момент я понимаю, что my_class.rb не хватает require. Я исправлю это, но лучше не повторять предыдущие примеры 9998.

Я хотел бы иметь возможность указать начальную точку, что-то вроде этого:

$ rspec --seed=0 --from='./spec/my_class_spec.rb:22' --fail-fast 

Или, если RSpec это может определить последнюю неудачу, то, как это было бы еще лучше:

$ rspec --seed=0 --continue --fail-fast 

Очевидно, что работа с семенами не является хорошей практикой в ​​целом, так как тесты не должны быть зависимыми от заказа, но это позволяет воспроизводить то, что я ищу сейчас.

ответ

1

RSpec не поддерживает флаг --continue. Ему нужно было бы сохранить какое-то состояние между прогонами о том, как далеко прошел последний прогон в целом пакете. Он этого не делает (и у нас нет планов сделать это), но для кого-то было бы довольно легко написать расширение, которое это делает.

Тем не менее, в ближайшее время, чтобы быть выпущен RSpec 3.3 включает в себя новую функцию, которая поддерживает аналогичную, но немного другой рабочий процесс: --next-failure:

https://relishapp.com/rspec-staging/rspec-core/docs/command-line/only-failures

С --next-failure, вот как вы бы достичь рабочий процесс, аналогичный тому, о котором вы просите:

  1. Запустить rspec для запуска всего комплекса. Он будет записывать last_run_status всех выполненных примеров, чтобы он знал, что не удалось.
  2. Неоднократно запускайте rspec --next-failure (или rspec --next-failure --seed 0, если вы хотите принудительно настроить случайный порядок, а не использовать определенный порядок). RSpec будет фильтровать то, что выполняется, только для примеров, которые не выполнялись в последний раз, когда они запускались, и будет прерван, как только один из них завершится.

Повторным работает rspec с --next-failure вы можете работать через каждый из неудач индивидуально без оплаты затрат на эксплуатацию всего пакета.

Обратите внимание, что для использования этой новой функции сначала необходимо настроить example_status_persistence_file_path, поэтому RSpec знает, где сохранить последний статус выполнения каждого примера.

+0

Функция '-next-failure' будет идеальной. Я с нетерпением жду 3.3! Одно из предложений: вместо 'example_status_persistence_file_path', как насчет опции командной строки' --persist-status' (которая использует стандартный/рекомендуемый/обычный путь) и '--persist-status = my/custom/path', который позволяет настройки. – jwfearn

+1

Первоначально мы собирались предоставить значение по умолчанию для пути к файлу (и я сильно его поддержал), но столкнулись с проблемами, выясняя правильную работу пользователя, когда мы не можем писать на него (поскольку у нас нет гарантии, мы будем уметь писать в _any_ путь к файлу, который мы выбираем по умолчанию). Вы можете прочитать разговор на https://github.com/rspec/rspec-core/pull/1888, если хотите узнать подробности. –

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