Help us understand the problem. What is going on with this article?

環境(本番、テスト、開発、 etc.)を判別して分岐するような実装は避ける

問題提起

例えば、以下のようなコードを見かけたことはありませんか。僕はあります。

sample.php
if (APP_ENV === 'production') {
    // 本番環境でのみ動作するコード
}

※コードはPHPですが、特定言語に依存する話ではありません。
※ドメイン(FQDN)で分岐するのも同類です。

事例としては、本番だけ特定のアドレスにメールを飛ばしたいとか。
開発環境でだけログを出したいとか。

ですが、このような実装は避けるべきと考えます。
理由は端的にいうと「テストしにくいから」

上記上げたコード、どうやってテストしたらいいでしょうか?

  • 本番でテストする?
    • 本番環境でテスト、とは...
  • テスト環境の APP_ENV を一時的に production にする ?
    • 他の箇所にも影響しますよね...
  • if (APP_ENV === 'production' or true) { と一時的無理やり通るようにする?

どれも場当たり的な対応という印象が拭えません。

解決策

では、どうすればいいかというと

「その機能を使うか否かを判別するためのスイッチを環境変数として用意する」

例えば、環境変数で AWESOME_FUNCTION_SWITCH というのを作ります。

.env
AWESOME_FUNCTION_SWITCH=0

※ ここでは .env ファイルで定義していますが、OSの環境変数で定義してもOK

で、プログラム側では、この環境変数を見て処理を分岐します。

sample.php
if (getenv('AWESOME_FUNCTION_SWITCH') === '1') {
    // AWESOME_FUNCTION の実装
}

このようにすれば、手元の環境でテストしたいときは
環境変数の値を変更すれば良いだけになり、プログラム内から環境による分岐処理を無くすことができます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away