メールはまだまだ現役
コミュニケーションツールとしてチャットに人気が集まっている今日この頃。それでもメールは認証情報の送信など、重要な役割を担っている。当然、そういった重要な機能はテストが必要だ。
単純にメールが送られたかどうかを見るならまだしも、送信先メールアドレスと本文に入れた顧客名が適切な組み合わせなのか、注文確認メールと発送案内メールを正しく出し分けているのか、社内/パートナー会社/それ以外で文面を切り替えられているのか、テストで確認すべきことは結構ある。Unit Testでそれぞれ、条件判定や文面生成のロジックを確認していたとしても、End to Endのテストでメールを確認することは必要だ。
テストで使うメールサーバを検討してみる。
Test用のSendmailを用意する
素直なアプローチ。catch allの設定を行えば、実際に配信されることもない。しかし
- 起動時に名前解決を行うため、テスト環境を適切に構築しないと、タイムアウトするまで起動しない。
- 設定を間違えると、本当に配信されてしまう。
という問題がある。インフラ寄りの知識が必要になるので、人によってはハードルが高い。

PythonのDebug Serverを使う
シンプルなアプローチ。
python -m smtpd -n -c DebuggingServer localhost:1025
でOK。受信したメールは標準出力に流れるので、ファイルに落として後から調べることも可能。
ただし、SMTP AUTHには対応していない。
Python の smtpd.DebuggingServer でメール送信をデバッグ – Qiita
https://www.python.org/
MailCatcher
- 簡単
- 受け取ったメールはWeb UIで確認できる。また、APIで操作することも可能なので、メールの文面などを調べる時は便利。
- SMTP AUTHに対応しているが、Greeting Messageには出てこない。そのため、Java Mailで繋ぐと、SMTP AUTHの処理が行われない。
メールを調べるには便利。APIでメールを取得することもできるので、文面の検証テストを自動化しやすい。普通はこれで十分だ。
midi-smtp-server
ライブラリ。なので、プログラムを書く必要がある。
- SMTP AUTH対応
- プログラムを書くので、認証エラーやToo many connectionsといったエラーも発生させられる。
SMTPでエラーが生じたときのテストを行うのであれば、これ。普通にテスト用のメールサーバとして使う場合も、サイトにあるコードでOK。
認証エラーを起こす例がサンプルで用意されている。
midi-smtp-server/midi-smtp-server-auth-example.rb at master · 4commerce-technologies-AG/midi-smtp-server · GitHub
これ、
raise Smtpd535Exceptionは raise MidiSmtpServer::Smtpd535Exception じゃないのかなぁ。
SMTP AUTHを有効にすると、JavaMailもちゃんとSMTP AUTHの動きをする。一回テストサーバのコードを書いてしまえば、他のプログラムのテストの時も多少の手直しで使えるので、一度試して見る価値はある。
テストは必要
ついつい自分宛にテストメールを送ってテスト完了にしてしまうことが多いだろうが、複数の送り先に同時に送ったり、送り先の人の立場によって文面を変えたりと、複雑なことをやるシステムは多いはずだ。実際の運用を想定したテストをきちんと行うことが重要であり、そういったことを行えるよう、テスト環境を構築する必要がある。業務-プログラム-インフラ と、幅広く抑える必要があるのだが。
コメント