Ubuntu 26.04 + .NET 10 で ASP.NET Core Razor Pages の CRUD アプリを構築し、
その成果物に対して作成した開発工程文書です。
実装済みのコードと実測値に基づいて記述しており、推測による記載は含みません。
Razor Pages 開発文書 の ⑧/全11回です。
シリーズ全記事(全11回)
- 【Razor Pages 開発文書 ①】要件定義書
- 【Razor Pages 開発文書 ②】基本設計書 (1/2) — システム構成・アーキテクチャ・画面設計
- 【Razor Pages 開発文書 ③】基本設計書 (2/2) — データ設計・外部IF・運用設計
- 【Razor Pages 開発文書 ④】詳細設計書 (1/4) — クラス構成・エンティティ・データアクセス層
- 【Razor Pages 開発文書 ⑤】詳細設計書 (2/4) — 画面制御層・起動処理
- 【Razor Pages 開発文書 ⑥】詳細設計書 (3/4) — 発行SQL・処理シーケンス
- 【Razor Pages 開発文書 ⑦】詳細設計書 (4/4) — ビュー・設定・実装上の留意点
-
【Razor Pages 開発文書 ⑧】単体テスト仕様書 (この記事)
- 【Razor Pages 開発文書 ⑨】結合テスト仕様書
- 【Razor Pages 開発文書 ⑩】総合テスト仕様書
- 【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 開発文書 ⑨】結合テスト仕様書 →