2011年3月31日木曜日

【どうでもいい話】初期化漏れであわや一大事

以前書いたように、現在Solaris上で動くバッチプログラムをC言語(Pro*C)で書いてまして、今、結合テスト的なことをしてます。

詳しいことはさすがに書けませんが、機能的には、とある銀行のインターネットバンキングのDB(Oracle)を、ホストから送られてくる移管データの内容に従って更新する、っていう【いわゆる移管処理】ってヤツです。

今回はあんまり面倒な移管方式が無いものの、さすがに「口座番号」というキー項目を更新するため、万が一のことすらあってはいけません。

ところが今日、結合テストでプログラムを走らせてみたら、ログに何やら謎のエラーログが。

移管処理中は移管対象利用者が操作できないように対象データにロックをかけるわけですが、移管処理が終わってもそのロック解除に失敗している。
うーん、これはマズイな・・・なんて原因を調べていたら、ロック解除とかそんな生易しいもんじゃない、もっとマズイことが判明しました。

複数口座を持つ利用者もたくさんいるわけですが、その人の口座が部分的にあっちにいったり、こっちにいったりしてる。
つまり、利用者から見ると、「あれ!?なんか俺、口座増えてる!しかも金も結構入ってるし!」という夢のような機能が提供されているわけです。
(もちろん一方で「あれ!俺の口座が無くなった!」という極悪機能が提供されています)

原因を探ると、Oracleからカーソルでデータを取得してFETCHループしているところで、たった一つの変数を初期化するのを忘れていた、その「たった1行」が原因でした。

この「初期化」というたった1行がないだけで、「急に口座が現れたり、消えたり!」という、とんでもないダイナミック機能を提供してしまうところでした。
あらためてテストの大切さを痛感。っていうか、テストで発覚して良かった。
テスト仕様書は相当時間をかけて作ったけど、今回のパターンはケースとして入れてなくて、やっぱり考え抜いたつもりでも、いろんなパターンというのは出てくるもんだ、と実感。この辺、SEセンスが問われるところですよね。
(たまにすごく優秀なテスターに巡りあうけど、そういう人ってすごく尊敬)

今後のために、自戒の意味を込めて日記としてしたためておくとします。
皆さんもお気を付けください。。。

0 件のコメント: