Capture::Tinyを使ってSTDERRに何も出力されていないことをテストする

経緯

  1. 数千万行あるファイルに対して1行ごとに処理するようなバッチを書く
  2. utf8フラグ付きの文字列をencode_utf8せずに処理してしまう
  3. 大量のWide character in ...という警告がログに出力される
  4. 気付かずに本番リリースされ、それが原因で障害発生
  5. 悲しみに閉ざされる

対策

あれ以来、テストでSTDERRのチェックを行うようにしている。
あと、テストデータにマルチバイト文字列を忘れずに入れる。

my ($stdout, $stderr, $exit) = capture { MyApp->new->run(@argv) };
is $stderr, '', '標準エラー出力には何も出力されていない';