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

年中アイス

いろいろつらつら

pull requestしてみて

ちょっと前ですが、fluent-plugin-parserに出したpull requestが無事マージされました。
内容については、下記エントリを参照ください。
fluent-plugin-parserから出る"pattern not match"メッセージを出さないようにしたい - 年中アイス

ミスってたことと、今回のケースのテストコード例を教えてもらったので、同じようなログメッセージのテスト書く方のためにも書いておきます。やり方変えれば、出力されたログの内容もテストで確認できると思います。

  • gitのユーザ名とメールアドレスがGitHubとずれていた。
  • テストコードについて

gitのユーザ名とメールアドレスがGitHubとずれていた。

最初に、forkとかいろいろやって、変更を終えてcommitして、GitHubにpushしてから、ユーザ名とメールアドレスが前につけた適当なものになっていたことに気づきました。メールアドレスとかuser@userみたいな名前でした。
GitHubも普通にgit延長上なので、そりゃ設定している内容で反映されますね。gitよくわからず、消しても履歴に残るしと思って、一旦リポジトリ消して、forkし直しました。
ちゃんと設定しとかないと。。。

git config --global user.name yourname
git config --global user.email youremail

テストコードについて

最初、$log.warn()で、ログが出力されているのはすぐ把握できましたが、出力内容を取る術がわからず。標準出力かエラーに出ているのかなと思って@さんに教えていただいたキャプチャを試すも取れない状態でした。*1

そのままテストなしでpull requestしたら、@さんから直接、こういうので出来るからテスト書いてくださいーと、返ってきたので、それを参考に作りました。
ざっくり説明すると以下です。

  • 専用の例外クラスを作成(DummyLoggerWarnedException)
  • 確認用のクラス(DummyLogger)を作って、warn()が呼ばれたら、DummyLoggerWarnedExceptionを発生させる
  • $logに入っているインスタンスと、DummyLoggerのインスタンスを入れ替える
  • テスト内では、ケースによって例外が発生しないこと、またはDummyLoggerWarnedExceptionが発生したことを確認する
  • $logに元々入っていたインスタンスを戻す

詳しくは、pull requestのDiscussionと、テストコード見てみてください。
add 'unmatch_silent' to configuration. by reiki4040 · Pull Request #4 · tagomoris/fluent-plugin-parser · GitHub
fluent-plugin-parser/test_out_parser.rb at master · tagomoris/fluent-plugin-parser · GitHub

私のメインはJavaなので、こんな感じの発想は出てませんでした。Mockito使うのとはちょっと違うかな?この辺は言語の仕様違いによるテストコードの違いでしょうか。Javaだとリフレクション使ってアーダコーダしたみたいな雰囲気。別の言語やると発見が多いですね。

終わりに

今回初めてpull requestしましたが、便利ですねこれは。自分でこうしたいという主張がしやすいです。ただ、gitに慣れていない状態で扱うとテンパりそうです。

これからも機能追加やバグ修正など、pull request飛ばしてみようと思います。マージされると単純にうれしいです。

*1:今思うと、$logの中身は、本当にダミーで、処理無しwarn()だったので、呼ばれても何も出力されないということかも