1.はじめに
- 学んだことを振り返るために記載
- assertion(アサーション)についてイマイチ分からなかったので書く
- 今週学ぶテーマはソフトウェアテスト
2.本文
2.1.assertionとは
- プログラムの条件が満たされているかチェックする文。
- 通常、コードの一部で期待される結果と実際の結果を比較される。
もし、期待が満たされない結果が出たら例外やエラーが発生する。 - assertionがTrueの場合は、普通の処理をする。
Falseの場合は、アサーションエラーが発生しプログラムがクラッシュする。 - クラッシュすることによりエラーや例外を特定し防止するのに役立つ。
・例
sample.py
import math
def squareRoot(x):
assert (x > 0)
return math.sqrt(x)
この例だとassert文のxの値が0より大きいかチェックし、小さいならプログラムがクラッシュする。
大きいなら平方根で計算され出力される。
-
得られるメリット
・エラーや例外を早期に発見することができる。
・コードの可読性や保守性を高めることができる。 -
主な用途
・デバッグ
・テスト
・コードの品質向上
2.2.汎用テスト関数とは
- 目的
・テストケースの共通部分を抽象化
・コードの重複を削減
・テストの標準化
・効率的なテストスクリプトの管理
・特定のテストスクリプト内で特定のテストケースを作成及び実行するために再利用できる関数
sample.py
# 汎用テスト関数 オプションとしてcallbackがある。
def equalAssertion(a,b, callback = None):
equality = (a == b) if callback is None else callback(a, b)
print(f"Comparing {str(a)} and {str(b)} ..."
+ ("They are equal." if equality else "Error, they are not equal."))
# 等しくなければクラッシュする。
assert equality
return True
arr1 = [1,2,3,4,5]
arr2 = [5,4,3,2,1]
arr3 = [5,4,3,2,1]
# 副作用がないreverse
def reverse1(a, b):
res = [i for i in b[::-1]]
return a == res
# 副作用があるreverse
def reverse2(a, b):
b.reverse()
return a == b
# pass
equalAssertion(arr1, arr2, reverse1)
# pass 副作用で arr3 = [1,2,3,4,5]になっている
equalAssertion(arr1, arr3, reverse2)
# fail arr2 = [5,4,3,2,1], arr3 = [1,2,3,4,5]
equalAssertion(arr2, arr3)
3.所感
-
汎用テスト関数は、家のブレーカーみたいに機能に異常があったら落ちるようなものだと思った。
・理由
ブレーカーは、一定のW以上で電気系統の機能の全ての機能をオフにすることができる。
汎用テスト関数は、特定の条件を満たさなかったらプログラムをクラッシュさせて機能の停止をする。 -
assertionをうまく活用できれば、探すのに手間がかかる論理エラーを発見とかできると思った。
ex.参考資料
- ChatGPT-3.5
- Recursion