単体テストでの HTML サンプル管理

HtmlAgilityPack(HAP)を利用するアプリケーションにおいて、「単体テストでの HTML サンプル管理」は、HTML のパース処理やノード抽出処理が仕様通りに動作するかを検証するうえで非常に重要です。以下に、テストにおける HTML サンプルの管理方法について詳しく説明します。


1. HTML サンプルの役割と必要性

HtmlAgilityPack のような HTML 解析ライブラリを使う際、HTML は構造が複雑かつ不正確なことも多いため、さまざまなパターンの HTML 入力に対して処理の正当性を確認することが必要です。

  • 正常系(整形式 HTML)

  • 異常系(タグの閉じ忘れ、入れ子ミス)

  • 属性の欠落や順序の変更

  • JavaScript やスタイルが混在する場合

これらに対応したサンプル HTML を単体テスト用に管理します。


2. 管理方法のベストプラクティス

2.1 テストデータのファイル分離

  • テスト対象コードと分離し、TestData フォルダなどに格納します。

  • 各 HTML サンプルを .html ファイルとして保存。

  • ファイル名はテスト内容を識別しやすい名前にします(例:MalformedTagInput.html)。

2.2 組み込みリソースとして管理(C#)

  • .html ファイルをプロジェクトに追加し、「ビルドアクション」を 埋め込みリソース に設定することで、実行ファイルに組み込めます。

  • アセンブリから読み込むことで、環境依存せずにテストできます。

csharp
string html; using (var stream = Assembly.GetExecutingAssembly() .GetManifestResourceStream("MyApp.TestData.Sample1.html")) using (var reader = new StreamReader(stream)) { html = reader.ReadToEnd(); }

2.3 テストコード内に直接埋め込む(小規模向け)

  • テストのスコープが小さく、HTML が短い場合は、テストメソッド内に文字列として定義してもよいです。

csharp
string html = "<div><p>Test</p></div>"; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); // アサーションなどを実施

3. HTML サンプルのバージョン管理と更新

  • テストケースごとに対応する HTML サンプルは、Git などのバージョン管理システムに含めて管理します。

  • HTML サンプルが変更された場合は、テストの意図に沿って再評価し、必要に応じてアサーションも更新します。


4. 自動テストとの統合

  • HTML サンプルを使ったテストは、NUnit や xUnit の [TestCaseSource] などを使って パラメータ化することで、複数の入力を網羅的に検証できます。

  • 例:

csharp
[TestCaseSource(nameof(GetHtmlSamples))] public void Test_HtmlParsing(string html) { var doc = new HtmlDocument(); doc.LoadHtml(html); Assert.IsNotNull(doc.DocumentNode.SelectSingleNode("//p")); } static IEnumerable<string> GetHtmlSamples() { yield return File.ReadAllText("TestData/Sample1.html"); yield return File.ReadAllText("TestData/Sample2.html"); }

5. まとめ

項目 内容
管理形式 ファイル、埋め込みリソース、文字列リテラル
格納場所 TestData フォルダなど
テストフレームワーク連携 NUnit/xUnit の TestCaseSource など
目的 パース処理やXPath抽出の正常性/頑健性の検証
バージョン管理 Git 等で HTML サンプルも管理対象とする

このように、単体テストで HTML サンプルを適切に管理することは、HtmlAgilityPack を使った HTML 処理の品質保証において不可欠です。現実の HTML の多様性と曖昧性に対応するためにも、網羅的かつ計画的なサンプルの準備が推奨されます。

ChatGPT4o 生成日:2025/06/23