Flaskアプリのテストと本番環境を分離する方法(設定・データベース)
生徒
「先生、Flaskアプリを開発しているとき、本番とテストで同じデータベースを使っても大丈夫ですか?」
先生
「それは避けたほうがいいです。テスト中にデータを消したり壊したりするリスクがあるからです。本番環境とテスト環境は分けることが推奨されます。」
生徒
「どうやって簡単に分けられるんですか?」
先生
「Flaskでは設定ファイルや環境変数を使うと簡単に分けられます。順番に見ていきましょう。」
1. 環境ごとに設定を分ける
Flaskアプリでは、設定ファイルや環境変数を使うことで、テスト環境と本番環境の設定を切り替えられます。環境変数とは、コンピュータに登録する「この環境ではこう動く」という目印のようなものです。
例えば、config.pyに次のように書きます。
class Config:
DEBUG = False
TESTING = False
SQLALCHEMY_DATABASE_URI = "sqlite:///production.db"
class TestConfig(Config):
DEBUG = True
TESTING = True
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"
こうすることで、テスト環境ではtest.db、本番環境ではproduction.dbを使うように切り替えられます。
2. Flaskアプリで設定を読み込む方法
Flaskアプリ本体で、どの環境設定を使うか指定します。
from flask import Flask
import os
from config import Config, TestConfig
app = Flask(__name__)
if os.environ.get("FLASK_ENV") == "testing":
app.config.from_object(TestConfig)
else:
app.config.from_object(Config)
こうすると、環境変数FLASK_ENVをtestingに設定するとテスト環境用の設定が読み込まれます。設定を変えるだけで、本番データを安全に保ちながらテストできます。
3. データベースを分ける理由
テスト環境と本番環境でデータベースを分ける最大の理由は、データの安全性です。テスト中にレコードを追加したり削除したりしても、本番データには影響しません。
また、テストでは架空のデータを使うことで、実際のユーザー情報を守れます。個人情報保護の観点でも重要です。
4. Flaskでテスト用データベースを作る方法
SQLiteのような軽量データベースを使えば、テスト用のデータベースを簡単に作れます。
from app import app, db
app.config.from_object("config.TestConfig")
db.create_all() # テーブルを作成
これでtest.dbにテーブルが作られ、テスト用のデータを安全に操作できます。
5. 自動テストで本番環境を汚さない
CI/CDパイプラインでテストを自動化する場合も、必ずテスト用データベースを使います。例えばGitHub ActionsやGitLab CIでFlaskのテストを走らせるとき、テスト環境を指定して安全に実行できます。
# GitHub Actionsでの例
- name: Run tests
run: |
export FLASK_ENV=testing
python -m unittest discover
この方法で、テスト中に本番データを誤って消すリスクを防げます。
6. 本番環境との接続を切り替えるポイント
- 環境変数で
FLASK_ENVを切り替える - 設定ファイルで本番用とテスト用を分ける
- テスト用データベースを用意し、本番データに触らない
- CI/CDでテストを自動実行する
これらを守ることで、Flaskアプリ開発のテストと本番環境を安全に分離できます。
まとめ
Flaskアプリでテスト環境と本番環境を分離する重要性
Flaskアプリを開発するうえで、テスト環境と本番環境を分けることは、アプリを安全かつ安定して運用するための基本です。 開発中やテスト中は、データを何度も追加したり削除したり、失敗する前提で操作を行います。 もし本番環境と同じデータベースを使ってしまうと、実際のユーザー情報を誤って消してしまったり、正しいデータを壊してしまう危険があります。
特にFlaskはシンプルで手軽にAPIやWebアプリを作れる反面、設定を分けずにそのまま動かせてしまうため、 初心者のうちは「テストも本番も同じ設定」で進めてしまいがちです。 しかし、アプリが成長し、ユーザーが増えるほど、環境を分離しておくことの価値は大きくなります。
設定ファイルと環境変数で安全に切り替える
今回の記事では、設定ファイルと環境変数を使って、Flaskアプリの動作を環境ごとに切り替える方法を学びました。 本番用の設定とテスト用の設定をクラスとして分けておくことで、アプリのコード自体を変更せずに、 実行する環境だけを切り替えられるのが大きなメリットです。
環境変数は「今どの環境で動いているか」をFlaskに伝える目印になります。 これにより、同じアプリでも、本番では安全重視、テストでは検証重視といった使い分けが可能になります。
# 環境変数によって設定を切り替える例
if os.environ.get("FLASK_ENV") == "testing":
app.config.from_object(TestConfig)
else:
app.config.from_object(Config)
このような仕組みを作っておくことで、「テスト中に本番データを触ってしまう」という事故を未然に防げます。 これは個人開発だけでなく、チーム開発や業務システムでも必須の考え方です。
データベースを分けることで得られる安心感
テスト用データベースと本番用データベースを分けることで、開発者は安心して試行錯誤できます。 テストでは、ダミーデータや架空のユーザー情報を使い、自由に操作できます。 これにより、実際の利用者の情報を守りながら、アプリの品質を高められます。
また、SQLiteのような軽量データベースを使えば、テスト用データベースの作成や削除も簡単です。 テストが終わったら消してしまえるため、環境を常にクリーンな状態に保てます。
自動テストとCIでさらに安全に
CI環境で自動テストを実行する場合も、必ずテスト環境を指定することが重要です。 環境変数を使ってテスト用設定を読み込ませることで、テストが自動で実行されても、 本番データベースに影響が出ることはありません。
こうした仕組みを整えておくと、コードを修正するたびに安心してテストを回せるようになります。 結果として、Flaskアプリの品質が安定し、トラブルの少ない運用につながります。
生徒
「最初は、テスト用と本番用を分けるのって面倒そうだと思っていましたけど、 こうして見ると、事故を防ぐためにとても大事なんですね。」
先生
「そうですね。一度仕組みを作ってしまえば、その後は設定を切り替えるだけで済みます。 むしろ分けていない方が、後から大きなトラブルになりやすいんです。」
生徒
「テスト中に本番データを消してしまう話を聞くと、ちょっと怖くなりました。 最初から環境を分けておくのが安心ですね。」
先生
「その通りです。Flaskはシンプルだからこそ、環境分離を意識することが大切です。 今日学んだ方法を使えば、安全に開発と運用を続けられますよ。」
生徒
「これからは、テスト環境と本番環境をきちんと分けてFlaskアプリを作ってみます。 自信を持って開発できそうです!」