15

MSTestでは、次のようなことができます。

[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", 
            "testdata.csv", "testdata#csv", DataAccessMethod.Sequential)]
public void TestSomething()
{
    double column1 = Convert.ToDouble(TestContext.DataRow["column1"]);
    ...
    Assert.AreEqual(...);
}

NUnit 2.5の同等のコードは何ですか?

4

5 に答える 5

12

NUnitでcsvベースのデータ駆動型テストを次のように機能させました。

コードプロジェクトのcsvリーダーを使用し、テストクラスでIEnumerableを返すプライベートメソッドにラップしてから、テストケースのTestCaseSource属性でこれを参照します。プロジェクトにcsvファイルを含め、[出力ディレクトリにコピー]を[常にコピー]に設定します。

using System.Collections.Generic;
using System.IO;
using LumenWorks.Framework.IO.Csv;
using NUnit.Framework;

namespace mytests
{
    class MegaTests
    {
        [Test, TestCaseSource("GetTestData")]
        public void MyExample_Test(int data1, int data2, int expectedOutput)
        {
            var methodOutput = MethodUnderTest(data2, data1);
            Assert.AreEqual(expectedOutput, methodOutput, string.Format("Method failed for data1: {0}, data2: {1}", data1, data2));
        }

        private int MethodUnderTest(int data2, int data1)
        {
            return 42; //todo: real implementation
        }

        private IEnumerable<int[]> GetTestData()
        {
            using (var csv = new CsvReader(new StreamReader("test-data.csv"), true))
            {
                while (csv.ReadNextRecord())
                {
                    int data1 = int.Parse(csv[0]);
                    int data2 = int.Parse(csv[1]);
                    int expectedOutput = int.Parse(csv[2]);
                    yield return new[] { data1, data2, expectedOutput };
                }
            }
        }
    }
}

元の投稿:http://timwise.blogspot.com/2011/05/data-driven-test-in-nunit-with-csv.html

于 2011-05-23T10:12:07.583 に答える
10

NUnit 2.5のパラメーター化されたテストのドキュメントを見て、そこで行っているようなことができるかどうかを確認します。パラメータ化されたテストを実行するためのCSV読み取り属性が組み込まれているNUnitを思い出せません。ただし、どこかにコミュニティプラグインがあるかもしれません。

また、MS以外のユニットテストフレームワークライブラリを探しているだけの場合は、xUnit.netにこの機能があります。ベンホールからのこのブログ投稿をチェックしてください

于 2010-10-27T19:26:53.790 に答える
3

これは、Tim Abellと非常によく似た別の例ですが、CSVリーダーのフレームワークを使用せず、テストの詳細を示しています。TestCaseAttributeを使用する場合、TestAttributeは省略できることに注意してください。

        [TestCaseSource("GetDataFromCSV")]
    public void TestDataFromCSV(int num1,int num2,int num3)
    {
        Assert.AreEqual(num1 + num2 ,num3);
    }

    private IEnumerable<int[]> GetDataFromCSV()
    {
        CsvReader reader = new CsvReader(path);
        while (reader.Next())
        {
            int column1 = int.Parse(reader[0]);
            int column2 = int.Parse(reader[1]);
            int column3 = int.Parse(reader[2]);
            yield return new int[] { column1, column2, column3 };
        }
    }


public class CsvReader : IDisposable
{
    private string path;
    private string[] currentData;
    private StreamReader reader;

    public CsvReader(string path)
    {
        if (!File.Exists(path)) throw new InvalidOperationException("path does not exist");
        this.path = path;
        Initialize();
    }

    private void Initialize()
    {
        FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
        reader = new StreamReader(stream);
    }

    public bool Next()
    {
        string current = null;
        if ((current = reader.ReadLine()) == null) return false;
        currentData = current.Split(',');
        return true;
    }

    public string this[int index]
    {
        get { return currentData[index]; }
    }


    public void Dispose()
    {
        reader.Close();
    }
}

CSVデータ:

10,200,210 20,190,210 30,180,210 40,170,210 50,160,210 60,150,210 70,140,​​210 80,130,210 90,120,210 100,110,210

注:3番目の列は、最初の2つの列の合計であり、これは単体テストでアサートされます。

結果:

結果

TestCaseDataオブジェクトを使用し、リターンタイプを設定する代替案を以下で見つけます(コース外は必須です)

        [TestCaseSource("GetDataFromCSV2")]
    public int TestDataFromCSV2(int num1, int num2)
    {
        return num1 + num2;
    }

    private IEnumerable GetDataFromCSV2()
    {
        CsvReader reader = new CsvReader(path);
        while (reader.Next())
        {
            int column1 = int.Parse(reader[0]);
            int column2 = int.Parse(reader[1]);
            int column3 = int.Parse(reader[2]);
            yield return new TestCaseData(column1, column2).Returns(column3);
        }
    }
于 2014-04-24T11:55:38.107 に答える
0

MS Testは、さまざまなソースからのテストデータを取得するメカニズムを提供します。ただし、これはNUnitからそのままでは利用できません。

かなりのサイズのテストでは、データとコードを分離することに賛成です。両方を分離すると、1。テストデータの可読性2.テストデータは簡単に変更できる必要があります3.単体テストはローカル環境とビルド環境で快適に実行できる必要があります

以下のJsonSectionReaderには、私が望んでいるすべての機能があります。このツールは、埋め込まれたjsonファイルからデータのセクションを読み取ることができます。また、逆シリアル化するための非常に快適なメカニズムを提供します。

https://www.nuget.org/packages/WonderTools.JsonSectionReader/

PS私はこのプロジェクトのメンテナーです。このプロジェクトは、この問題を解決するツールが他に見つからなかったために作成されました。

于 2019-03-30T18:05:22.393 に答える
-2

Nunitと同等の方法は、メソッドをセットアップメソッドとしてマークし、その後のテストで使用するフィールドにデータをロードすることだと思います。

多かれ少なかれ、自分でコーディングする必要があります。

于 2010-10-27T19:29:17.910 に答える