Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test-unit/minitest/rspec の 最新 assertion, matcher を眺める #103

Closed
kachick opened this issue Jun 6, 2021 · 0 comments
Closed

Comments

@kachick
Copy link
Owner

kachick commented Jun 6, 2021

#33 というのを書いたぐらい、最近は test-unit で良いやん・・・と思っていたのだが、ちょっと気になって assertion の定義を調べだしたら深みにハマっていった

で、良し悪しを言うには「とりあえず assertions の類はどんなのがあるのかぐらい全部把握しておいたほうが良いな」と思った。 Power Assert があるよという話だけなら、 test-unit だけでなく minitest でも RSpec でも使おうと思えば使えるわけだし。

要はここを見た!

・・・こうしてみてみると、重要度に比較すればもっと早く読んでおけばよかったなという程度のボリュームである。
流石に RSpec はあれがあれであぁだが、 要は def match の定義を見れば良いんでしょ。ということぐらいはわかる。そう考えるとむしろ一番定義がシンプルだったりもする。
https://github.com/rspec/rspec-expectations/blob/040d1b0bba83031c9ae432fd3a4462fdd1cc74e7/lib/rspec/matchers.rb の方が概要は掴めそうか。

ただ、 test-unit は大昔からの互換性 & minitest との互換性も維持しようとしているためか、非常に辛い感じの実装というかが多い・・・メンテナが優秀だからなんとかなっているのだろうけど大変そうだ。
でもそれを言ったら rspec も ruby version 絞ってないし、 1.8.7 からCI走らせてるという意味では一番互換性維持頑張ってそうなんだよなぁ・・・

https://github.com/rspec/rspec-core/blob/247d0a706ffa955718d600f3588aeb1e60cebde4/.github/workflows/ci.yml#L70-L108

test-unit は 1.9 からっぽい https://github.com/test-unit/test-unit/blob/9e08ffaf11a03830e4f2aaa74e7d0b68c31e2ca0/.travis.yml#L7-L11
新し目のRubyは GitHub Actions で、 古めの Ruby は Travis-CI で走らせている。なるほど、 Travis-CI の活用方法・・・

そういった意味で一番後方互換性気にしていないのは minitest っぽい。作者的にそうなるんだろうが、相変わらず hoe を採用しているようで全く gemspec の定義的なのが読み解けないが、 rubygems 的には 2.2 以上と解釈されているようだ。

screen_shot 2021-06-06 23 16 35

広く使われてるツールだとやむなしなところはあるんだろうけど、自身のバージョンも上げたら古い Ruby のサポートとか後方互換性バシバシ落としてでも使いやすい感じの物があれば、個人的なプロジェクトではそういうの使っていきたいなぁという気持ちはある。

後まぁ、どれにも思ったけど、「これ使わないだろ・・・」っていう assertion/matcher が多すぎる気はする。
だからこそ Power Assert みたいなソリューションが出てきたのだろうけど、一回公式に追加した assertion 落とすのは難しいだろうし、やむなしなのかなー

そういえば、 test-unit では assert_raises を使っていたんだけど、これはどうやら minitest との互換性維持のための alias らしくて assert_raise を使ったほうが良さそうだ。 https://github.com/test-unit/test-unit/blob/9e08ffaf11a03830e4f2aaa74e7d0b68c31e2ca0/lib/test/unit/assertions.rb#L289-L290
後、 例外メッセージとの比較も一緒に行いたいシーンは凄い多かったんだけど、assert_raise_with_message というのが つい最近(3.4.3から)追加された。やったー! 早速使っている。

minitest は興味がなかったんだけど、test-unit 的に使えるはずで rails が公式に採用していて後方互換を積極的に?落としている意味でちょっと気になってきた。しかし、浮気?したくない気もするんだよなー。ぐぬぬ。

#33 (comment) とか https://github.com/kachick/rspec-matchers-power_assert_matchers/blob/67a4d3d7be72ddb3d8eda5a8997174b109be2b7a/lib/rspec/matchers/power_assert_matchers.rb#L18-L52 で思ったけど、custom assertion, custom matcher のオフィシャルな作り方は把握しておいたほうが色々良さそうだなというのも感想。流石にまだ minitest のそれは調べていないけど・・・

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant