python勉強会~その4~【テスト、デバッグ】

python勉強会 Python

こんにちは、黒猫です。

プログラムを勉強していく中で動作確認をすることは非常に重要なこととなります。
今回は、プログラム作成におけるデバッグの方法について書いていきたいと思います。

プログラムの基本は何と言っても部分を細かく細分化することです。
プログラムを細分化すれば、ある関数だけを実装、テスト、デバッグすることができます。
プログラムが大きくなっていくとそれだけデバッグするのにも膨大な時間がかかってしまいます。
特に関数と関数が複雑に絡み合ったスパゲッティコードのデバッグは非常に骨の折れる作業となります。
デバッグ作業を短時間で行えるようにするためにも最初から細分化する意識を持ってコードを書いていくようにしましょう。

テスト

テストをする目的は、バグがあることを明らかにすることで、バグがないことを明らかにすることではないことに注意しましょう。
数学でいうと、「反例を見つけるのは容易いが、証明することは難しい」と似たところがあります。

まずは、以下のプログラム仕様でのテストについて考えてみましょう。

def isBigger(x, y):
   """xとyをint型とする。
      xがyより小さければTrueを
      そうでなければFalseを返す"""

この関数に対して、テストを行うときに整数値全ての値を入力すれば全てのパターンに対しての値を出力できますが、現実的ではありません。
この関数に対して、ある入力値を入れるだけで十分なテスト効果を得られる値があります。
そのような入力はテストスイートと呼ばれます。

この関数に対しては、

  • x > 0, y > 0
  • x < 0, y < 0
  • x > 0, y < 0
  • x < 0, y > 0
  • x = 0, y = 0
  • x = 0, y != 0
  • x != 0, y = 0

の7パターンが挙げられます。
この範囲の値を1つずつ入力することでバグの発見できる可能性は高くなると言えます。
このようにある仕様から各経路を調べる手法をブラックボックステストと言います。
コードの中身を見るのではなく、仕様から考えられるパターンを全て見つけ出すということから名付けられたと思っていただけたらよいです。

これとは逆にコードを見てそこからテスト内容を考える方法をグラスボックステストと言います。
if文があった場合、条件が真になる場合と偽になる場合を両方検査する必要があります。
それだけではなく、if文の境界値の値もテスト内容にした方が良い場合が多々あります。

デバッグ

バグの種類

バグは2つの軸で分類することができる。

  • 顕在的バグ ——————> 潜在的バグ
  • 継続的バグ ——————> 断続的バグ

この軸で分類するとバグには4つの種類があることがわかる。

  1. 顕在的継続的なバグ
  2. 顕在的断続的なバグ
  3. 潜在的継続的なバグ
  4. 潜在的断続的なバグ

この中で性質の良いバグは「顕在的で継続的なバグ」であり、性質の悪いバグは「潜在的で断続的なバグ」である。
性質の良いバグはテスト実行を行うとすぐに現れてくれるので直す箇所がわかりやすい。
対照的に性質の悪いバグは長期間使用して初めて浮かび上がってくるようなバグや特定の条件でのみバグが発生するようなものである。

プログラムを書く上で良質なバグが出るようなコードを書くことが理想的(出ないのが本当の理想だが不可能である)だが入ってしまうのは仕方がないことである。

この問題に対処する方法として、デバッグツールを使用することである。
最も使用しやすくてなじみのあるツールとしてprint関数がある。このツールを実装関数の前後に入れ込み、実行時にペアの出力値が出るように仕掛けておけば、バグも見つけやすくなる。

バグが見つかったときに考えること

ここで、バグが見つかったときに思い出すべき名言を書いておきましょう。

  1. 通常疑われるところを探せ
  2. プログラムが思い通り動かないことを嘆くのではなく、なぜそのように動いているか考えよ
  3. バグは想定したところには存在しないと心得よ
  4. 他の誰かに問題を説明してみよ
  5. 一旦手を引き、明日再び試みよ

1,3は逆のことを指しているので、疑わしいところにバグがなかったら、別の場所を探せくらいの心持ちで大丈夫です。

個人的には2,4,5は非常に助けになる名言だと思います。
2はプログラミングに必要な考える力がつきますし、4は説明するときに問題の根本を理解していないと説明できないので問題を深く理解することができます。
5は一番重要だと思ってて、次の日に試してみたらあっさり解決するなんてことがよくあります。

何事も焦らずにのんびりやっていきましょう。

追記

この内容は「Python言語によるプログラミングイントロダクション 第2版 データサイエンスとアプリケーション」に沿って行なっております。

興味がある方は是非購入してみてください。

 

コメント

%d人のブロガーが「いいね」をつけました。
タイトルとURLをコピーしました