テスト環境を作るときに少し便利なTips

Webサービスを作るときに、開発中はローカルに置いてあるDBを指して開発することが多いと思います。でもパフォーマンスイシューの修正とか特定のユーザーの環境でしか起こらないバグの修正とかで、本番のDBをローカルにコピーしてくることもありますよね。

え、そんな危険なことできないって? でも僕はよくやりますよ、えぇ。(小芝居)


ただそうすると「ユーザーのメアドが含まれているので、間違ってユーザーにテストメールを送ってしまいそうで怖い」のような不安に駆られますよね。今回はその解決方法を記事にしておこうと思ったのでした。

やることはたった1つだけですが、まず事前準備としてGmailかOutlook.comでメールアドレスを取得しておきましょう。このメールアドレスを example@gmail.com とします。(Outlook.comの場合は、以後 @gmail.com を適宜 @outlook.com に読み替えて下さい。)


で、やることは、

全ユーザーのメアドを
example+<任意の文字列>@gmail.com
として上書きする

だけです。


たったこれだけで、メール通知を含む機能の試験などが安心してできるようになります。


説明する必要も無いかと思いますが、GmailやOutlook.comには
「メールアドレスのユーザー名部分で、"+"(プラス記号)以降の文字列を無視する」
というありがたい仕様があります。 example@gmail.com というユーザーには example+test@gmail.com 宛てに送ったメールも届くのです。この仕様をテスト環境に適用したらちょっとハッピーだな、と気付いた時はちょっとニヤけてしまいました。


具体的にはDjangoで以下のようなスクリプトを実行しています。

from django.db import models


class Account(models.Model):
    email = models.EmailField(u'ユーザーのメアド', max_length=254)
from myapp.models import Account

for x in Account.objects.all():
    src = x.email
    if src.endswith(u'leadingmark.jp'):
        continue  # 自社ドメインのメアドに対しては何もしない
    if src == u'example@gmail.com':
        continue  # 自分のメアドに対しては何もしない

    former, latter = src.split(u'@')
    dst = 'example+{}___{}@gmail.com'.format(former, latter)
    print 'Convert {} => {}'.format(src, dst)
    x.email = dst
    x.save()

ちなみにこんな遅くて危険なコードは製品コードに入れてはダメなので、それだけはご注意下さい。危険すぎるので僕はgitで管理もしていませんし、実際のコードにはローカル環境以外で実行したらエラーになるような安全策も入れてあります。