0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Razor Pages 開発文書 ⑧】単体テスト仕様書

0
Last updated at Posted at 2026-07-29

Ubuntu 26.04 + .NET 10 で ASP.NET Core Razor Pages の CRUD アプリを構築し、
その成果物に対して作成した開発工程文書です。
実装済みのコードと実測値に基づいて記述しており、推測による記載は含みません。

Razor Pages 開発文書 の ⑧/全11回です。

シリーズ全記事(全11回)
  1. 【Razor Pages 開発文書 ①】要件定義書
  2. 【Razor Pages 開発文書 ②】基本設計書 (1/2) — システム構成・アーキテクチャ・画面設計
  3. 【Razor Pages 開発文書 ③】基本設計書 (2/2) — データ設計・外部IF・運用設計
  4. 【Razor Pages 開発文書 ④】詳細設計書 (1/4) — クラス構成・エンティティ・データアクセス層
  5. 【Razor Pages 開発文書 ⑤】詳細設計書 (2/4) — 画面制御層・起動処理
  6. 【Razor Pages 開発文書 ⑥】詳細設計書 (3/4) — 発行SQL・処理シーケンス
  7. 【Razor Pages 開発文書 ⑦】詳細設計書 (4/4) — ビュー・設定・実装上の留意点
  8. 【Razor Pages 開発文書 ⑧】単体テスト仕様書 (この記事)
  9. 【Razor Pages 開発文書 ⑨】結合テスト仕様書
  10. 【Razor Pages 開発文書 ⑩】総合テスト仕様書
  11. 【Razor Pages 開発文書 ⑪】受入テスト(UAT)仕様書

単体テスト仕様書

項目 内容
システム名 BookListRazor(書籍管理システム)
文書番号 TST-UT-001
版数 1.0
作成日 2026-07-24
検証対象文書 詳細設計書(DES-002)

1. 文書の目的

本書は 詳細設計書 に定義したクラス・メソッドの内部仕様が
正しく実装されていることを検証するためのテストケースを定義する。

V 字モデルにおいて、単体テストは詳細設計と対をなす。したがって本書の全ケースは
詳細設計書の記載内容を根拠とする。


2. テスト方針

2.1 テスト対象

対象 クラス 検証観点
エンティティ Book プロパティの既定値、検証規則の適用
データアクセス BookContext テーブルマッピング、CRUD の基本動作
画面制御 各 PageModel 分岐網羅、戻り値の型、データベース状態の変化

2.2 テスト方式

xUnit によるコードベースのテストとし、データベースは SQLite のインメモリ接続を
使用する。インメモリ接続は本番と同一のプロバイダを用いるため、SQL の生成挙動と
制約違反の再現性が保たれる。

// テスト基盤の構成例
private static BookContext CreateContext()
{
    var connection = new SqliteConnection("DataSource=:memory:");
    connection.Open();                       // 接続維持中のみDBが存在する
    var options = new DbContextOptionsBuilder<BookContext>()
        .UseSqlite(connection)
        .Options;
    var context = new BookContext(options);
    context.Database.EnsureCreated();
    return context;
}

Microsoft.EntityFrameworkCore.InMemory プロバイダは関係データベースの制約を
再現しないため使用しない。

2.3 網羅基準

基準 目標
命令網羅(C0) 100%
分岐網羅(C1) 100%

PageModel の各メソッドは分岐が単純であり、C1 100% は達成可能である。

2.4 実施状況の表記

本システムにはテストコードが存在しないため、本書の全ケースは 未実施 である。
ただし一部のケースは HTTP 経由の動作確認により等価な検証が済んでいる。
該当ケースには「参考」欄に実測結果を記載する。

表記 意味
未実施 テストコード未作成
参考:確認済 HTTP 経由で同等の挙動を実測済み。単体テストとしては未実施

3. テスト環境

項目 内容
OS Ubuntu 26.04 LTS(WSL2)
実行基盤 .NET SDK 10.0.302
テストフレームワーク xUnit(未導入)
データベース SQLite インメモリ
必要パッケージ xunit、Microsoft.NET.Test.Sdk、Microsoft.EntityFrameworkCore.Sqlite

4. テストケース

4.1 Book エンティティ(UT-01)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-01-01 文字列の既定値 new Book() Isbn・Title・Publisher が空文字列(null でない) 詳細設計 3.1 未実施
UT-01-02 数値の既定値 new Book() Id = 0、Price = 0 詳細設計 3.2 未実施
UT-01-03 真偽値の既定値 new Book() Sample = false 詳細設計 3.2 未実施
UT-01-04 日時の既定値 new Book() Published = DateTime.MinValue 詳細設計 3.2 未実施

4.2 BookContext(UT-02)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-02-01 テーブル名の解決 EnsureCreated() 実行 Books テーブルが作成される 詳細設計 4.2 未実施
UT-02-02 主キーの自動採番 Book を 2 件追加 異なる Id が採番される 詳細設計 3.4 未実施
UT-02-03 日本語の往復 Title に「技術評論社」を保存し再取得 保存値と一致する 要件 NFR-16 参考:確認済
UT-02-04 全列の永続化 7 プロパティを設定し再取得 全項目が一致する 詳細設計 5.2 参考:確認済

4.3 IndexModel(UT-03)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-03-01 全件取得 3 件登録済み Book の要素数が 3 詳細設計 5.1 未実施
UT-03-02 0 件時の挙動 データなし 空リストを返し、例外を送出しない 詳細設計 5.1 参考:確認済
UT-03-03 取得内容の一致 既知の 1 件 全プロパティが登録値と一致 詳細設計 5.1 未実施

4.4 CreateModel(UT-04)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-04-01 入力画面の表示 — OnGet() が PageResult を返す 詳細設計 5.2 未実施
UT-04-02 正常登録 妥当な Book RedirectToPageResult(遷移先 ./Index)、DB 件数が 1 増加 詳細設計 5.2 参考:確認済
UT-04-03 検証エラー時の非登録 ModelState にエラーを追加 PageResult を返し、DB 件数が変化しない 詳細設計 5.2 参考:確認済
UT-04-04 ID の自動採番 Id = 0 の Book 登録後に Id へ採番値が設定される 詳細設計 7.3 未実施

4.5 DetailsModel(UT-05)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-05-01 ID 未指定 id = null NotFoundResult 詳細設計 5.3 参考:確認済
UT-05-02 該当なし 存在しない id NotFoundResult 詳細設計 5.3 参考:確認済
UT-05-03 正常取得 存在する id PageResult、Book に該当データが設定される 詳細設計 5.3 参考:確認済

4.6 EditModel(UT-06)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-06-01 ID 未指定(表示) id = null NotFoundResult 詳細設計 5.4 参考:確認済
UT-06-02 該当なし(表示) 存在しない id NotFoundResult 詳細設計 5.4 参考:確認済
UT-06-03 現在値の設定 存在する id Book に現在値が設定される 詳細設計 5.4 未実施
UT-06-04 正常更新 変更後の Book RedirectToPageResult、DB の値が更新される 詳細設計 5.4 参考:確認済
UT-06-05 検証エラー時の非更新 ModelState にエラーを追加 PageResult、DB の値が変化しない 詳細設計 5.4 未実施
UT-06-06 更新対象の消失 存在しない Id で更新 NotFoundResult(競合例外を捕捉) 詳細設計 5.4・7.6 参考:確認済
UT-06-07 全列の更新 1 項目のみ変更 全列が SET 句に含まれる 詳細設計 7.4 未実施
UT-06-08 BookExists(存在) 存在する id true 詳細設計 5.4 未実施
UT-06-09 BookExists(不存在) 存在しない id false 詳細設計 5.4 未実施

4.7 DeleteModel(UT-07)

ID 検証項目 前提・入力 期待結果 根拠 状況
UT-07-01 ID 未指定(表示) id = null NotFoundResult 詳細設計 5.5 参考:確認済
UT-07-02 該当なし(表示) 存在しない id NotFoundResult 詳細設計 5.5 参考:確認済
UT-07-03 正常削除 存在する id RedirectToPageResult、DB 件数が 1 減少 詳細設計 5.5 参考:確認済
UT-07-04 ID 未指定(実行) id = null NotFoundResult 詳細設計 5.5 未実施
UT-07-05 削除済みへの再削除 既に削除された id RedirectToPageResult(例外を送出しない) 詳細設計 5.5 未実施

UT-07-05 は、削除実行が冪等であることを確認する。詳細設計 5.5 のとおり、
対象が取得できない場合もエラーとせず一覧へ遷移する。

4.8 入力値の境界(UT-08)

価格・文字列長・日付について、実測により確認した挙動を定義する。
本システムは業務的な範囲検証を行わない(要件定義 7. スコープ外)ため、
型として表現可能な値はすべて受理される。

ID 検証項目 入力 期待結果 状況
UT-08-01 価格の下限 Price = 0 登録される 参考:確認済
UT-08-02 価格の負数 Price = -1 登録される(範囲検証なし) 参考:確認済
UT-08-03 価格の上限 Price = 2147483647 登録される 参考:確認済
UT-08-04 価格の型超過 Price = 2147483648 拒否。The value '2147483648' is not valid for Price. 参考:確認済
UT-08-05 価格の型不正 Price = "abc" 拒否。The value 'abc' is not valid for Price. 参考:確認済
UT-08-06 書名の長大値 1000 文字 登録される(長さ制限なし) 参考:確認済
UT-08-07 存在しない日付 Published = 2026-02-30 拒否。The value '2026-02-30' is not valid for Published. 参考:確認済
UT-08-08 必須項目の空値 Isbn・Title・Publisher が空 拒否。各項目に The XXX field is required. 参考:確認済

UT-08-02 と UT-08-06 は、業務的には望ましくないが現仕様どおりの正しい挙動である。
価格の下限や書名の長さを制限する場合は、エンティティへの検証属性付与が必要となる
(詳細設計 12 章)。


5. 合否判定基準

項目 基準
ケース単位 期待結果と実行結果が完全に一致すること
全体 全ケースが合格し、分岐網羅率 100% を達成すること
不具合 検出した不具合がすべて修正され、再テストに合格していること

6. トレーサビリティ

詳細設計の節 対応するテストケース
3. エンティティ詳細 UT-01、UT-08
4. データアクセス層詳細 UT-02
5.1 IndexModel UT-03
5.2 CreateModel UT-04
5.3 DetailsModel UT-05
5.4 EditModel UT-06
5.5 DeleteModel UT-07
7. 発行 SQL 一覧 UT-04-04、UT-06-07

7. 実施記録

実施日 実施者 対象範囲 合格 不合格 備考
— — — — — テストコード未作成のため未実施

8. 改訂履歴

版数 日付 内容
1.0 2026-07-24 初版作成

← 前:【Razor Pages 開発文書 ⑦】詳細設計書 (4/4) — ビュー・設定・実装上の留意点 | 次:【Razor Pages 開発文書 ⑨】結合テスト仕様書 →

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?