読者です 読者をやめる 読者になる 読者になる

golangのtestingがよくわからなかったのでRubyにもってきた

Rubyのテストは主にassertionを書くものが多く、 「こうあるべき」に主眼をおいて書かれていることが多い。

しかしながらgolangはこのアンチテーゼというかおもしろい見方をしていると聞いて、 「どういうことだろう?」と思って気になったので調べていたらRubyで書きなおしはじめていた。

github.com

名前は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とつけるところをMTestingとつけるところをTBenchmarkとつけるところを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機能とかもつけたい。