プログラムのテストも仮説を作る
プログラムのテストも仮説を作る
2021年12月29日
前回は、一般的な実践の際に仮説を立てるという話を紹介しましたが、もう少し具体的な例としてプログラムのテストのやり方に応用した例を紹介します
テストの場合は「期待値」を考える
プログラミングに応用する場合は、仮説というより実際は「期待値」を設定するという方が近くなります。
期待値というのは、「こうすれば、こうなる(はず)」という事を考えるという事になります。以前に紹介した事に、プログラミングは基本は「入力」と「出力」で枠組みを作るというのがありました。これが、期待値そのものです。この入力となるデータを渡して、処理した結果(出力)が得られるというのがきちんと決まれば、テストができます。
これはプログラム(関数)の中身を見ないで、入口(入力)と、出口(出力)でテストを行うので、ブラックボックステストと呼ばれるテストのやり方になります。
プログラミングに応用する場合は、仮説というより実際は「期待値」を設定するという方が近くなります。
期待値というのは、「こうすれば、こうなる(はず)」という事を考えるという事になります。以前に紹介した事に、プログラミングは基本は「入力」と「出力」で枠組みを作るというのがありました。これが、期待値そのものです。この入力となるデータを渡して、処理した結果(出力)が得られるというのがきちんと決まれば、テストができます。
これはプログラム(関数)の中身を見ないで、入口(入力)と、出口(出力)でテストを行うので、ブラックボックステストと呼ばれるテストのやり方になります。
考えるのはどんなデータを入れるか?
この方法でテストを行う時のポイントは、どんなデータを入れるかです。つまり、どのようなデータを渡してプログラムに処理をさせるかが重要です。
全ての組み合わせのデータでテストするのが理想ですが、殆どの場合全ての組み合わせをテストするのは不可能に近いので、うまくデータを選んで効率良くテストをする事が求められます。
その際に必要なのは、可能性のあるデータを幾つかのグループに分けて、そのグループの中から代表的なデータを使ってテストするようにすると、テストの数を少なくする事ができます。例えば、「整数」を渡す場合には、いくつかの分類が考えられます。
- 負の数、正の数、0
- 数の大きさによる分類
が代表的です。マイナスの数と正の数で処理の仕方が変わる場合は結構ありますし、0の場合も特殊なケースになります。基本的に「0で割る」という計算は避けるようにプログラムを書くのが基本だからです。
また、数の大きさによって処理を分けている場合もあるので、そうした条件の境目(境界)になる数値でテストすることも必要になります。
ここで、大切なのが、プログラムを作った人と、それ以外の人ではこのグループの作り方が違ってくる場合が多いので、プログラムを作った人と、それ以外の人が別々にテストをするとテストの漏れが少なくなります。
これは、プログラムを作った人は、プログラムの中身を知っているので、それに応じたデータを選べます。一方で、プログラムを作っていない人は、プログラムの仕様書などからデータを考えて入力にするので、違うデータを選ぶケースが多くなるためです。
この方法でテストを行う時のポイントは、どんなデータを入れるかです。つまり、どのようなデータを渡してプログラムに処理をさせるかが重要です。
全ての組み合わせのデータでテストするのが理想ですが、殆どの場合全ての組み合わせをテストするのは不可能に近いので、うまくデータを選んで効率良くテストをする事が求められます。
その際に必要なのは、可能性のあるデータを幾つかのグループに分けて、そのグループの中から代表的なデータを使ってテストするようにすると、テストの数を少なくする事ができます。例えば、「整数」を渡す場合には、いくつかの分類が考えられます。
- 負の数、正の数、0
- 数の大きさによる分類
が代表的です。マイナスの数と正の数で処理の仕方が変わる場合は結構ありますし、0の場合も特殊なケースになります。基本的に「0で割る」という計算は避けるようにプログラムを書くのが基本だからです。
また、数の大きさによって処理を分けている場合もあるので、そうした条件の境目(境界)になる数値でテストすることも必要になります。
ここで、大切なのが、プログラムを作った人と、それ以外の人ではこのグループの作り方が違ってくる場合が多いので、プログラムを作った人と、それ以外の人が別々にテストをするとテストの漏れが少なくなります。
これは、プログラムを作った人は、プログラムの中身を知っているので、それに応じたデータを選べます。一方で、プログラムを作っていない人は、プログラムの仕様書などからデータを考えて入力にするので、違うデータを選ぶケースが多くなるためです。
意地悪なデータも重要
想定していないデータを渡した場合のテストも、とても重要なテスト項目です。 例えば、本来は「数字(数値)」を入力にするわけですが、仮に「文字列」を渡したらどうなるかなどのチェックがも大切です。このように、本来は起こり得ないようなデータでも、何かの間違いで渡される場合があります。その際に、正しくそのデータは処理できないなどのエラーメッセージを利用者に伝えるようにすると、誤動作やプログラムが固まってしまうケースを減らすことができます。
プログラムが普通に動くケースはきちんとテストされる場合が多いですが、このように本来は入力に使われるべきではないデータが渡ることはあるものです。特に、人間がデータを入力する場合は、どうしても間違いが発生するものです。そうした、間違いをきちんと検出してエラーメッセージを出すプログラムが良いプログラムです。従って、試験では、そうした事態が起きた場合はどうプログラムが動くかをチェックする必要があります。
これも、仮説の一つになります。本来は、起こらないはずだけれども、万が一起きた場合には、プログラムはどうなるかという仮定が頭にないと、こうした処理がプログラムの実装から抜けてしまうので、そうした場合のプログラムの挙動もきちんと定まらないことになってしまいます。
想定していないデータを渡した場合のテストも、とても重要なテスト項目です。 例えば、本来は「数字(数値)」を入力にするわけですが、仮に「文字列」を渡したらどうなるかなどのチェックがも大切です。このように、本来は起こり得ないようなデータでも、何かの間違いで渡される場合があります。その際に、正しくそのデータは処理できないなどのエラーメッセージを利用者に伝えるようにすると、誤動作やプログラムが固まってしまうケースを減らすことができます。
プログラムが普通に動くケースはきちんとテストされる場合が多いですが、このように本来は入力に使われるべきではないデータが渡ることはあるものです。特に、人間がデータを入力する場合は、どうしても間違いが発生するものです。そうした、間違いをきちんと検出してエラーメッセージを出すプログラムが良いプログラムです。従って、試験では、そうした事態が起きた場合はどうプログラムが動くかをチェックする必要があります。
これも、仮説の一つになります。本来は、起こらないはずだけれども、万が一起きた場合には、プログラムはどうなるかという仮定が頭にないと、こうした処理がプログラムの実装から抜けてしまうので、そうした場合のプログラムの挙動もきちんと定まらないことになってしまいます。
仮定をすることで想定外が減る
このように、プログラムでも仮説(仮定)を意識してプログラムをコーディングしたり、テストでも仮説を立てて検証することで、「想定外のケース」を格段に減らす事が可能になります。
「もしあったら」という事ですが、本当は起きないはずでも、実際に起きてしまうケースがあって、こうした想定外の入力などが大きな問題を引き起こす事が意外に多くあります。「起きないはず」と思っていても、人間がミスしたり、プログラムや関数間のインターフェースの誤解などがある場合、本来は起きないはずのことも起きるものです。
特に、複数の人が分業して開発するプログラムではコミュニケーションが上手く行かない場合もあるので、「もし」「仮に」などという仮定をして、設計したり検証することが重要です。
このように、プログラムでも仮説(仮定)を意識してプログラムをコーディングしたり、テストでも仮説を立てて検証することで、「想定外のケース」を格段に減らす事が可能になります。
「もしあったら」という事ですが、本当は起きないはずでも、実際に起きてしまうケースがあって、こうした想定外の入力などが大きな問題を引き起こす事が意外に多くあります。「起きないはず」と思っていても、人間がミスしたり、プログラムや関数間のインターフェースの誤解などがある場合、本来は起きないはずのことも起きるものです。
特に、複数の人が分業して開発するプログラムではコミュニケーションが上手く行かない場合もあるので、「もし」「仮に」などという仮定をして、設計したり検証することが重要です。
まとめ
プログラムの世界では、「起きないはず」のことが起きることが結構あります。原因は、利用者(人間)のミスや勘違いだったり、プログラムの中で関数のインターフェースを間違って使ってしまったりなど、本来は起きない事が起きます。
従って、プログラムを書く場合には、想定外の事が起きた場合は、その処理をきちんと行って、何が起きたのかをわかるようにしておくとデバッグや障害時に素早く対応策が取れるようになります。 こうした実装のためには、いろいろな仮説を作ってプログラムを作ると同時に、検証時も、予期しないようなデータの入力も含めてプログラムの動作をチェックするとプログラムの品質が大きく向上します。
プログラムの世界では、「起きないはず」のことが起きることが結構あります。原因は、利用者(人間)のミスや勘違いだったり、プログラムの中で関数のインターフェースを間違って使ってしまったりなど、本来は起きない事が起きます。
従って、プログラムを書く場合には、想定外の事が起きた場合は、その処理をきちんと行って、何が起きたのかをわかるようにしておくとデバッグや障害時に素早く対応策が取れるようになります。 こうした実装のためには、いろいろな仮説を作ってプログラムを作ると同時に、検証時も、予期しないようなデータの入力も含めてプログラムの動作をチェックするとプログラムの品質が大きく向上します。
コメント
コメントを投稿