コンテンツにスキップ

画面のテストと確認

扱うこと: 画面が使う関数・画面の型と判断層・画面の部品の単体テストが何を確かめるか、画面の確認(自動化できた範囲・手動で確かめる範囲)。扱わないこと: 画面以外の単体テスト(単体テスト(インデックスと検索) など)、本物の画面を UI オートメーションで操作するスモークテストの仕組み・場面(画面のスモークテスト)。先に読むページ: テスト。

判断層(*_view.ps1)はそのままテストする。result_list.ps1・open_source.ps1・preview.ps1・index_tree.ps1 は $ui・$window を偽物にし、Excel・エクスプローラーの起動は Mock して実際には開かない。クリップボードは利用者の PC のものを書き換えるため、「コピーしない場合」(preview.ps1 の copyPreviewSelection)だけを確かめる。型(shared/ui/types.ps1・tebunko/ui/ の *_types.ps1)はプロパティの変更通知と各メソッドを確かめる。

flowchart TD
    subgraph judge["判断層($ui に触らない)"]
        V["*_view.ps1"] --> TV["そのままテスト"]
    end
    subgraph parts["画面の部品($ui を偽物にする)"]
        P["result_list.ps1・open_source.ps1<br>preview.ps1・index_tree.ps1"] --> TP["$ui・$window を Mock"]
    end
    subgraph manual["手で確かめる(対象外)"]
        M["gui.ps1・*_tab.ps1・shell.ps1・app_host.ps1・*_dialog.ps1"] --> TM["画面の確認(このページの下半分)<br>画面のスモークテストが自動で確かめる範囲を含む"]
    end

画面の単体テスト

