先月あたりにA Tour of Goを一通りやって以降、Go言語に触る機会があまりなかったので、例によって「しがない問題」を解きながら色々復習してみた。
成果物はこちら。
[文字、特に日本語の扱い]
「しがない問題」は、1回の試行で「しくてがない」の6文字からランダムに重複無しで4文字を選び、その結果を「しがない」と比較するのを100回繰り返す。
なので、まずは抽出した文字列が4文字であることをテストを書こうとした。
普段よく使っているJavaやJavaScriptだと「しがない」という文字列の長さは4になるので、同じようにGoでlen(produced) == 4
と書いたらテストが通らなかった。
Goの場合はlen()
で返るのはbyte数になっているとのことなので、len(produced) == 4 * 3
と書いたらテストが通った。日本語はUTF-8で基本3byteなので3倍する必要があった。
生成された1文字ずつが指定のひらがなかどうかを確認する際には、runeという概念を学んだ。for _, rune := range produced { ... }
のようにすると1文字ずつひらがなを取得して確認することができた。
[assertするテストコード]
JavaのJUnitや、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はこちら。