djangoのテストコード書いていますか?
テストコードを書かないと「テストコードを書かないことが、バグだ!!」なんて言われますし、長期的には開発・保守効率が下がるためテストコードは書いているに越したことはありません。
本日はdjangoのテストコードのお話です。
テストコードをしっかりと書いたものの「大量のデータを用意してのテストコードはどうすれば良いんだ?」って時の解決方法です。
今回は前提としてcsvファイルを用意しておき、テストを走らせたときに、テストコードが用意したcsvファイルを読み取ってテストデータベースにオブジェクトを一気に生成する方法です。
・djangoのテストでcsvファイルからまとめてオブジェクトをcreateしたい
・django 2.2
・python3.8
・csvファイル
・pythonのpandasをインストール済み
それでは順番に説明をしていきます。
コンテンツ
辞書型データを1つずつ用意するのは非効率でスマートではない
例えば、ある定義したモデル、ここではわかり易くuserにしますが、userオブジェクトをたくさん用意したくなった時のケースを考えてみます。
class Userは一般的なもので、username, age, sexのフィールドを定義しておきます。
models.py
from django.db import models
class User(models.Model):
username=models.CharField(
verbose_name='username',
max_length=10,
)
age = models.IntegerField(
verbose_name='age',
max_length=3,
)
sex = models.CharField(
verbose_name='sex',
max_length=6,
)
実際にテストコードを書くとき、数にこだわらない場合は以下のように書くのが一般的でしょう。
tests.py
user_data_01 = {
'username': 'Tom',
'age': 22,
'sex': 'Male',
}
User.objects.create(user_data_01)
user_data_02 = {
'username': 'Emma',
'age': 21,
'sex': 'Female',
}
User.objects.create(user_data)
オブジェクトが指で数えるくらいの数なら問題ないですが、これがもしも数百数千となったらどうでしょうか?
いちいち書くのは、非効率でスマートではありません。
では、どうすれば良いのか?
ようやく本題にきましたので、その方法を紹介します。
オブジェクトの作成
まずuserデータが入ったcsvファイルが用意されていることを前提に進めます。
ちなみに今回の記事に合わせて実際のcsvファイルを用意しました。
数はそんなに入っていないですがこのようなcsvファイルを使用する、という認識で利用ください。
実際のテストコードは以下になります。
また今回pythonのデータ分析ライブラリのPandasを使用しますので、まだインストールしていない人はインストールをしてください。
コードの中身の詳細はコードの後で説明します。
tests.py
import pandas as pd
from .models import User
df = pd.read_csv('user.csv')
for _, row in df.iterrows():
dict_data = row.to_dict()
User.objects.create(**dict_data)
question = User.objects.all()
print(question.count()) # 5
- 1行目でライブラリの準備する
- 3行目でpandasライブラリからcsvファイルを読み込む
- 6行目以降で、辞書にして展開しながら辞書型オブジェクトの引数を作成する
- for文で回す、_は連番を意味する
- for文で回す、rowは行列表示を意味する
- 7行目でrowを辞書型オブジェクトに変換する
- 8行目でデータをcreateする
csvファイルさえ用意ができていれば、これで大量のオブジェクトを作成してテストを回すことができます。
以上。
最後に
いかがでしたでしょうか。
以上が、「【Django/test】createを使ってcsvファイルからモデルのオブジェクトを一気に作成する」の紹介記事になります。
プログラミング学習を効率良く進めるには…
私ヒロヤンがプログラミングを始めた頃は以下のような感じでした。
何から手をつけていいのか、わからない。
プログラミングを始めてみたけど、エラーが解決できない。
そしてネットで調べていくうちに膨大な時間が過ぎていきました。
私ヒロヤンの実体験より、プログラミングを効率的に学ぶために大切なことは以下のことだと考えています。
1. いつまでもダラダラとやらないで、目標を決定して短期集中する
2. マンツーマンで、わからない箇所は直ぐに質問をして即レスをもらう
.proでは私ヒロヤンが学習してきたプログラミング経験0からのpython/django、その他webサイト・サービス開発のコースが用意されています。
カウンセリング自体は無料なので話を聞いてみるだけでもいかがでしょうか?
また以下のリンク先ではdjangoを教えてくれるスクールをまとめ紹介しています。




コメントを残す