nikkie-ftnextの日記

イベントレポートや読書メモを発信

#pyconjp2024 トーク「あなたのアプリケーションをレガシーコードにしないための実践Pytest入門」を元に、MySQLのDockerコンテナでpytest-mysqlを動かす

はじめに

天賦!天啓!天空橋! nikkieです。

日が空きましたが、PyCon JP 2024のインプットを自分の理解を深めるために記事にするシリーズ1です。

目次

トーク「あなたのアプリケーションをレガシーコードにしないための実践Pytest入門」

https://2024.pycon.jp/ja/talk/D9BDAQ

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.pytest_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のトークでは、そのために環境変数を使う実装でした。


  1. 前回
  2. 余談ですが、私の環境ではHomebrewで入れたMySQLクライアントにPATHを通す必要がありました(export PATH="/opt/homebrew/opt/mysql-client@8.0/bin:$PATH"