和暦の境界値にバグがいたもん!ホントだもん!!見たもん!!!
まいどどうも。元号改正、してますか?
この記事はソフトウェアテストの小ネタAdvent Calendar2020の19日目です。
小生、普段は細々とした中小企業でシステム保守の仕事をしており、今面倒を見ている給与計算システムは、およそ15年稼動しているシステムとなります。
※ 身バレをある程度防ぐため、実業務内容についてはフェイクを交えています。ご了承ください。
1. 前提
給与計算システムは、年末調整の計算までおこなうシステムです。
そう、源泉徴収票の出力があり、和暦不可避である。
「じゃあ、入力は西暦にして、出力は和暦にすればよくね???」
そう思うやん?ところがどっこい、対象者の生年月日の入力も和暦なのである。だってそうじゃないと合ってるかわかんないじゃん。
余談ですが、源泉控除対象配偶者と、同一生計配偶者と、特別控除対象配偶者はそれぞれ細かく色々違って源泉徴収票上の表記方法が異なります。考えたやつ(ピーーーーーー)って思いました。
さあ、和暦入力の話に戻ろう。
元号改正で元号に令和が追加されました。
今までは昭和・平成しか入力されないことしか考慮していなかったシステムの改修です。
キミの目の前にはそんな生年月日入力のフォームがある。どうテストする?
2. 仕様
生年月日の入力項目は2つ。「元号区分」「和暦」。DBには西暦が登録されている。
元号区分には、{S:昭和}、{H:平成}、{R:令和}の3種類が入力可能。空白では「元号区分が入力されていません」といったエラーが発生する。
和暦は、「YY/MM/DD」形式での入力。範囲外であればクライアント側で「正しい日付を入力してください」とエラーが出て空白文字に設定される。範囲内の数字であればエラーが出ず、登録ボタンを押下することでサーバ側で和暦を西暦に変換し、DBへの書き込みがおこなわれる。
※ 閏年は西暦変換後に判定しているため今回のテストには含まない。
3. 答え
答えを書いてみよう。考えうる入力としては、
{S01/01/01}、{S50/01/01}、{S99/12/31}、{H01/01/01}、{H10/01/01}、{H99/12/31}、{R01/01/01}、{R02/01/01}、{R99/12/31}
以上!9パターン!!終わり!!!ヨシ!!!!!
4. 実行してみた
入力:S01/01/01、S99/12/31、H01/01/01、H99/12/31、R01/01/01
画面「だめー」
サーバ「(スヤァ」
入力:S50/01/01、H10/01/01、R02/01/01、R99/12/31
画面「よし!」
サーバ「変換OK!登録完了!」
うん、何の問題もないぞ!流石だな私!
5. いや待ってホント無理だから
和暦の範囲外ってなんだよ。
H31/05/01は平成の範囲外なのではないか?
そう思ったら入力してみよう。
入力:H31/05/01
画面「よし!」
サーバ「変換でくぁせdgfdxてsgふじこ(チーン)(死亡)(終了)(DEAD BODY REPORTED)」
・・・
・・・・・・
・・・・・・・・・
マジか。
6. 意外ッ!境界値はお前だ!
どうやら平成の最小値はH01/01/08で最大値はH31/04/30らしい。
じゃあ令和の最小値はR01/05/01で最大値はR99/12/31なのか?
否ッ!!!!
入力最大値はR64/01/07でした。平成生まれなのでこの意味は分かりません。
嘘です。ちゃんと分析をしましょう。お辞儀をするのだポッター。
7. 何が起きていたのか
それぞれの和暦の最小値と最大値を書き出してみよう。
昭和:01/12/25 ~ 64/01/07
平成:01/01/08 ~ 31/04/30
令和:01/05/01 ~ 99/12/31(仮)
ちょっと数直線にして書いてみよう。(下図)
ん?んんんんん!??!!??
鎮まれ!鎮まりたまえ!!
さぞかし枯れたシステムと見受けたが何故そのように荒ぶるのか!??!?
そんなわけで、クライアントが和暦の入力範囲で正常と判断しているのは、01/01/08~64/01/07であることが分かりました。
8. もう一回!
境界値だけ書きます。
{S01/01/07}、{S01/01/08}、{S64/01/07}、{S64/01/08}、
{H01/01/07}、{H01/01/08}、{H31/04/30}、{H31/05/01}、
{R01/04/30}、{R01/05/01}、(R64/01/07)、{R64/01/08}
実行します。
入力:S01/01/07、S64/01/08、R64/01/08、H01/01/0
画面「だめー」
サーバ「(スヤァ」
入力:S64/01/07、H01/01/07、H31/04/30、R01/05/01、R64/01/07
画面「よし!」
サーバ「変換OK!登録完了!」
入力:S01/01/08、H31/05/01、R01/04/30
画面「よし!」
サーバ「おぎゃああああああああっ!!!!???!!?!!?(無事死亡)」
つかれた
9. だけど僕らはくじけない
本番リリース後発覚したのですが、
ユーザがH31をR31と誤入力することによって2048年生まれの子供が発生。セワシくんかよ!!!!
テストはどれだけしても足りないんだよ。
知ってるだろうそれはお前も。
10. 最後に
最後まで読んでいただきありがとうございます。
この記事が、ほんの少しでもテストに関わる方々に貢献できると嬉しく思います。
本当に言いたかったのは
うちの娘が4歳になったんだよ今日!!!!
そんなわけで、全世界3000億人のファンの方お待たせいたしました。
次回の担当は かおりっと(@caori_t) さんです。ジャケンポン。
おしまい
2020.12.19
※ セワシくんは2048年生まれではない
この記事が気に入ったらサポートをしてみませんか?