画面が使う関数と画面の部品を Pester 5.9.0 で確かめる(実行方法・タグ・カバレッジは テストの実行と CI)。画面の部品(ui/*.ps1)のテストは、WPF のコントロール($ui.ResultGrid など)を偽のオブジェクトに差し替え、読み込み時に登録されたイベントの処理を直接呼んで確かめる。画面を開かないため、CI でも動く。

画面が使う tebunko/lib.ps1 の関数(画面の実装構成)

対象 テスト 主な確認内容
searchContentIndex tests/tebunko/search/content_index_search.Tests.ps1 結果が TSV を 1 行ずつ照合したときと同じこと(改行の種類・照合のしかたごと)、文字どおり・正規表現・不正な正規表現、大文字・小文字、対象ファイル・図形とコメントの除外、上限での打ち切り、正規表現の照合の時間切れ(全文への照合は 1 行ずつに切り替える)、並列検索と読んだ内容の使い回し、中止・進捗の通知
getContentIndexFiles / readContentIndexLines 同上 本文インデックスのファイルの列挙(フォルダの一部・直下だけ・無いフォルダ)、前後の行と行番号
testIndexExists / getIndexSummary tests/tebunko/search/search_run.Tests.ps1 本文インデックスのファイルの有無・件数・最新の更新日時、存在しないフォルダ
toSearchResultLines / writeSearchResult 同上 検索 の結果ファイルの形式になること
newSearchRegex / getRegexScanMode / newFileFilter tests/tebunko/search/search_query.Tests.ps1 文字どおりの記号、不正な正規表現、大文字と小文字の区別。対象ファイルは ; / ; の区切り、! の除外、部分一致、?、ほかの記号は文字どおり、空なら条件なし
getSourceLocation / resolveSourcePath / findMovedSource tests/tebunko/search/source_map.Tests.ps1 元のファイルのインデックス名・場所・パスの特定、選んだフォルダからの探索(元のファイルを開く)
splitTsvCells tests/shared/core/text.Tests.ps1 " で囲まれたセル内のタブ、空のセル、先頭のセルが空の行
testTextTrimmed tests/shared/core/text.Tests.ps1 ちょうど・1px 超え・誤差の内・幅 0
getExistingAncestorFolder tests/shared/core/folder.Tests.ps1 フォルダ選択を開く場所(フォルダ選択ダイアログ([参照…]))。フォルダがあればそのまま、無ければその上の今もあるフォルダ、どこにも無い・空なら空
getOfficeProcesses / stopOfficeProcesses tests/shared/office/office_process.Tests.ps1 記録の読み書き、記録と今のプロセスの照らし合わせ(PID・名前・起動時刻・持ち主)、止める直前の照らし直し(Get-Process / Stop-Process をモックする)。画面を通した確かめは S7(tests/gui/leftover_real.Tests.ps1)
readSearchOption / writeSearchOption ほか設定の読み書き tests/tebunko/core/settings.Tests.ps1 ファイルが無ければオフ・空、保存した値の読み込み、指定した項目だけを変える
newIndexName tests/tebunko/index/index_name.Tests.ps1 使用済みの名前が無い・1 個だけの場合も正しく判定すること(PowerShell は集合を返すと中身を展開するため、$null・文字列で渡ることがある)

画面の型・判断層・部品

対象 テスト 主な確認内容
画面の型(実行時コンパイル(csc.exe)を使わない) tests/shared/ui/types.Tests.ps1
tests/tebunko/ui/search/result_types.Tests.ps1
search\target_types.Tests.ps1
index\index_types.Tests.ps1
NotifyBase の変更通知。HitRow(生成・Prepare・絞り込みの一致・セルの分割・BuildPreview・境界値)、FileGroup、PreviewColumn/PreviewCell/PreviewTable(範囲の選択とコピー、Excel に貼れる形への引用)、IndexNode(3 状態のチェック・フォルダの読み込み・境界値)、FolderItem
判断層 tests/tebunko/ui/index/index_list_view.Tests.ps1
index_edit_view.Tests.ps1
index_detail_view.Tests.ps1
index_archive_view.Tests.ps1
indexing_view.Tests.ps1
search\search_bar_view.Tests.ps1
result_list_view.Tests.ps1
open_source_view.Tests.ps1
preview_view.Tests.ps1
settings\settings_view.Tests.ps1
画面に出す文言と可否の判定(ワークスペースの表示・選んだフォルダの可否・変える前の確認と空でないフォルダの警告の文言、インデックス名の入力チェック、インデックス作成の確認の文言と終わりの見出し・説明(成功・失敗の組み合わせ。利用者の PowerPoint のために取り込めなかったファイルは失敗に入る)、ボタンの上の一言(残りの件数とインデックス作成中か)、検索条件の説明・注意・検索ボタンの状態、ファイルごとの見出しの表記と並べ替え、プレビューの行数とステータス)
結果の表 tests/tebunko/ui/result_list.Tests.ps1 ファイルごとの見出しの作成と開閉(ファイルごとにまとめた表示)、表に出す値(ファイル名・フォルダ・場所の向きを変える文字や制御文字を置き換え、開く・コピー用の値は元のまま)、行の作成、絞り込み、並べ替え、検索の終了時の表示、選択行の取得、イベント
選択行のプレビュー tests/tebunko/ui/preview.Tests.ps1 表示・消去、最初に読む行数と縦の位置、セルを選んでいないときのコピーの案内、イベント、読み込み(startJob)の結果の扱い(読んでいる間に別の行を選んだら古い結果を出さない・後から頼んだ読み込みがあれば先の分は捨てる・読めないときは選んだ行だけを出す)、読み足し(表ごとに結果を合わせる・つながるときだけ足す・端まで読んだら止める・上限を超えたら遠い側を捨てる・別の行に替わったあとの結果は捨てる)、最後に読んだファイルの控えを次の読みに渡すこと、列見出しのドラッグ中は見えている列の範囲を固定すること、全部の列を持つこと(見出しとセルは見えている列だけ)。表と列の範囲は search\result_types.Tests.ps1・preview_view.Tests.ps1(getPreviewColumnWindow)
元のファイルを開く tests/tebunko/ui/open_source.Tests.ps1 パスの特定・フォルダの選び直し、開き方の切り替え、既定のアプリで開く、フォルダを開く、ファイル出力、画面の操作、取り込み対象でない名前(.hta・.lnk など)は openSource・openWithShell のどちらでも開かずステータスに知らせること、断られたときに「開きました」で上書きしないこと
検索対象のツリー tests/tebunko/ui/index_tree.Tests.ps1 ツリーの読み込み、検索範囲の説明、除外の保存、すべてのチェック、イベント
画面定義(XAML) tests/meta/structure.Tests.ps1 scripts/**/*.xaml が XML として読めること、各タブの画面に gui.ps1 などが使う x:Name がすべてあること、shared と tebunko の型を順に読み込めること

画面の確認

確認欄:◎ = テスト用のコピー(一時フォルダ)で画面を動かして確認済み、「自動」 = 画面のスモークテストが毎回確かめる(S1〜S7 は場面)、空欄・「要手動」 = 未確認(手動で確認する)。

確認内容 関連 確認
起動時のタブが状態(未作成・中断中・失敗あり・通常)に応じて変わる 起動時に開くタブ ◎(中断中)。未作成→S2、通常→S1 は自動。中断中で自動的に切り替わること(#4)は保留(上の「見つかった不具合」)
インデックス一覧・チェック・存在の判定、ドラッグ&ドロップ・[参照…]、" 付きのパスの貼り付け インデックス一覧の管理 一覧・判定は◎。追加・編集・削除・[参照…]は自動(S2)
インデックス一覧の行のチェックの切替が保存されること(Checked・Unchecked で配線) インデックス一覧の管理 自動(S2)
フォルダ選択ダイアログ(Windows 標準のダイアログが開くこと、開始フォルダ、[フォルダーの選択]で元のフォルダに入ること、[キャンセル]で変わらないこと) フォルダ選択ダイアログ([参照…]) ◎(UI オートメーションで[+ フォルダを追加]→[参照…]→フォルダ名の欄に入力→[フォルダーの選択]まで操作し、インデックス編集への反映を確認)。OpenFileDialog に切り替わる場合は要手動。自動(S2・S5。ランナーの英語の Windows でも)
状態ごとの実行ボタンの表示、インデックス作成中の二重起動防止 一覧の列 ◎。作成中に追加・編集・削除が押せないことは自動(S3)
インデックス作成の進み具合(件数・失敗・残り時間・取り込み中のファイル・終了後の表示) インデックス作成の進み具合、中止・終了・ログ ◎(取り込み一覧を模擬)
インデックス作成の確認ダイアログ(インデックスごとの件数・更新不要・失敗分の再取り込み・[キャンセル]) インデックス作成の確認ダイアログ 取り込み予定・終了コード・取り込み一覧が前回のまま残ることは◎(tests/tebunko/indexer/indexer.Tests.ps1 で、受け渡しの口の ConfirmTargets でインデクサを動かし、別のスレッドから返事を渡して確認)。ダイアログの見た目は要手動。開く・[キャンセル]・開始は自動(S2・S3)
インデックス作成中に画面を閉じる(止めてから閉じる確認・更新を止めています…・待つ間のダイアログ(待つ間のダイアログ)・止まってから閉じる。60 秒で Office を止める) 中止・終了・ログ、閉じる 要手動。確認・止めてから閉じる・終了コード 0 は自動(S3)。60 秒待って Office を止める段階は手
検索中の進捗表示・中止、大量ヒット時の打ち切り、検索中も画面を操作できること 検索の実行
(株) 1.5 C++ の文字どおり検索と正規表現検索、正規表現が正しくないときの吹き出し 検索ワードの扱い ◎。正規表現が正しくないときの吹き出しは自動(S4)
一致箇所の強調、並べ替え、絞り込み 結果の表、絞り込み 要手動。並べ替えは軽いフィールド(場所→Location・行番号、該当行→Line)。絞り込みは元のファイル名だけで照合するため、フォルダ・場所・該当行・セル番地(例 B5)には当たらない
「場所」列([シート]売上!B6 / [シート]売上!A3 ほか 2、Word・PowerPoint は場所ごとの表記)、選択行のプレビュー(前後の行・一致したセルの強調・先頭のセルが空の行・セル内改行のあるセルの折り返し)、列見出しのドラッグによる列幅の変更(下限 24px)、セルを選んでの値のコピー、[Excel で開く][フォルダを開く]の表示 結果の表、検索対象のツリー ◎(テスト用の TSV を画面に入れて描画を確認。列幅は見出しの Thumb に DragDelta を起こして確認。コピーは、画面のセル(Border)から getPreviewCell でセルを特定し、1 セル・範囲・行のコピー結果とクリップボードの内容を確認。合成したマウスイベントは配送されないため、クリック操作そのものは要手動)
検索結果の遅延描画:スクロールしても一致箇所の強調・「場所」列が出る/大量ヒット(数千〜1万件)で固まらない(HitRow.Prepare+LoadingRow) 実行時コンパイル(csc.exe)を使わない、結果の表 クラスの動きは◎(上の「画面の単体テスト」)。スクロール時の描画・体感速度は要手動
検索対象ツリーの 3 状態チェック(親子伝播)・展開時の子読み込み 検索対象のツリー 3 状態・検索範囲と除外の組み立ては◎(上の「画面の単体テスト」)。クリック操作・展開は要手動。[すべて解除][すべて選択]は自動(S4)
Excel の該当シート・セルが選択された状態で開くこと、Word・PowerPoint が開くこと、ファイルが無い場合(フォルダを選ぶ確認・フォルダ選択) 元のファイルを開く 元のファイルのパスの特定・コピーしたインデックスからの特定・選んだフォルダからの探索と置き換え、Excel を「通常」で開いたときに該当シート・セル(C3)が選択されることは◎(openInExcel にテストデータのブックを渡して確認)。読み取り専用・新規、Word・PowerPoint、ファイルが無い場合は要手動。ファイルが無い場合の確認と[フォルダを選ぶ]は自動(S4)
コピーした行を Excel に貼ったときの列の位置、結果ファイルの形式 元のファイルを開く、結果をファイルに出力 コピーの形式のみ◎
起動時の残った Office の確認の文言・出すタイミング・対象の選び方 前回残った Office の確認 判断層の単体テスト(leftover_view.Tests.ps1)で確かめる。確認ダイアログを開いて[今回は終了しない]・[終了する]を押す流れは tests/gui/leftover.Tests.ps1(偽の行を差し込み、本物の Office には触れない)で確かめる
アイコンがタイトルバー・タスクバーに出ること(タスクバーのボタンは PowerShell と同じグループになるが、アイコンは tebunko) 表示・アクセシビリティ 要手動
表示倍率 100 %・150 % での見た目 表示・アクセシビリティ
多重起動したときに、2 つ目が終了して既存のウィンドウが前面に出ること ウィンドウ、画面を固まらせない待たせ方 最小化からの復帰は◎。別アプリが前面のときのフォーカス奪取は OS の制限で不確実(要手動)。2 つ目が終わり 1 つ目が残ることは自動(S1)
zip 展開直後(Mark-of-the-Web 付き)から tebunko.bat で起動でき、印が消えること(Bypass なし・RemoteSigned) 配布と実行ポリシー(Mark-of-the-Web) ◎(テスト用のコピー全ファイルに MOTW を付け、RemoteSigned でブロックされること→tebunko.bat 実行で scripts 配下の MOTW 0 件→RemoteSigned で画面が開く(ウィンドウ表題 tebunko)ことを確認)
tebunko.bat で起動したとき、PowerShell の窓が残らないこと(既定のターミナルが Windows Terminal でも) 配布と実行ポリシー(Mark-of-the-Web) ◎(エクスプローラーから起動し、Windows Terminal のタブが増えず、画面の親が conhost.exe であることを確認)
実行時コンパイル(csc.exe)を出さないこと 実行時コンパイル(csc.exe)を使わない ◎(Add-Type は標準アセンブリの読み込みだけであること(tests/meta/safety.Tests.ps1)・起動〜検索で csc.exe 0 回/一時 DLL 0 個を実起動で確認)
[ ] を含むツールの配置フォルダからの起動 結合テスト(手動)