問題の歴史:
メール通知のテスト自動化は、通知システム(例えば、登録時、パスワード変更時、リマインダー時)に伴って重要性が増しました。最初は手動でテストが行われ、実際のメールを通じて確認されました(CI/CDでは非常に非効率的で安全ではありません)。その後、メールの自動化を可能かつ安全にするための特化したツール(MailHog、Mailtrap、フェイクSMTPサーバー)が登場しました。
問題:
主な難しさは、メールがシステムから「外に」送信されるため、次のことが必要です:a) 送信をキャッチする、b) メールの内容を確認する、c) 送信の正しさを確認する(ヘッダーのフォーマット、添付ファイルの有無、リンク、国際化、システムのイベントとの整合性)。配信速度、テスト間のボックスクリア、SMTPエラーの処理に関する課題もあります。
解決策:
メールをキャッチする専用サービスを使用する:Mailtrap、MailHog、または実際のメールに配信しない統合されたフェイクSMTPサーバーを使用し、テスト用の「バスケット」にメールを保持します。
これらのツールとの連携をAPIフレームワークやRESTラッパーを通じて統合し、メールの受信待機、重要なパラメータの確認、添付ファイルの検証、正しいリンクの存在を実現します。
テスト用にユニークなメールアドレスを生成し、テストデータを隔離(例えば、テストドメインを使用)し、自動テストの前にボックスをクリアします。
メールの本文だけでなく、そこからのリンクの機能、異なるSMTPからの送信、異なるロケールとフォーマットに対する表示の正確さを確認します。
重要な特徴:
メール通知をテストするのに、通常のgmail/yandexのメールボックスにメールを送り、IMAPで確認することができますか?
いいえ、そのように行うことが多いですが、そのアプローチは信頼できません(外部メールサービスへの依存、迷惑メールフィルター、テスト間の隔離がない、ボックスのクリアが難しい、配信が保証されない)。
メールが届いたことだけ確認するのは十分ですか?
いいえ、本文、添付ファイル、必要なリンクの存在、適切な言語テンプレート、ヘッダー(From/To/Subject)の整合性、正しいmime構造を検証する必要があります。
テストの間にフェイクインボックスをクリアしなくても、問題はありませんか?
いいえ!テストの間にインボックスをクリアしなければすぐに混乱が生じ、バグを見つけることが不可能になります。シナリオは「他の人の」メールを「見る」ため、テストは無効になります。
メールのテストをテスト用gmail経由で構築し、IMAPを介してログインし、ボックスに「何かが届いた」だけを確認していました。メールはよく迷惑メールに入っており、一部のメールは届かず、並行テストを開始後、一つのインボックス内のメールを分析することが不可能になりました。
プラス:
マイナス:
Mailtrapを導入し、各テストケースのためにユニークなインボックスを割り当て、自動クリア、内容と添付ファイルの検証、待機時間、言語によるチェックを実装しました。
プラス:
マイナス: