ドメイン層テスト(Tax Calculation Core)
Tax Calculation Core は TASHIKA の中核であり、計算結果の正確性が法的要件として求められる。以下のテスト戦略により、多層的に正確性を保証する。
パイプラインテスト
年税額計算パイプラインの各ステップを純粋関数として個別にテストし、パイプライン全体の結合テストも実施する。
→ パイプラインの全体像は 年税額計算 参照
単体テスト(各ステップ)
11ステップの各純粋関数に対して、入力→出力の一致を検証する。
| ステップ | テスト対象関数 | 検証ポイント |
|---|---|---|
| ② | CalculateEmploymentIncomeDeduction | 給与所得控除額の正確性、660万円以上の算式計算 |
| ③ | CalculateIncomeAdjustmentDeduction | 適用条件判定、上限15万円、端数処理(切上げ) |
| ④ | 調整控除後の給与所得の金額 | ③の適用有無による分岐 |
| ⑤ | SumIncomeDeductions | 各控除額の合算、上限適用 |
| ⑥ | CalculateTaxableIncome | 1,000円未満切捨て、マイナス→0 |
| ⑦ | CalculateAssessedTax | 速算表の正しい区間適用 |
| ⑧⑨ | ApplyHousingLoanCredit | 税額控除の適用、下限0 |
| ⑩ | CalculateAnnualTax | ×102.1%、100円未満切捨て |
| ⑪ | CalculateOverUnderPayment | 過納額・不足額の正負判定 |
結合テスト(パイプライン全体)
パイプライン全体を通して入力データから最終的な年調年税額・過不足額が正しく算出されることを検証する。
端数処理テスト
端数処理はステップごとに切上げ・切捨てが混在しており、個別に正確な実装が必要。
→ 端数処理の一覧は 年税額計算 参照
| # | 対象 | 端数 | 処理 | ステップ |
|---|---|---|---|---|
| 1 | 給与所得控除後の給与等の金額 | 1円未満 | 切捨て | ② |
| 2 | 所得金額調整控除額 | 1円未満 | 切上げ | ③ |
| 3 | 生命保険料控除額 | 1円未満 | 切上げ | ⑤ |
| 4 | 地震保険料控除額 | 1円未満 | 切上げ | ⑤ |
| 5 | 住宅借入金等特別控除額 | 100円未満 | 切捨て | ⑧ |
| 6 | 課税給与所得金額 | 1,000円未満 | 切捨て | ⑥ |
| 7 | 年調所得税額 | — | 0に切捨て | ⑨ |
| 8 | 年調年税額 | 100円未満 | 切捨て | ⑩ |
カテゴリ判定テスト
税法上のカテゴリ判定は2層構造で設計されている。各層を分離してテストする。
→ 判定レイヤーの設計は 設計原理 税法カテゴリ判定の一元化 参照
第1層: 親族区分判定(民法由来、年度不変)
民法に基づく親族区分(配偶者・6親等内血族・3親等内姻族)の判定。税制改正の影響を受けない安定的な層。
- 入力: 続柄情報(血族/姻族、親等)
- 出力: 民法上の親族区分
- テスト方針: 全パターンの網羅テスト(パターン数が有限かつ安定)
第2層: 税法カテゴリ判定(年度パラメータ依存)
第1層の判定結果 + 事実(所得・年齢等)から、税法上のカテゴリ(控除対象配偶者、特定扶養親族等)を判定する。
- 入力: 親族区分 + 年度パラメータ + 事実(所得額、生年月日等)
- 出力: 税法カテゴリ(該当/非該当 + 控除額)
- テスト方針: カリー化された判定関数を段階的にテスト
カリー化テストの段階
// 1. 年度パラメータ注入
let judgeForR7 = createJudge(yearParams2025)
// 2. 安定的事実(親族区分)を適用
let judgeSpouseR7 = judgeForR7(RelationshipType.Spouse)
// 3. 変動する事実(所得額等)を適用して最終判定
let result = judgeSpouseR7({ income: 480_000 })
// → { category: "控除対象配偶者", deductionAmount: 380_000 }各段階の中間結果を検証し、問題の切り分けを容易にする。
ゴールデンテスト
国税庁が「年末調整のしかた」に掲載している設例(計算例)との完全一致を検証する。税計算の正確性を保証する最も重要なテスト。
→ テストケースと品質目標の詳細は ゴールデンテスト 参照
方針:
- NTA公開の計算例(年末調整のしかた p57-59)と全ステップの中間値・最終値が完全一致すること
- 年度更新時のリリースゲートとして機能(BF-301 Step 7: 新年度の計算パラメータが正しいことを保証)
- 将来的に複数の設例を追加し、カバレッジを拡大
プロパティテスト(FsCheck)
大量のランダム入力により、税計算コアの不変条件を検証する。特定のテストケースでは発見できないエッジケースの発見を目的とする。
検証する不変条件
| プロパティ | 検証内容 |
|---|---|
| 参照透過性 | 同一入力 → 同一出力(純粋関数の保証) |
| 非負性 | 控除額 ≥ 0、課税所得 ≥ 0 → 税額 ≥ 0 |
| 単調性 | 所得増加 → 税額非減少(累進課税の性質) |
| 上限制約 | 各控除額が法定上限を超えないこと |
| 復興特別所得税 | 年調年税額 = floor(年調所得税額 × 102.1%, 100円) |
境界値テスト
税率区分・年齢判定・所得閾値などの境界でのテストにより、off-by-one エラーを防止する。
税率区分境界(速算表の±1円)
| 課税給与所得金額 | 期待される税率 |
|---|---|
| 1,949,000円 | 5% |
| 1,950,000円 | 5%(以下なので含む) |
| 1,951,000円 | 10% |
| 3,299,000円 | 10% |
| 3,300,000円 | 10% |
| 3,301,000円 | 20% |
年齢境界(前日満了ルール)
年齢計算に関する法律(明治35年法律第50号)により、誕生日の前日に年齢が加算される。
- 1月1日生まれ vs 1月2日生まれ: 同じ年生まれでも年度内の年齢が異なる
- 特定扶養親族の年齢要件(19歳以上23歳未満)の境界
- 老人扶養親族の年齢要件(70歳以上)の境界
所得閾値境界
- 同一生計配偶者の合計所得金額の要件(合計所得金額48万円以下)の境界
- 扶養親族の合計所得金額の要件の境界
- 給与等の総額850万円(所得金額調整控除の適用判定)の境界
年度横断テスト
税制改正前後の年度で、同一入力データに対して正しい年度別結果が得られることを検証する。
方針:
- 同一の入力データセットに対して、年度パラメータのみを差し替えて計算
- ロジック(パイプライン関数)は不変、年度パラメータの違いのみで結果が変わることを確認
- 税制改正の影響を受ける控除(例: R7の基礎控除改正)で改正前後の差分を検証
- 年度パラメータの差替だけでロジック不変を保証するテスト