今年に入ってから二つの異なるソフトウェア(iOSアプリと組み込み系)で「正しい日付を入力してるのにエラーになるときがある」というバグに遭遇しました。おかしさっぷりが似ていて、きっとこれは「よくある不具合」なんだろうなと思いました。
軽い気持ちでお題風にツイートした
日付欄の入力チェック処理で「正しい日付を入力してるのにエラーになるときがある」というバグが潜んでいるとしたら
— miwa (@miwa719) 2021年9月7日
1. どのようなことが起きていると思いますか?
2. (ソースコードは見れないとして)どんなテストをしてみますか?
軽い気持ちでお題風にツイートしたら「ソフトウェア開発で日付を扱うときに気にしたほうがいいこと」が、たくさん集まりました。うれしかったです。
「1. どのようなことが起きていると思いますか?」では、失敗しそうなシチュエーションや疑わしいところ、確認したい事柄など、多種多様なコメントが寄せられました。これらをベースに実践的なテストケースが導き出せますね。「2. どんなテストをしてみますか?」では、具体的なTestingのテクニックや、この状況でのテストの考え方、攻め方について言及してくださった方もいました。
また「正しいとはなにか」「おかしいのは日付ではないのではないか」のような切り口から考えてくださった方もいました。どれもユニークで素晴らしい回答だと思います。たいへん勉強になりました。ありがとうございました。
Togetterのコメント欄にも知見が寄せられています。興味のある方は読んでみてくださいね。
この知見の楽しみかた
みなさんからいただいた貴重な知見を、分類してチェックリストにするとか、重複しないように整理してマッピングするとか、そういう野暮もったいないことはいたしません。そんなことをしたら大切なものを取りこぼしてしまいます。
ツイートをひとつひとつじっくり読み、この方はなぜそう思うのか、なぜこういうテストをしようと考えるのか、わざわざなんでこれを書いてきたのか(笑)とか、行間にも想いを馳せます。そこから浮かびあがる思考の背後にある、みなさんの開発(これまでに遭遇してきたであろうバグや開発に関する問題など)を感じ、想像(妄想?)するのです。そしてそれを自分の脳内に疑似体験として保存する。大切なことはね、たいてい書いてないのです。
どのような不具合だったのか
これを当ててもらうためにツイートしたわけではないのですが、どんな不具合だったんだろうって気になる方もいるかもしれないのでメモしておきます。
再現手順
- 登録画面を表示する
- 日が不正な日付を入力する(例 "19650332")
- 入力チェックでエラーになる(OK)
- 入力した日付を全て消す
- 正しい日付(例 "19650325")を入力する
- 入力チェックでエラーになる(NG)
なぜエラーになったのか
日付欄(見た目)は"19650325"と表示されていたが、入力チェック用の日付変数には" 19650325"と入っていた。先頭にスペースが2つ入っていた。日付のフォーマット(YYYYMMDD)と合わないためエラーと判断された。入力チェックの過程で使用する中間バッファにある条件下で不要なスペースが残ってしまうような実装になっていた。*1
まあ、簡単に見つかると思う
不正な日付を入力したあとに正しい日付を入れ直すような操作をすれば見つかる不具合です。実際はもうすこし複雑で年(YYYY)が不正だとこの現象は起きません。また日付のフォーマットによりおかしさの挙動が変わります。まあでも、このブログをお読みのみなさんはすぐに見つけることができると思います。
この不具合のヤバさ
日付欄に入ってる(目に見える)値で日付のチェックをしてると思ってたのに、そうじゃなかったのがかなりヤバい!!!! たまたまうまく動いてる(ように見える)やつもあるんじゃないの!!「よし!」と思っていたところも、急に疑わしくなってきますな。大切なことはね、たいてい目に見えないのです。
*1:どうでもいい話ですが、1965年3月25日は Sarah Jessica Parker さん(米国の女優、プロデューサー)の誕生日です。たまたま週末にアマプラでみた映画にSarahが出演していて、なんとなくテストデータとして使用しました。この不具合は「サラの呪い」と名づけられています。