/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2018/10/17 Go言語のメールライブラリ、テスト、ロギング

お昼は吉野家・はなまるうどん・ガストの合同定期券でサッと食べて、喫茶店で語学の勉強をしていることが多いのですが、今日は久しぶりにマックに行きました。すると近くの席のおばさん二人が、座ってもいないのに別の席のコンセントを使ってしまい、店員ともめていました。

オフィスに戻ると、今度は同僚同士がオフィスの使い方について少しもめていました。

人は思い通りにいかないことがあると不満に思います。ただ、その時その思いをどう表現するかはその人次第なので、怒ったり、黙ったり、泣いたり、感情は出さずにロジカルに不満を説明することだってあるかもしれないし、とにかくそれぞれの表現の仕方をして、そのネガティブな感情が周りに伝わると、気圧が下がって調子が悪くなるように、周りの気分も害します。

かたや、幸せな気分というのも伝染するようですが、嫌な気分よりは伝わりづらいような気がします。嫌なニュースは見聞きして広めたくなるのに、よいニュースはあまりそうならないですね。生きるのは楽しいことばかりではないけれど、それでも口に出すのはそんな言葉ばかりがよいかなぁと改めて思った1日でした。

Go 言語でメール送信

メール処理のライブラリは何がよいかと探していたのですが、公式リポジトリに載っているライブラリが多いです。とりあえずスター数を見る限りは "gomail" がよさそう。。機能的にも問題なさそうです。

github.com

github.com

ただし上記リポジトリは長期間更新がなく、フォークしてメンテナンスされているリポジトリはこっち(ややこしい状態ですね):

github.com

まだ利用できていないので、使い次第何か書きます。

テストの書き方

この Qiita がとても分かりやすくまとまっていました。Go は標準ではアサーションが無いんですね。if で普通のプログラムのように返り値判定すればよい、ということでしょうか。

qiita.com

とはいえアサーションを提供するライブラリはあるようです。簡便さのためこちらを利用することにしました:

github.com

また、サブテストの機能が便利です。同じテストメソッド内に無名関数で複数のテストを入れ子にできる機能です。テスト結果もインデントされて表示されるので見やすいです:

testing - The Go Programming Language

TestExecute メソッド内に、サブテストとして Fine_job, Malformed_job を入れた例です:

$ go test -v model/model_test.go
=== RUN   TestExecute
=== RUN   TestExecute/Fine_job
=== RUN   TestExecute/Malformed_job
--- PASS: TestExecute (0.01s)
    --- PASS: TestExecute/Fine_job (0.00s)
    --- PASS: TestExecute/Malformed_job (0.00s)
PASS
ok      command-line-arguments  0.017s

ロギング

Go 言語のロギングパッケージは、warning, error などのログレベルの設定ができません。理由は以下で述べられていますが、世の中の warning は大抵無視されているし、error も info で十分とのこと。処理継続するならそれはもうエラーではないし、呼び出し元に投げ返す場合はエラーは呼び出し元の責任で、その関数で error とするべきでは無いと。確かに筋が通っています。

テストといいロギングといい、今標準になっている機能を改めて見直しているのは好感が持てますね。その上で機能を増やすのではなく削減しているので思い切った判断だなと感じます。

qiita.com

ただ上の説明を読むと debug はあっても良さそうですが・・・以下の標準ライブラリには入っていません。なんでだろ。

log - The Go Programming Language