PythonでAPIテストを自動化!pytestとrequestsの使い方を徹底解説
生徒
「PythonでAPIの開発をしているのですが、毎回手動で動くかチェックするのが大変になってきました。何か良い方法はありますか?」
先生
「それは『テストの自動化』の出番ですね!Pythonにはpytestという便利な道具と、通信を行うためのrequestsというライブラリがあります。これらを組み合わせると、ボタン一つで全ての機能が正しく動くか確認できるようになりますよ。」
生徒
「自動化なんて難しそうですが、初心者でもできますか?」
先生
「大丈夫です。まずは基本の仕組みを理解するところから始めて、一歩ずつ進めていきましょう!」
1. APIテストの自動化とは?初心者向けにやさしく解説
まず「API」という言葉についておさらいしましょう。API(Application Programming Interface)は、ソフトウェア同士が情報をやり取りするための「窓口」のようなものです。例えば、スマホアプリがサーバーから最新のニュースを取得するとき、この窓口を通じてデータをやり取りします。
API開発が進むと、修正した箇所が原因で「以前まで動いていた場所が動かなくなる」というトラブル(デグレ)がよく起こります。これを防ぐために、人間が手作業で確認するのではなく、プログラムに「正しく動いているか」をチェックさせることを「テストの自動化」と呼びます。
パソコンを触ったことがない方でもイメージしやすい例えで言うと、工場で製品が出来上がるたびに検品担当者がチェックするのではなく、自動検査マシンを導入して一瞬で合否を判定させるようなイメージです。
2. 必要な道具を揃えよう!pytestとrequestsのインストール
PythonでAPIテストを自動化するために、今回は2つの非常に有名なライブラリ(便利な道具セット)を使います。
- requests(リクエスト):PythonからウェブサイトやAPIにアクセスするためのライブラリです。ブラウザの代わりに「このデータをちょうだい!」とお願いする役割を持ちます。
- pytest(パイテスト):テストを実行して、その結果が「合格(Pass)」か「不合格(Fail)」かを判定してくれるフレームワークです。
これらの道具を使うには、パソコンの「ターミナル」や「コマンドプロンプト」という黒い画面で、下記のコマンドを入力してインストールする必要があります。
# ライブラリをインストールするコマンド
# ターミナルで実行してください
pip install pytest requests
インストールが終われば、準備完了です。これであなたのパソコンは自動テストを実行するマシンへと進化しました。
3. requestsライブラリでAPIにアクセスする基本
テストを自動化する前に、まずはrequestsを使って実際にAPIからデータを取得する練習をしてみましょう。APIにアクセスすることを「リクエストを送る」と言い、返ってくるデータのことを「レスポンス」と言います。
以下のコードは、インターネット上にあるテスト用のAPIから情報を取得するシンプルな例です。
import requests
# テスト用のURLにアクセスしてデータを取得する
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
# 返ってきた「ステータスコード」を表示する(200なら成功!)
print(f"ステータスコード: {response.status_code}")
# 中身のデータ(JSON形式)を表示する
print(response.json())
実行結果は以下のようになります。
ステータスコード: 200
{'userId': 1, 'id': 1, 'title': 'sunt aut facere ...', 'body': 'quia et suscipit ...'}
「ステータスコード」とは、通信の結果を表す数字です。ウェブの世界では200番台なら「成功」、404番なら「見つからない(エラー)」という決まりがあります。テストでは、この数字が「200」になっているかどうかをチェックするのが基本になります。
4. pytestを使って「自動テスト」の形にしてみよう
さて、いよいよ本番です。pytestを使って「テストコード」を書いてみましょう。pytestのルールはとても簡単で、関数(プログラムのまとまり)の名前を「test_」から始めるだけです。
「assert(アサート)」という言葉が出てきますが、これは「断言する」という意味です。「この結果は絶対こうなるはずだ!」とプログラムに命令し、もし違っていたらエラーとして報告してくれます。
import requests
def test_get_post_status_code():
"""APIが正常にデータを返してくれるか確認するテスト"""
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)
# ステータスコードが200(成功)であることを確認する
assert response.status_code == 200
def test_get_post_title():
"""返ってきたデータのタイトルが正しいか確認するテスト"""
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)
data = response.json()
# 取得したデータの「id」が1であることを確認する
assert data["id"] == 1
このファイルを test_api.py という名前で保存し、コマンドプロンプトで pytest と入力して実行すると、自動的にテストが走り、結果を教えてくれます。
5. データを送信するテスト(POSTリクエスト)
これまではデータを「取得」するテストでしたが、次はデータを「送信」するテストに挑戦しましょう。例えば、新しいユーザーを登録したり、メッセージを投稿したりする動作です。これを「POST(ポスト)リクエスト」と呼びます。
POSTリクエストのテストでは、送ったデータが正しく処理され、サーバー側で新しいIDが発行されたかなどを確認します。
import requests
def test_create_post():
"""新しい投稿が作成できるか確認するテスト"""
url = "https://jsonplaceholder.typicode.com/posts"
# 送信したいデータ(辞書形式)
payload = {
"title": "初めての自動テスト",
"body": "Pythonとpytestでテストをしています。",
"userId": 1
}
# データを送る(postメソッドを使用)
response = requests.post(url, json=payload)
# 201は「作成成功(Created)」を意味するステータスコード
assert response.status_code == 201
# 送ったタイトルが正しくレスポンスに含まれているか
assert response.json()["title"] == "初めての自動テスト"
このように、入力値(送るデータ)と期待値(返ってくるはずのデータ)を比較することで、開発したAPIが仕様通りに動いているかを保証できるのです。
6. 異常系のテスト!エラーが正しく返るかチェック
「正常に動くこと」を確認するのと同じくらい大切なのが、「ダメなときに正しくエラーを出すこと」の確認です。これを「異常系テスト」と呼びます。
例えば、存在しないページにアクセスしたときに、ちゃんと「404 Not Found」というエラーが返ってくるかをチェックします。もしここで成功(200)が返ってきてしまったら、それはシステムのバグ(不具合)と言えます。
import requests
def test_not_found():
"""存在しないURLにアクセスしたときに404エラーになるか確認"""
# 存在しない適当な番号を指定
url = "https://jsonplaceholder.typicode.com/invalid-page-9999"
response = requests.get(url)
# 期待されるのは「404(見つからない)」エラー
assert response.status_code == 404
わざと間違ったリクエストを送り、プログラムが「それは間違いですよ!」と正しく怒ってくれることを確認する。これも立派なテストのテクニックです。
7. Pythonのテスト自動化がエンジニアに必須な理由
最近のウェブ開発では、1日に何回もプログラムを更新することがあります。そのたびに手動で何十箇所もテストするのは現実的ではありません。自動テストを一度書いておけば、開発者は安心して新しい機能を追加できるようになります。
特に「APIテスト」は、画面のデザイン(見た目)が変わっても影響を受けにくいため、非常に安定したテストになります。プログラミング未経験の方でも、pytest と requests の基本さえマスターすれば、現場で即戦力として役立つ「品質管理」のスキルを身につけることができるでしょう。
まずは、自分の好きなサイトのステータスコードを確認するだけの簡単なコードから書いてみてください。その一歩が、プロフェッショナルなエンジニアへの道に繋がっています。
8. 実行結果を確認してデバッグする方法
テストを実行して、もし「Fail(不合格)」になった場合はどうすればいいでしょうか?pytestは、どこがどう違っていたのかを親切に表示してくれます。
例えば、ステータスコードが200のはずなのに500が返ってきた場合、画面には以下のようなメッセージが表示されます。
> assert response.status_code == 200
E assert 500 == 200
E + where 500 = <Response [500]>.status_code
これを見れば、「あ、サーバー側で何か重大なエラー(500)が起きているんだな」とすぐに原因の切り分けができます。このように、自動テストは単なる「合否判定」だけでなく、問題の場所を特定するための「探偵」のような役割も果たしてくれるのです。
パソコンの操作に不慣れなうちは、エラーが出ると驚いてしまうかもしれませんが、プログラミングの世界では「エラーは宝の山」です。エラーメッセージをじっくり読むことが、上達への一番の近道になります。