【Python】Flask + pytestでCSV送信のテストをする

【Python】Flask + pytestでCSV送信のテストをする

前回の記事では、FlaskでCSVを受け取ってpandasのDataFrame化するエンドポイントを作成しました。

今回はpytestを使ってそのエンドポイントをテストしてみたいと思います。

環境

Python==3.8.1

Flask==1.1.1

Werkzeug==1.0.0

目的

Flaskは最小限の機能だけを持つWebフレームワークですが、テスト機能がきちんと存在します。

そのテスト機能を使いこなして開発効率を向上させることが出来ますが、前回のようにCSVを受け付けるエンドポイントもテストもちろんテスト出来るので、その備忘録となります。

実際のコード

ディレクトリ構成のイメージ

pytest + Flaskの基本

Flaskにはテスト用のクライアントを作成する機能が付いているので、その機能を活用してあげます。
なお、with構文を使わないとうまくいかない模様です。

以下のようにfixtureで作成したテストクライアントから、getやpostメソッドを呼び出すことでテストが行えます。
直感的で素晴らしいですね。requestsからリクエストを送信する際と似ているのでPython使いにとって有難い作りになってます。

CSVをpostで送信する

今回は一度DataFrameとしてCSVを読み込む形をとりました。
不要データの削除や、意図的なエラー発生のための事前にデータの加工が出来るので、DataFrameに一度落とす形が無難かと思います。

さて、client.postでデータを送信しますが、CSVとして認識させるためにはその際に一手間必要です。

  1. content_typeにmultipart/form-dataを指定
  2. BytesIOにしてからデータを送信する。

完成系は以下のようになります。

BytesIOにしてからデータを送信するために、一度str型でcsvを出力(to_csvで出力先を指定しない場合はstr型で出力されます)し、その文字列をencodeしてbytes型にしています。

 

ちょっと手間取ってしまいましたが、これで快適なテスト生活に一歩近づけたような気がします。まだまだこれからですがね…。

参考

https://qiita.com/epire/items/b5ed1729d20c251d5544

https://flask.palletsprojects.com/en/1.1.x/testing/

Flaskカテゴリの最新記事