想定されない状態への対処方法を考える

条件分岐を行うswitch処理にcase文を並べていき、最後にdefault文を書くといつも迷う。

この状態になるのは一体どんな時なのだろう?

その昔、あるソフトを作っていて、そんなケースに直面したことが有る。各case文に対応したお知らせメッセージを表示すると言うのが仕様で、そのいずれにも定義されていない値が来たら未定義エラーと表示することになっていた。作りとして理屈は通っているのだけど、果たして本当に未定義エラーは表示されるのだろうか?そんな値が飛んできたら、それは何かの処理に問題が有る証拠ではないのだろうか?それなら、それはそれで別の問題があるのではないだろうか?

そんな事を考えたので周囲の開発者に聞いてみたものの、エラーコードは仕様書に記載されているだけで、他の値が使われることは起こり得ないという。本当なのだろうか?疑心暗鬼の気持ちをどうしても拭い去ることが出来なかったので、assert文を入れておき、呼び出された時の値と予期せぬ状態が発生した旨を強調表示して、開発者に連絡するように小細工しておいた。これなら、default状態に陥れば直ぐに分かるはずだ。

連接テストが始まってしばらくするとテスト担当者から連絡があり、上記のメッセージが表示されたとのこと。実際に状況を確認してみると、仕様書には載っていない値が確かに表示されていた。ログを手がかりに原因を調べたところ、仕様書の記載に漏れがありdefault文が呼び出されていたと判明。仕様書を改定することで無事に決着はついた。なるほど、こんなケースでdefault状態になるのか、仕様書には書かれていないし開発者も知らなかった状態が、実際には起こり得ると知った瞬間でもあった。

その後もassert文は残したままにしておいたけれど、品質評価の期間中、2度と表示されることは無かった。だから、未定義エラーなる状態にはならなかったのだろう。しかし、テストケースから漏れている方法を取ったら、あるいは特定のタイミングでは、実は起こり得る状態なのかも知れない。この時は単なるGUI処理だったのでassert文で強制的に打ち切っていたけれど、システムによっては後に続く処理のことも考えてもう少し適切な方法が有るだろう。想定されない状態は本当に起こらないと言えるのか、形式手法でも使わない限り確実な検証は難しいと思うけど、下手に不安定な状態で動き続けるのが好ましくないのなら、何らかの形で終了処理へ持っていくのが現実的だろう。何も言わずに異常状態を握りつぶしてしまうのが、最もまずい対処方法ではないかと思っている。

「たしかにあの件はバグだが、日本信号のある人に聞いたら想定されないユースケースだったと言っていた。そういう場合はどうやってテストで未然に防ぐのですか」
この業界に長くいると、だいたいの質問に対して水が流れるように答えることができる。ただこの質問はちょっと困った。想定されないユースケースは無限にある、それをすべて要求仕様として定義するのは非常に困難である。また全ての異常系のテストをするのもまた困難である。

想定されないバグ:知識ゼロから学ぶ ソフトウェアテスト:So-netブログ



関連