pytest-mock を使ってみた #python

概要

  • Python のテストを Pytest で書いてみた
  • Mock を使おうと思ったら pytest-mock という標準の薄いラッパーを使うのがいいらしい
  • そもそも標準を知らないので少し苦労した
  • なのでログとして残しておく

テスト対象

HTTPリクエストして、レスポンスを返すような処理を書いてみる。

レスポンスをモックしてテストしてみる。

import requests

def sample():
    try:
        # ここを Mock したい
        res = requests.get("http://checkip.amazonaws.com/")

    except requests.RequestException as e:
        print(e)
        raise e

    return {
        "statusCode": res.status_code,
        "ip": res.text,
    }

テストコード

本来なら 200 のレスポンスが返ってくるはずだが、 404 にしてみる

from hello_mock import app

def test_sample(mocker):
    # 嘘のレスポンスを作成
    responseMock = mocker.Mock()
    responseMock.status_code = 404
    responseMock.text = '127.0.0.1'

    # requests.get の戻り値を patch する
    mocker.patch('requests.get').return_value = responseMock

    actual = app.sample()
    assert actual['statusCode'] == 404
    assert actual['ip'] == '127.0.0.1'

補足

pytest-mock を使うと、 mocker 経由で Mock を扱えるので便利。

side-effect とかを使えば例外のテストなんかもできそう。

参考