「しがない問題」で学ぶ #Golang とテストコードの話とか

先月あたりにA Tour of Goを一通りやって以降、Go言語に触る機会があまりなかったので、例によって「しがない問題」を解きながら色々復習してみた。

 

成果物はこちら。

github.com

[文字、特に日本語の扱い]

「しがない問題」は、1回の試行で「しくてがない」の6文字からランダムに重複無しで4文字を選び、その結果を「しがない」と比較するのを100回繰り返す。

 

なので、まずは抽出した文字列が4文字であることをテストを書こうとした。

普段よく使っているJavaJavaScriptだと「しがない」という文字列の長さは4になるので、同じようにGoでlen(produced) == 4と書いたらテストが通らなかった。

 

Goの場合はlen()で返るのはbyte数になっているとのことなので、len(produced) == 4 * 3と書いたらテストが通った。日本語はUTF-8で基本3byteなので3倍する必要があった。

qiita.com

 

生成された1文字ずつが指定のひらがなかどうかを確認する際には、runeという概念を学んだ。for _, rune := range produced { ... }のようにすると1文字ずつひらがなを取得して確認することができた。

 

[assertするテストコード]

JavaJUnitや、JavaScriptのpower-assertやmochaのようなテストでassertを実施するような標準的なライブラリはないらしい。

 

Frequently Asked Questions (FAQ) - The Go Programming Language

公式のFAQによれば、そんなものに頼らずちゃんとエラーハンドリングせえよ、ということだった。

 

testing - The Go Programming Language

というわけでassertには公式のテストパッケージtestingを用いて、len(produced) == 4 * 3の結果がfalseだった場合には、t.Fatal("produced illegal value: " + produced)のようにFatalでテストをエラー終了させた。

 

[標準出力のテスト]

生成した文字列をテストする際に、interfaceを分けてモックを生成して、という形でテストコードを書いていたのだが、そうする必要はなかったのかもしれない。

 

Goのtestingを理解する in 2018 - Examples編 #go

先の公式ドキュメントにも書いてあるが、Exampleで始まるテストケースを使うと、標準出力の結果をテストできるらしい。 

勉強になる。

 

[まとめ]

  • 「しがない問題」のテストを書くことでよりGo言語を理解できた 
    - rune
    - testing.T
    - Examplesテスト

 

今日のブログ執筆BGMはこちら。

www.youtube.com