0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pytestのparametrizeを使用してテストコードを書いてみる mshmura

Last updated at Posted at 2021-12-05

目的

pythonでテストコードの基本を身に着けること。
pytestのモジュールを使用して、大量データのテストコードを想定してテストが実行できるようにしてみること。

注意点

テストコード実務未経験者が書いています。何か不備がありましたら、ご指摘いただけると幸いです。

テスト対象のファイルはこちらです。↓

simple_calc.py
def add_func(x,y):
    z = x + y
    return z

def subtract_func(x,y):
    z = x - y
    return z

def multiple_func(x,y):
    z = x * y
    return z

def add_string(x,y):
    z = f'苗字は{x}です。名前は{y}です。'
    return z

このコードをテストするためのテストファイルはこちらです。
ファイル名には「test_」という接頭辞を付ける必要があります。
まずは一番シンプルな形で、テストコードを書いてみます。↓

test_simple_calc.py
import simple_calc

def test_add_func():
    assert simple_calc.add_func(1,2) == 3

def test_subtract_func():
    assert simple_calc.subtract_func(3,2) == 1

def test_multiple_func():
    assert simple_calc.multiple_func(3,2) == 6

def test_add_string():
    assert simple_calc.add_string("田中","太郎") == "苗字は田中です。名前は太郎です。"

テスト対象のデータが増えてきた場合、テスト関数内でfor文を回してテストしていくんでしょうかね....
そのようなやり方ではなく、pytestモジュールのparametrizeという関数?を使用すると、テスト関数部分を汚さずスッキリ書けるので、やってみました。

test_simple_calc_param.py
import simple_calc
import pytest

# テスト関数ごとにダミーデータを用意
# 今回の場合、第一引数,第二引数が計算に使用する変数。
# 第三引数に期待する計算(関数の実行)結果を設定します。

dataset_for_add_func = [
    (3, 5, 8),
    (4, 6, 10),
    (10, 10, 20)
]

dataset_for_subtract_func = [
    (5, 2, 3),
    (10, 6, 4),
    (20, 10, 10)
]

dataset_for_multiple_func = [
    (5, 2, 1),
    (10, 6, 60),
    (20, 10, 200)
]

dataset_for_add_string = [
    ("田中", "よしこ", "苗字は田中です。名前はよしこです。"),
    ("吉田", "よしこ", "苗字は吉田です。名前はよしこです。"),
    ("佐藤", "よしこ", "苗字は佐藤です。名前はよしこです。"),
]


@pytest.mark.parametrize('param1,param2,result',dataset_for_add_func)
def test_add_func(param1, param2, result):
    assert simple_calc.add_func(param1, param2) == result

@pytest.mark.parametrize('param1,param2,result',dataset_for_subtract_func)
def test_subtract_func(param1,param2,result):
    assert simple_calc.subtract_func(param1,param2) == result

@pytest.mark.parametrize('param1,param2,result',dataset_for_multiple_func)
def test_multiple_func(param1,param2,result):
    assert simple_calc.multiple_func(param1,param2) == result

@pytest.mark.parametrize('param1,param2,result',dataset_for_add_string)
def test_add_string(param1,param2,result):
    assert simple_calc.add_string(param1,param2) == result

この形であれば、外部から何かデータを取得してきた時にもダミーデータの形式にデータを変換することさえ出来れば、テスト関数部分をいじる必要はなくなり効率的なテストが出来ると思います。

ちなみにテスト関数を実行する時はコマンドラインからpytest 「ファイルパス名」で実行します。(pytestだけ打つとすべてのテストファイルが実行されます。)
コマンド実行時にいるディレクトリと同じである場合は、下記のとおりです。

pytest test_simple_calc.py
pytest test_simple_calc_param.py

特定のファイルの特定の関数をテストする場合下記のように「::関数名」を付けます。

pytest test_simple_calc_param.py::test_add_func
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?