Rubyのテストは主にassertionを書くものが多く、 「こうあるべき」に主眼をおいて書かれていることが多い。
しかしながらgolangはこのアンチテーゼというかおもしろい見方をしていると聞いて、 「どういうことだろう?」と思って気になったので調べていたらRubyで書きなおしはじめていた。
名前はRuby + Golang TestingでRgot(あーるごっと)とした。
golangのテストでは「この場合はこういう理由でダメ」を書くようにできる。 というかテストを通すメソッドがなく、テストを落とすためのメソッドだけがあるので自然とこうなる。
golangではこんな感じ
package some_test import "some" func TestSum(t *testing.T) { g := &some.G{} sum := g.Sum(1, 2) if sum != 3 { t.Errorf("expect 3 got %d", sum) } }
これをRubyで
require_relative './some' module SomeTest def test_sum(t) g = G.new sum = g.sum(1, 2) if sum != 3 t.error("expect 3 got #{sum}") end end end
という風に書けばgolang風テストが出来るようにした。
とはいえgolangでまともなコードを書いたことがないのでいまいちGoっぽさがわかってなかったりするけど、 結構おもしろい気がするのでこれから育てていこうと思う。
名前
golang は命名が最高にクール。
Main
とつけるところをM
、Testing
とつけるところをT
、Benchmark
とつけるところをB
、としていてロックだ。
名前が長いことの弊害に対する反骨精神すら感じる。
この精神に敬意を表し、Rgotでもそのままclass名とした。
命名規則もそのままだ。
機能
いまのところTestとMainとBenchmarkの機能を使えるようにしている。
module SomeTest def benchmark_sum(b) g = G.new i = 0 while i < b.n g.sum(1,2) i += 1 end end end
$ rgot some_test.rb -b . benchmark_sum 14400000 76.110 ns/op PASS ok 2.657s
今後はExample機能とParallel機能とかもつけたい。