skydum

個人的な作業記録とか備忘録代わりのメモ

vscodeでpytestを使う為の設定

vscodeでpytestを使う

vscodeでpytestを使う環境を作る時に毎回説明するのが大変なので手順を記載する。 テストができる環境までを記載する。
pytestの使い方とかは他の方が書いた記事を参考にしてください。

環境

Windows 10 からリモート デベロップメントでUbuntuに繋いで環境を作る 接続先はUbuntu 20.04.5 LTS(Python 3.8.10) 最低限Ubuntuに接続してpythonデバッグができるようにするための拡張をvscodeに入れる

  • テストを実行するのに利用したソースファイル一式をダウンロード

vscode

# バージョンを固定してコマンドでRemote Developmentの拡張機能をインストール
code --install-extension ms-vscode-remote.vscode-remote-extensionpack@0.23.0

UbuntuへRemote Developmentで接続後

code --install-extension ms-python.python@2022.18.2
code --install-extension hbenl.vscode-test-explorer@2.21.1

pytestとpytest-mockのインストール

テスト用のライブラリのpytestsとmockを使うためのpytest-mockをインストールする

$ python3 -m pip install --upgrade pip  ← pipのバージョンを最新版に更新する
$ python3 -m pip install pytest pytest-mock  ← pytestとpytest-mockをインストール

テストに利用するソースコードの構成(テスト用のコードが含まれていない状態)

  • ダウンロード

  • ファイル構成

.
├── master.py
└── module
    ├── calculation.py
    ├── __init__.py
    └── users.py
ソースファイル

ソースコード(クリックで展開)

  • master.py
from module import add, get_user_address


def main_add():
    X = 10
    Y = 20

    ans = add(X, Y)

    print(ans)


def main_address():
    USER_ID = 1
    res = get_user_address(USER_ID)

    print(res)


if __name__ == "__main__":
    main_add()
    main_address()
  • module/__init__.py
from .calculation import add
from .users import get_user_address

__all__ = ["get_user_address", "add"]
  • module/calculation.py
def add(x: int, y: int) -> int:
    res = x + y
    return res
  • module/users.py
from typing import TypedDict

import requests


class Geo(TypedDict):
    lat: str
    lng: str


class Address(TypedDict):
    street: str
    suite: str
    city: str
    zipcode: str


class Company(TypedDict):
    name: str
    catchPhrase: str
    bs: str


class User(TypedDict):
    id: int
    name: str
    username: str
    email: str
    address: Address
    geo: Geo
    phone: str
    website: str
    company: Company


def fetch_user_data(user_id: int) -> User:
    url = f"https://jsonplaceholder.typicode.com/users/{user_id}"

    res = requests.get(url)
    res.raise_for_status()

    return res.json()


def get_user_address(user_id: int) -> Address:
    res = fetch_user_data(user_id)
    address = res["address"]

    return address

テストコードの作成

テスト用のファイルとてテストで必要となるファイルを以下の構成となるように作成する。 testsディレクトリを作成して、その中に__init__.pyとtest_add.pyを作成する。

.
├── master.py
├── module
│   ├── calculation.py
│   ├── __init__.py
│   └── users.py
└── tests
    ├── __init__.py
    └── test_add.py
  • __init__.py

    • ファイルさえ存在していれば中身は空でOKです。
  • test_add.py

from module.calculation import add  # テストで実行してほしい内容を記載したメソッド


class TestAdd:
    def test_add_success(self, mocker):  # テストで実行してほしい内容を記載したメソッド
        ans = 30

        X = 10
        Y = 20

        add_ans = add(X, Y)

        assert ans == add_ans

    def test_add_failure(self, mocker):  # テストで実行してほしい内容を記載したメソッド
        ans = 50

        X = 10
        Y = 20

        add_ans = add(X, Y)

        assert ans == add_ans

vscodeでテストができるように設定を追加

  1. vscodeの画面上で「ctrl + shift + p」を押してコマンドパレットを開く。
  2. 開いたコマンドパレットに「test」を入力。
  3. Python テストを構成する」を選択。
  4. pytestを選択。
  5. テストコードの入っているディレクトリ「tests」を選択。
  6. test/test_add.pyを開いてみて以下の様な状態になっていたらテストが実行可能。

vscodeでテストを実行

いちばん簡単なテストを実行

  • を押してテストを実行する。

  • テストに成功した場合はが表示され、失敗した場合はが表示される。

APIからのレスポンスを差し替えてテストを実行

  • 任意のメソッドをmock(ダミーのメソッド)に差し替えて実行するテスト
  • 本来はAPIへrequestsを使ってアクセスする処理をAPIへアクセスせずにレスポンスのデータをダミーデータとして返すように差し替えて実行する