見出し画像

Pythonでハマった事の殴り書き (多分後々整理+少しずつ記載)

※自分用に少しずつ更新していきます。※

1.pytest時のカバレッジ除外

カバレッジ100%にするため、条件網羅する必要があったが、
カバレッジが取れない(と思ってる)箇所は下記コメント記載すると除外される。

if __name__ == '__main__': # pragma: no cover
    main()

HTML形式のレポート出力
※pytest使用時は下記コマンドで--cov-report=htmlを指定して

pytest -v --cov=./src --cov-report=html

結果

2.メソッド毎のテストデータ読込と検証

テスト用ディレクトリ構成

テストデータ

テストファイルのディレクトリパス、ファンクション名取得

EVENTS_DATA = os.path.dirname(__file__) + "/events/"
function_name = sys._getframe().f_code.co_name

テストコード

def test_main_001():

    # def名
    function_name = sys._getframe().f_code.co_name

    # テスト読込
    result = []
    with open(EVENTS_DATA + function_name + ".json", mode='r', encoding="utf8") as f_in:
        while True:
            line = f_in.readline()
            if len(line) == 0:
                break
            # json変換
            json_object = json.loads(line) 
            result.append(json_object)
    
    assert len(result) == 3
    assert result[0]["a"] == 100
    assert result[0]["b"] == 200
    assert result[1]["c"] == 300
    assert result[1]["d"] == 400
    assert result[2]["e"] == 500
    assert result[2]["f"] == 600

3.リスト要素の件数カウント

def main():
    list = ["a", "b", "c", "a", "a", "c"]
    edit = collections.Counter(list)
    print(edit)

結果

Counter({'a': 3, 'c': 2, 'b': 1})

4.再起的にディレクトリ作成(存在する場合は何もしない)

import os

CREATE_DIR = os.path.dirname(__file__) + "/a/b/c/"

def main():
    # exist_ok=Trueでディレクトリが存在してもOK
    os.makedirs(CREATE_DIR, exist_ok=True)

結果

5.指定したファイルのパスを取得

def main():
    # recursive=Trueで再起的に取得
    # ワイルドカード使用出来る
    # 「/*/」は同一階層
    # 「/**/」は中間層含む
    files = glob.glob('./**/*.txt', recursive=True)
    for file in files:
        print(file)
フォルダ構成
標準出力結果

6.今日の日付、時間を指定したフォーマットで文字列に変換

from datetime import datetime as dt, date

def main():

    print(str_today('%Y/%m'))
    print(str_today('%Y-%m-%d'))
    print(str_now('%Y/%m/%d %H:%M:%S'))
    print(str_now('%Y-%m-%d %H:%M:%S.%f'))


def str_today(format):
    today = date.today()
    
    # 日付型に変換後、指定されたフォーマットに改めて変換
    return today.strftime(format)

def str_now(format):
    now = dt.now()
    
    # 日付型に変換後、指定されたフォーマットに改めて変換
    return now.strftime(format)
標準出力結果

7.pytest時にmockを使用する

ローカル環境でpytestを行いたい時に、S3に接続する環境がなくmockを使用する場合があったのでメモとして残しておく。

pipでpytest-mockインストール

pip install pytest-mock

テスト対象コード

import src.util.s3_util as s3_util
from json.tool import main

def main():
    # ★ここをモック化
    file_contents = s3_util.get_download_s3_file_contens('dummy_bucket', 'dummy_object_key')

    return file_contents
 
if __name__ == '__main__': # pragma: no cover
    main()

テストコード

def test_main_003(mocker):
    # モックした際に、返却値を指定
    mocker.patch('src.util.s3_util.get_download_s3_file_contens', return_value='Hello World!!')

    result = edit.main()

    assert result == 'Hello World!!'

※呼出回数で返却値を変更

テスト対象コード

def main2():
    list = []
    # ★ここをモック化
    file_contents = s3_util.get_download_s3_file_contens('dummy_bucket', 'dummy_object_key')
    file_contents2 = s3_util.get_download_s3_file_contens('dummy_bucket', 'dummy_object_key')

    list.append(file_contents)
    list.append(file_contents2)

    return list

テストコード

def test_main_004(mocker):
    # side_effectで返却値を配列で指定
    mocker.patch('src.util.s3_util.get_download_s3_file_contens').side_effect=['Hello World!!', 'One Two Three']

    result = edit.main2()

    assert result[0] == 'Hello World!!'
    assert result[1] == 'One Two Three'
テスト結果


この記事が気に入ったらサポートをしてみませんか?