![見出し画像](https://assets.st-note.com/production/uploads/images/71606793/rectangle_large_type_2_edcb00b089570a10cd33d8a1081e6187.png?width=1200)
Photo by
peishum
Pythonでハマった事の殴り書き (多分後々整理+少しずつ記載)
※自分用に少しずつ更新していきます。※
1.pytest時のカバレッジ除外
カバレッジ100%にするため、条件網羅する必要があったが、
カバレッジが取れない(と思ってる)箇所は下記コメント記載すると除外される。
if __name__ == '__main__': # pragma: no cover
main()
HTML形式のレポート出力
※pytest使用時は下記コマンドで--cov-report=htmlを指定して
pytest -v --cov=./src --cov-report=html
結果
![](https://assets.st-note.com/img/1644157115210-iJ7AbcpxJb.png)
2.メソッド毎のテストデータ読込と検証
テスト用ディレクトリ構成
![](https://assets.st-note.com/img/1644253614788-L5447JG2SI.png?width=1200)
テストデータ
![](https://assets.st-note.com/img/1644253789058-RSO4msJA5e.png?width=1200)
テストファイルのディレクトリパス、ファンクション名取得
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)
結果
![](https://assets.st-note.com/img/1644337407405-iPTNoJzraM.png)
5.指定したファイルのパスを取得
def main():
# recursive=Trueで再起的に取得
# ワイルドカード使用出来る
# 「/*/」は同一階層
# 「/**/」は中間層含む
files = glob.glob('./**/*.txt', recursive=True)
for file in files:
print(file)
![](https://assets.st-note.com/img/1644494303277-s5kKnYNZLm.png)
![](https://assets.st-note.com/img/1644494399434-VuebWPTIE7.png)
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)
![](https://assets.st-note.com/img/1644497954537-TtGi9HLrHz.png)
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'
![](https://assets.st-note.com/img/1644761949961-E4Mgn8CHYs.png?width=1200)