株式会社GENZが運営する技術ブログです。

  1. QA・テスト
  2. 1014 view

MailSlurp+Pythonでメール認証リンクを自動で踏む|E2Eテストでの活用方法

はじめに

テストでアカウントを大量に作る必要があったので、操作の自動化しようと思ったのですがメール認証が!
むむむ… :disappointed_relieved: どうしよう…と思っていたところ、 MailSlurp なるものがあることを教えてもらいました。
よし!挑戦してみよう!

利用環境

  • macOS Big Sur 11.1
  • Python 3.8.6

手順

準備

  1. MailSlurp公式サイト でアカウントを作成します
  2. アカウントを作成すると API Key が発行されるのでメモしておきます

MailSlurp公式サイト に再ログインする場合は、 ログイン画面 で登録したメールアドレスを入力します。
するとメールにアクセス用のリンクボタンが送られてくるので、そこからアクセスします。

curl

まず試しにcurlで叩いてみます。

  • メール Inbox の作成
% curl -X POST https://api.mailslurp.com/inboxes?apiKey=xxxxxxxx

レスポンスで InboxのID と メールアドレス が取得できます。

  • 受信メールの確認
% curl https://api.mailslurp.com/inboxes/ 『InboxのID』 /emails?apiKey=xxxxxxxx

メールがあると以下のようなレスポンスが返ってきます。

[{
 "id":" 『メールのID』 ",
 "subject":" 『メールの件名』 ",
 "to":[" 『MailSlurpで発行したメールアドレス』 "],
 "from":" 『メール差出人』 ",
 "bcc":[],
 "cc":[],
 "createdAt":"2021-01-29T07:20:43.295Z",
 "read":false,
 "attachments":[],
 "created":"2021-01-29T07:20:43.295Z"
}]
  • 全メール削除
% curl -X DELETE https://api.mailslurp.com/inboxes/ 『InboxのID』 /emails?apiKey=xxxxxxxx
  • InBox の削除
% curl -X DELETE https://api.mailslurp.com/inboxes/ 『InboxのID』 ?apiKey=xxxxxxxx

Python

curlで基本的な動きを確認できたのでPythonで実装していきます。
まず pip でインストールします。

% pip install mailslurp-client

実装

MailSlurpで受信したメールのメール本文を取得してみます。

import mailslurp_client
from mailslurp_client.rest import ApiException

configuration = mailslurp_client.Configuration()
configuration.api_key['x-api-key'] = ### API Key ###

with mailslurp_client.ApiClient(configuration) as api_client:
    api_instance = mailslurp_client.WaitForControllerApi(api_client)
    inbox_id = ### InboxのID ###
    timeout = 3000
    unread_only = False

    try:
        email = api_instance.wait_for_latest_email(inbox_id = inbox_id, timeout = timeout, unread_only = unread_only)
        print(email.body)   # 一旦ここでは出力まで
    except ApiException as e:
        print(e)

上記でメール本文を取得します。
上では取得した本文を出力するだけになっていますが、実際には正規表現等で本文から欲しい箇所を抽出して、selenium 等に渡します。

メールの本文から目的の要素を取得したらメールは不要になるので削除するようにします。

with mailslurp_client.ApiClient(configuration) as api_client:
    api_instance = mailslurp_client.EmailControllerApi(api_client)
    try:
        api_instance.delete_all_emails()
    except ApiException as e:
        print(e)

合体

import mailslurp_client
from mailslurp_client.rest import ApiException

configuration = mailslurp_client.Configuration()
configuration.api_key['x-api-key'] = ### API Key ###

def main():
    get_url()
    delete_all_email()

def get_url():
    with mailslurp_client.ApiClient(configuration) as api_client:
        api_instance = mailslurp_client.WaitForControllerApi(api_client)
        inbox_id = ### InboxのID ###
        timeout = 3000
        unread_only = False

        try:
            email = api_instance.wait_for_latest_email(inbox_id = inbox_id, timeout = timeout, unread_only = unread_only)
            print(email.body)   # 一旦ここでは出力まで
        except ApiException as e:
            print(e)

def delete_all_emails():
    with mailslurp_client.ApiClient(configuration) as api_client:
        api_instance = mailslurp_client.EmailControllerApi(api_client)
        try:
            api_instance.delete_all_emails()
        except ApiException as e:
            print(e)

if __name__ == "__main__":
    main()

今回はメール本文の取得までを目標としたので selenium 部分は省略します。

まとめ

MailSlurp 自体は良い感じだったのですが、無料アカウントだとメール受信数の月の制限が厳しく(100通)テストで使うには難しいかも :persevere:

参考

GitHub(mailslurp / mailslurp-client-python)

 
GENZの自動化ソリューション「G-SAT」
採用サイトはこちら

QA・テストの最近記事

  1. 単体テスト完全ガイド|基礎から設計・実装までソフトウェア品質を支えるやり方

  2. アジャイル開発のテスト戦略|品質を落とさないテスト自動化とベンダー活用の実践例

  3. はじめてのテストアウトソーシング入門|開発会社が失敗しない外部委託の進め方

  4. Windowsで始めるsqlite3超入門|QAエンジニア向けSQL・データ検証の基礎

  5. 内部結合テストと外部結合テストの違いとは?目的・観点・設計ポイントを整理

関連記事