1.はじめに
- ソフトウェアテストをする前にそもそもエラーとはなんぞやと決めるため
- エラーの用語説明と対策の戦略について書く
2.用語の定義
用語 | 定義 |
---|---|
エラー | ソフトウェアプロジェクトのコード中のミス。開発者が気付いている場合と気付いていない場合がある。 |
バグ | 開発者が気づいたエラー。 |
- エラーへの対策法並びに戦略
・ソフトウェアのテスト
・例外処理
・ソフトウェアのデバッグ
・防御的プログラミング(defensive programming)
・成功事例の活用
3.学ぶもの
エラーについて
種類 | 説明 |
---|---|
論理エラー | 構文的に正しいが、意図した通りの結果にならないエラー。探すのが面倒 |
構文エラー | コードがプログラミングの言語規則に従わない場合に発生するエラー。コンパイル・解釈前。 |
実行時エラー | プログラムの実行中に発生しプログラムを即座にクラッシュさせるエラー。コンパイル・解釈後。 |
- 論理エラー
・インタプリタやコンパイルで正しく出力されるが意図した通りの出力にならないこと。
・コードの入力で文法的には正しいけど関数の定義を誤っていること
・構文エラーのようにどこが間違っているか教えてくれないから厄介
logic_error.py
# 誤った税金の計算式
# 本来は(1 + taxRate) * subTotal
def calculateTotalCost(subTotal, taxRate):
totalCost = (1 * taxRate) * subTotal
return totalCost
print(calculateTotalCost(100, 0.1)
print('今年は、' + (20 + 23) + '年')
print('今年は、' + 20 + 23 + '年')
python3 logic_error.py
10
# 110 の出力を期待していたが異なる結果になってしまった。
'今年は、43年'
'今年は、2023年'
# コードの入力の違いで結果が欲しいものにならないこともある。
- 構文エラー(syntax error)
・プログラミング言語の構文とは
自然言語のように大文字や小文字、句読点などの規則があるように読み手がコードの意味を理解できるようにルールが決められている。
・各プログラミング言語の違う理由(後で詳しく調べる)
空白、特殊記号、構造などの独自の規格があり、これによってコードがコンピュータのハードウェアに理解、解釈されてプログラムが実行されるようになる。
・静的型付け言語や動的型付け言語(後で詳しく書く)
種類 | 説明 |
---|---|
静的言語 | 先にコードの型を決めているので間違った入力をしたら構文エラーを出してくれる。 |
動的言語 | 静的言語のような構文エラーが出ないので入力側が型を意識しないといけない。 |
共通 | 文章の規則に沿っていないコードを入力したら出る。IDEで自動的に警告してくれるから気づきやすい。 |
- 実行時エラー(runtime error)
・コード内でエラーが発生した場合は、プログラミング言語がセキュリティ対策として強制停止させてクラッシュさせる。
・原因は、プログラムのロジックに問題があったり、データの使い方が間違っていたりすることが多い。
その特定と解決が難しい場合がある。
・動的型付け言語ではよく発生するエラー。厳密な型チェックを行う静的言語では構文エラーで防いでくれるのでその分が発生しない。
動的言語では、データ型が混在したものを操作することが可能なので演算子で変更したりした時は、エラーが発生する。
・範囲外の値を入力をしたり、ある値に対応していないオブジェクトにその値を入力したりなど
runtime_error.py
def accessFault(arr):
# error 本来ならlen(arr)のはず
return arr[len(arr)]
accessFault([1,2,3,4,5])
python3 runtime_error.py
'''
accessFault([3,4,5,3,10,23])
Traceback (most recent call last):
File "script.py", line 5, in <module>
accessFault([3,4,5,3,10,23])
File "script.py", line 3, in accessFault
return l[len(l)]
IndexError: list index out of range
'''