5

2 つの xml ファイルを処理してテキスト ファイルを生成するクラスがあります。

次のことを行う、このクラスに対して個別に合格または不合格になる一連の単体/統合テストを作成したいと思います。

  1. 入力 A と B に対して、出力を生成します。
  2. 生成されたファイルの内容を、期待される出力の内容と比較します
  3. 実際の内容が予想される内容と異なる場合、失敗し、違いに関するいくつかの有用な情報を表示します。

以下は、クラスのプロトタイプと、単体テストでの最初の刺し傷です。

この種のテストに使用すべきパターンはありますか?それとも、人々は無数の TestX() 関数を書く傾向がありますか?

NUnit とのテキスト ファイルの違いを理解するためのより良い方法はありますか? テキストファイル差分アルゴリズムを埋め込む必要がありますか?


class ReportGenerator
{
    string Generate(string inputPathA, string inputPathB)
    {
        //do stuff
    }
}

[TextFixture]
public class ReportGeneratorTests
{
     static Diff(string pathToExpectedResult, string pathToActualResult)
     {
         using (StreamReader rs1 = File.OpenText(pathToExpectedResult))
         {
             using (StreamReader rs2 = File.OpenText(pathToActualResult))
             {
                 string actualContents = rs2.ReadToEnd();
                 string expectedContents = rs1.ReadToEnd();                  

                 //this works, but the output could be a LOT more useful.
                 Assert.AreEqual(expectedContents, actualContents);
             }
         }
     }

     static TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
     {
          ReportGenerator obj = new ReportGenerator();
          string pathToResult = obj.Generate(pathToInputA, pathToInputB);
          Diff(pathToExpectedResult, pathToResult);
     }

     [Test]
     public void TestX()
     {
          TestGenerate("x1.xml", "x2.xml", "x-expected.txt");
     }

     [Test]
     public void TestY()
     {
          TestGenerate("y1.xml", "y2.xml", "y-expected.txt");
     }

     //etc...
}

アップデート

差分機能のテストには興味がありません。より読みやすいエラーを生成するために使用したいだけです。

4

5 に答える 5

5

異なるデータを使用した複数のテストについては、NUnit RowTest 拡張機能を使用します。

using NUnit.Framework.Extensions;

[RowTest]
[Row("x1.xml", "x2.xml", "x-expected.xml")]
[Row("y1.xml", "y2.xml", "y-expected.xml")]
public void TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
 {
      ReportGenerator obj = new ReportGenerator();
      string pathToResult = obj.Generate(pathToInputA, pathToInputB);
      Diff(pathToExpectedResult, pathToResult);
 }
于 2008-09-26T22:16:05.963 に答える
2

おそらく、「ゴールド」データに対するテストを求めているでしょう。この種のテストが世界中で受け入れられている特定の用語があるかどうかはわかりませんが、これが私たちのやり方です。

基本フィクスチャ クラスを作成します。これは基本的に「void DoTest(string fileName)」を持ち、特定のファイルをメモリに読み込み、抽象変換メソッド「string Transform(string text)」を実行し、同じ場所から fileName.gold を読み込み、変換されたテキストを期待されるものと比較します。 . 内容が異なる場合は例外をスローします。スローされる例外には、最初の相違点の行番号と、予期される行と実際の行のテキストが含まれます。テキストは安定しているため、通常、これは問題をすぐに特定するのに十分な情報です。「Expected:」と「Actual:」で行をマークしてください。そうしないと、テスト結果を見たときにどれがどれであるかを永遠に推測することになります。

次に、適切なジョブを実行する Transform メソッドを実装する特定のテスト フィクスチャがあり、次のようなテストがあります。

[Test] public void TestX() { DoTest("X"); }
[Test] public void TestY() { DoTest("Y"); }

失敗したテストの名前により、何が壊れているかがすぐにわかります。もちろん、行テストを使用して同様のテストをグループ化できます。個別のテストを行うことは、テストを無視したり、テストを同僚に伝えたりするなど、さまざまな状況で役立ちます。すぐにテストを作成するスニペットを作成することは大したことではありません。データの準備により多くの時間を費やすことになります。

次に、いくつかのテスト データと、ベース フィクスチャがそれを見つける方法も必要になります。プロジェクトのルールを必ず設定してください。テストに失敗した場合は、実際の出力をゴールドの近くのファイルにダンプし、テストに合格した場合はそれを消去します。このようにして、必要に応じて差分ツールを使用できます。ゴールドデータが見つからない場合は、適切なメッセージでテストが失敗しますが、実際の出力はとにかく書き込まれるので、正しいことを確認してコピーして「ゴールド」にすることができます。

于 2008-09-28T06:28:00.890 に答える
0

私はおそらくXmlReaderを使用してファイルを反復処理し、それらを比較します。違いにぶつかると、ファイルが異なる場所へのXPathを表示します。

PS:しかし実際には、ファイル全体を文字列に単純に読み取り、2つの文字列を比較するだけで常に十分でした。レポートについては、テストが失敗したことを確認するだけで十分です。次に、デバッグを行うときは、通常、Araxis Mergeを使用してファイルを比較し、どこに問題があるかを正確に確認します。

于 2008-09-27T05:19:08.957 に答える
0

.AreEqual を呼び出すのではなく、2 つの入力ストリームを自分で解析し、行と列のカウントを保持して内容を比較できます。違いを見つけるとすぐに、次のようなメッセージを生成できます...

行 32 列 12 - 'y' が予期されていたときに 'x' が見つかりました

オプションで、複数行の出力を表示することでそれを強化できます

行 32 の差 列 12、最初の差を表示
A = これはx stに
あります B = これはe stsにあります

原則として、私は通常、あなたが持っている2つのストリームのうちの1つだけをコードで生成することに注意してください。もう 1 つは、含まれているデータが正しいことを目やその他の方法で確認して、テスト/テキスト ファイルから取得します。

于 2008-09-26T21:43:36.117 に答える
0

おそらく、ループを含む単一の単体テストを作成します。ループ内で、2 つの xml ファイルと 1 つの差分ファイルを読み取り、(ディスクに書き込まずに) xml ファイルを差分し、ディスクから読み込んだ差分ファイルと比較します。ファイルには、a1.xml、b1.xml、diff1.txt などのように番号が付けられます。a2.xml、b2.xml、diff2.txt ; a3.xml、b3.xml、diff3.txt などで、次の番号が見つからないとループが停止します。

その後、新しいテキスト ファイルを追加するだけで、新しいテストを作成できます。

于 2008-09-26T21:44:29.003 に答える