atom-test-switcher という packageを作ってみました

久しぶりにatomのpackageを書いてみました。開発時にはpackageの auto reload 欲しいなぁ。ショートカットのreload遅すぎる。

こんなの

option - t で テストコードとソースコードを切り替えるプラグイン
rubyの test-unit に対応したパッケージが見つからなかったので(rspecやminitestのファイルパターンのものはあった。)
作ってみました。
ついでにjsも対応させようと汎用化したら、一気にソースコードが汚くなってしまって、まだテスト書いてない状態です。実装も怪しい。

設定画面

こんな感じで、ソースコードのdirectoryとテストコードのパターンを指定すれば動作する(ことを想定しているが、実装が汚いのでもしかするとここは今後変更するかもしれない。)
f:id:rochefort:20170418172634p:plain

Rubyのtest-unitで自動でテスト実行を行う

RSpec時代は rspec-guard を使ってテストの自動実行を行なっていましたが、test-unitではどういう選択肢があるのか調べて見ました。

guard, guard-minitest(NG)

かつてはguardのプラグインであるguard-minitest を利用すればtest-unitでも動作していたようです。

エラー内容

–guard オプションなんてないよと怒られます。

17:35:22 - INFO - Running: all tests
invalid option: --guard

以下のような引数でテストを実行しているようでした。

ruby -I"test" -I"spec" -r bundler/setup -r minitest/autorun -r ./test/test_crawler.rb -e "" -- --guard

実装は以下で行なっているのですが、これがminitest用のコードのものなのか?直すのであればどうすべきか?そもそもこのgemに対してtest-unitの修正を入れて良いのかさっぱり分からなかったので、一旦対応するのはやめて他のgemを探すことにしました。
guard-minitest/runner.rb at v2.4.6 · guard/guard-minitest

watchr(NG)

mynyml/watchr: Modern continuous testing (flexible alternative to Autotest)
その昔、少しだけ利用したことがありましたが、現在はメンテされておらず、エラーが出ます。
uninitialized constant Module::Config (NameError) · Issue #57 · mynyml/watchr
ここでobservrが紹介されています。

observr(OK)

今現在はこれを利用。
kevinburke/observr: Run tests, compile markdown/SCSS/etc, when a file changes
Watchrとほぼ同じような感じで利用できます。

利用方法

test.watchr みたいなファイルを用意。

watch( "test/test_.*\.rb" )  {|md| system("ruby #{md[0]}") }
watch( "lib/(.*)\.rb" )      {|md| system("ruby test/test_#{md[1]}.rb") }
$ bundle exec observr test.watchr

Ruby test-unit の rake task

RSpecからの移行時に少しはまりました。
 
class Rake::TestTask (Ruby 2.4.0) を見ながら Rake taskを書いてみたのですが、RSpec--fomat documentのようにtestの名称(メソッド名)も実行時に表示させる方法について誤解があり、少し悶々とした時間を過ごしてしまいました。

最終的にはこうした

require "rake/testtask"

task default: :test

desc "Run tests"
ENV["TESTOPTS"] = "-v" unless ENV["TESTOPTS"]
Rake::TestTask.new do |t|
  t.libs << "test"
  t.test_files = Dir["test/**/test_*.rb"]
  t.verbose = true
end

環境変数のTESTOPTSで-vを指定しています。
Rake::TestTask.new のblockで指定している verbose がてっきりそれに該当するのかと思ってソース眺めてたのですが、そうではなく、単にテスト実行時に実行コマンドを表示するかどうかのみでした。
 
ちなみにtest-unitのverbose optionは以下。

    -v, --verbose=[LEVEL]            Set the output level (default is verbose).
                                     (important-only, n[ormal], p[rogress], s[ilent], v[erbose])