はじめに
天賦!天啓!天空橋! nikkieです。
日が空きましたが、PyCon JP 2024のインプットを自分の理解を深めるために記事にするシリーズ1です。
目次
- はじめに
- 目次
- トーク「あなたのアプリケーションをレガシーコードにしないための実践Pytest入門」
- pytest-mysql
- DockerでMySQLのコンテナを立てて、pytest-mysqlを使ったテストを動かす
- 終わりに
トーク「あなたのアプリケーションをレガシーコードにしないための実践Pytest入門」
https://2024.pycon.jp/ja/talk/D9BDAQ
スライドを読了(やむなく現地断念)
— nikkie / にっきー (@ftnext) 2024年10月4日
pytestのカタログ👏「テスト書きたいけどわからんからいいや」を解決してくれそうです
・parametrize
・tmp_pathでファイル入出力
・monkeypatchで環境変数や外部Web API呼び出しを差し替え
・自作フィクスチャ#pyconjp_1 #pyconjp2024 https://t.co/vFmvXggvac
pytest-mysql
このトークで知りました。
conftest.pyの中では、環境変数(os.environ
)4つ
MYSQL_HOST
MYSQL_PORT
MYSQL_USER
MYSQL_PASSWORD
を読み取ります。
フィクスチャではこれらからテスト用のデータベースに接続するURLを組み立てて、接続(セッション)を返しています。
私はこのトークを聞いておらず(自分の発表準備で間に合わず)、資料から環境構築が私には自明ではなかったので、少し試行錯誤しました。
結論としては、DockerでMySQLのコンテナを用意してテストが実行できています
DockerでMySQLのコンテナを立てて、pytest-mysqlを使ったテストを動かす
私の環境はmacOSで、HomebrewでインストールしたMySQLクライアントです。
% mysql --version mysql Ver 8.0.39 for macos14.4 on arm64 (Homebrew)
MySQLのコンテナを立てます。
https://hub.docker.com/_/mysql
% docker --version Docker version 27.2.1-rd, build cc0ee3e % docker run --rm --name mysql-db -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 13306:3306 -d mysql:8.0
次のようにして接続できます2。
% mysql -h 127.0.0.1 -P 13306 -uroot -p
続いて、Pythonのプロジェクトのターミナルで4つの環境変数を設定します。
export MYSQL_HOST=127.0.0.1 export MYSQL_PORT=13306 export MYSQL_USER=root export MYSQL_PASSWORD=my-secret-pw
念のため環境変数を参照してDBに接続できることを確認します。
% mysql -h ${MYSQL_HOST} -P ${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASSWORD}
環境変数を設定し、それを参照してDBにも接続できるのであれば、pytest
を実行!!
テストからもDBに接続でき、スライドにあるtest_get_user.pyやtest_add_user.pyが実行できます。
ちなみにDBのコンテナを落とす(docker stop mysql-db
)と、pytest
は落ちます。
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 61] Connection refused)")
終わりに
pytest-mysqlを使ったテストの環境をDockerで用意できました。
MySQLコンテナに向けて接続するURLを作るのがポイントです。
PyCon JP 2024のトークでは、そのために環境変数を使う実装でした。