Pengujian berbasis data di MSTest

Pengujian berbasis data memungkinkan Anda menjalankan metode pengujian yang sama dengan beberapa set data input. Alih-alih menulis metode pengujian terpisah untuk setiap kasus pengujian, tentukan logika pengujian Anda sekali dan berikan input yang berbeda melalui atribut atau sumber data eksternal.

Gambaran Umum

MSTest menyediakan beberapa atribut untuk pengujian berbasis data:

Attribute Skenario penggunaan Paling cocok untuk
DataRow Data uji sebaris Kasus pengujian statis sederhana
CombinatorialData Produk Kartesius dari nilai parameter Kombinasi menyeluruh dari input yang independen
DynamicData Data dari metode, properti, atau bidang Data pengujian kompleks atau komputasi
DataSource File data eksternal atau basis data Skenario lama dengan sumber data eksternal

MSTest juga menyediakan jenis berikut untuk memperluas skenario berbasis data:

  • TestDataRow<T>: Jenis pengembalian untuk ITestDataSource implementasi (termasuk DynamicData) yang menambahkan dukungan metadata seperti nama tampilan, kategori, dan mengabaikan pesan ke kasus pengujian individual.
  • ITestDataSource: Antarmuka yang dapat Anda terapkan pada atribut kustom untuk membuat atribut sumber data kustom sepenuhnya.

Important

Pengujian combinatorial bawaan direncanakan untuk MSTest 4.4 dan hanya tersedia dalam build pratinjau hingga MSTest 4.4.0 dirilis. Untuk versi MSTest sebelumnya, gunakan paket Combinatorial.MSTest yang dikelola komunitas.

DataRowAttribute

DataRowAttribute memungkinkan Anda menjalankan metode pengujian yang sama dengan beberapa input berbeda. Terapkan satu atau beberapa DataRow atribut ke metode pengujian yang dihiasi dengan TestMethodAttribute.

Jumlah dan jenis argumen harus sama persis dengan tanda tangan metode pengujian.

Petunjuk / Saran

Penganalisis terkait:

  • MSTEST0014 memvalidasi bahwa DataRow argumen cocok dengan tanda tangan metode pengujian.
  • MSTEST0042 mendeteksi entri duplikat DataRow yang akan menjalankan kasus pengujian yang sama beberapa kali.

Penggunaan dasar

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    [DataRow(1, 2, 3)]
    [DataRow(0, 0, 0)]
    [DataRow(-1, 1, 0)]
    [DataRow(100, 200, 300)]
    public void Add_ReturnsCorrectSum(int a, int b, int expected)
    {
        var calculator = new Calculator();
        Assert.AreEqual(expected, calculator.Add(a, b));
    }
}

Jenis argumen yang didukung

DataRow mendukung berbagai jenis argumen termasuk primitif, string, array, dan nilai null:

[TestClass]
public class DataRowExamples
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestWithMixedTypes(int i, string s, bool b, float f)
    {
        // Test with different primitive types
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestWithArray(string[] lines)
    {
        Assert.AreEqual(2, lines.Length);
    }

    [TestMethod]
    [DataRow(null)]
    public void TestWithNull(object o)
    {
        Assert.IsNull(o);
    }

    [TestMethod]
    [DataRow(new string[] { "a", "b" }, new string[] { "c", "d" })]
    public void TestWithMultipleArrays(string[] input, string[] expected)
    {
        // Starting with MSTest v3, two arrays don't need wrapping
    }
}

Nota

Dimulai dengan MSTest v3.10, gunakan DateOnly dan TimeOnly sebagai DataRow argumen dan dalam DynamicData pengujian berparameter.

Menggunakan param untuk argumen variabel

params Gunakan kata kunci untuk menerima jumlah variabel argumen:

[TestClass]
public class ParamsExample
{
    [TestMethod]
    [DataRow(1, 2, 3, 4)]
    [DataRow(10, 20)]
    [DataRow(5)]
    public void TestWithParams(params int[] values)
    {
        Assert.IsTrue(values.Length > 0);
    }
}

Metode pengujian generik

Dimulai dengan MSTest v3.8, TestMethod dapat memiliki parameter jenis. Kerangka kerja menyimpulkan argumen jenis dari DataRow atau DynamicData nilai:

[TestMethod]
[DataRow(42)]
[DataRow("alpha")]
public void Value_RoundTrips<T>(T value)
{
    Assert.AreEqual(value, value);
}

Nama tampilan kustom

Atur DisplayName properti untuk menyesuaikan bagaimana kasus pengujian muncul di Test Explorer:

[TestClass]
public class DisplayNameExample
{
    [TestMethod]
    [DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
    [DataRow(3, 4, DisplayName = "Edge case: small numbers")]
    public void TestMethod(int i, int j)
    {
        Assert.IsTrue(i < j);
    }
}

Petunjuk / Saran

Untuk kontrol lebih besar atas metadata pengujian, pertimbangkan untuk menggunakan TestDataRow<T> dengan DynamicData. TestDataRow<T> mendukung nama tampilan bersama dengan kategori pengujian dan mengabaikan pesan untuk kasus pengujian individual.

Mengabaikan kasus pengujian tertentu

Dimulai dengan MSTest v3.8, gunakan IgnoreMessage properti untuk melewati baris data tertentu:

[TestClass]
public class IgnoreDataRowExample
{
    [TestMethod]
    [DataRow(1, 2)]
    [DataRow(3, 4, IgnoreMessage = "Temporarily disabled - bug #123")]
    [DataRow(5, 6)]
    public void TestMethod(int i, int j)
    {
        // Only the first and third data rows run
        // The second is skipped with the provided message
    }
}

CombinatorialDataAttribute

Dalam build pratinjau MSTest 4.4, atribut CombinatorialData menghasilkan hasil kali Kartesius dari nilai tiap parameter metode pengujian. Gunakan tipe dalam namespace Microsoft.VisualStudio.TestTools.UnitTesting.Combinatorial.

Berikan nilai untuk setiap parameter dengan salah satu opsi berikut:

Sumber nilai Perilaku
Nilai yang disimpulkan Menggunakan true dan false untuk bool; 0 dan 1 untuk int; semua nilai yang ditentukan untuk enumerasi; dan null ditambah nilai yang disimpulkan untuk versi yang dapat bernilai null dari salah satu tipe yang didukung ini.
CombinatorialValues Menggunakan nilai eksplisit yang Anda berikan ke atribut .
CombinatorialRange Menghasilkan nilai int atau uint dari nilai awal dan jumlah, atau dari titik akhir inklusif dan interval.
CombinatorialRandomData Menghasilkan nilai unik int . Atur Count, Minimum, Maximum, dan secara Seed opsional untuk mengontrol nilai.

Pengujian berikut menggabungkan dua nilai bool yang disimpulkan, dua nilai eksplisit, tiga nilai rentang, dan dua nilai acak berseed. MSTest menghasilkan 24 kasus pengujian dari kumpulan parameter independen ini.

[TestMethod]
[CombinatorialData]
public void Calculate_UsesEveryCombination(
    bool enabled,
    [CombinatorialValues(1, 3)] int factor,
    [CombinatorialRange(2, 6, 2)] int value,
    [CombinatorialRandomData(Count = 2, Minimum = 10, Maximum = 20, Seed = 42)] int offset)
{
    int result = enabled ? (factor * value) + offset : value + offset;

    Assert.IsTrue(result >= 12);
}
<TestMethod>
<CombinatorialData>
Public Sub Calculate_UsesEveryCombination(
    enabled As Boolean,
    <CombinatorialValues(1, 3)> factor As Integer,
    <CombinatorialRange(2, 6, 2)> value As Integer,
    <CombinatorialRandomData(Count:=2, Minimum:=10, Maximum:=20, Seed:=42)> offset As Integer)

    Dim result = If(enabled, (factor * value) + offset, value + offset)

    Assert.IsTrue(result >= 12)
End Sub

Terapkan tidak lebih dari satu penyedia nilai combinatorial ke setiap parameter. Untuk jenis parameter yang nilainya tidak dapat disimpulkan MSTest, terapkan CombinatorialValues, , CombinatorialRangeCombinatorialRandomData, atau atribut kustom yang mengimplementasikan ICombinatorialValuesProvider.

CombinatorialData menciptakan produk Kartesius yang lengkap. Ini tidak mendukung generasi berpasangan, permutasi, pengecualian antar nilai parameter, nilai yang didukung oleh anggota, atau data kelas. Gunakan DynamicData atau kustom ITestDataSource saat nilai bergantung satu sama lain atau saat Anda perlu memfilter kasus pengujian yang dihasilkan.

DynamicDataAttribute

Elemen ini memungkinkan DynamicDataAttribute Anda menyediakan data pengujian dari metode, properti, atau bidang. Gunakan atribut ini saat data pengujian kompleks, dihitung secara dinamis, atau terlalu verbose untuk atribut sebaris DataRow .

Jenis sumber data yang didukung

Sumber data dapat mengembalikan IEnumerable<T> mana saja ketika T adalah salah satu jenis yang tercantum dalam tabel berikut. Setiap koleksi yang mengimplementasikan IEnumerable<T> akan berfungsi, termasuk List<T>, array seperti T[], atau tipe koleksi khusus. Pilih berdasarkan kebutuhan Anda:

Tipe pengembalian Keamanan tipe Dukungan metadata Paling cocok untuk
ValueTuple (misalnya, (int, string)) Waktu kompilasi Tidak. Sebagian besar skenario - sintaks sederhana dengan pemeriksaan jenis lengkap
Tuple<...> Waktu kompilasi Tidak. Ketika Anda tidak dapat menggunakan ValueTuple
TestDataRow<T> Waktu kompilasi Yes Kasus pengujian yang memerlukan nama tampilan, kategori, atau mengabaikan pesan
object[] Hanya runtime Tidak. Kode warisan - hindari untuk pengujian baru

Petunjuk / Saran

Untuk metode data pengujian baru, gunakan ValueTuple untuk kasus sederhana atau TestDataRow<T> saat Anda memerlukan metadata. Hindari object[] karena tidak memiliki pengecekan tipe pada saat kompilasi dan dapat menyebabkan kesalahan saat runtime akibat ketidakcocokan tipe.

Sumber data

Sumber data dapat berupa metode atau properti dan, mulai dari MSTest v3.11, bidang. Sumber-sumber ini dapat dipertukarkan, jadi pilih berdasarkan preferensi Anda:

Nota

Dimulai dengan MSTest v3.8, DynamicData mendeteksi jenis sumber data secara otomatis. Anda tidak perlu menentukan DynamicDataSourceType secara eksplisit.

[TestClass]
public class DynamicDataExample
{
    // Method - best for computed or yielded data
    public static IEnumerable<(int Value, string Name)> GetTestData()
    {
        yield return (1, "first");
        yield return (2, "second");
    }

    // Property - concise for static data
    public static IEnumerable<(int Value, string Name)> TestDataProperty =>
    [
        (1, "first"),
        (2, "second")
    ];

    // Field - simplest for static data
    public static IEnumerable<(int Value, string Name)> TestDataField =
    [
        (1, "first"),
        (2, "second")
    ];

    [TestMethod]
    [DynamicData(nameof(GetTestData))]
    public void TestWithMethod(int value, string name)
    {
        Assert.IsTrue(value > 0);
    }

    [TestMethod]
    [DynamicData(nameof(TestDataProperty))]
    public void TestWithProperty(int value, string name)
    {
        Assert.IsTrue(value > 0);
    }

    [TestMethod]
    [DynamicData(nameof(TestDataField))]
    public void TestWithField(int value, string name)
    {
        Assert.IsTrue(value > 0);
    }
}

Nota

Metode, properti, dan bidang sumber data harus berupa public static dan mengembalikan IEnumerable<T> jenis yang didukung.

Nota

Mulai MSTest v3.11, sumber data dapat berupa field. Versi sebelumnya mendukung metode dan properti.

Petunjuk / Saran

Penganalisis terkait: MSTEST0018 memvalidasi bahwa sumber data ada, dapat diakses, dan memiliki tanda tangan yang benar.

Sumber data dari kelas yang berbeda

Tentukan kelas yang berbeda menggunakan parameter jenis:

public class TestDataProvider
{
    public static IEnumerable<(int, string)> GetTestData()
    {
        yield return (1, "first");
        yield return (2, "second");
    }
}

[TestClass]
public class DynamicDataExternalExample
{
    [TestMethod]
    [DynamicData(nameof(TestDataProvider.GetTestData), typeof(TestDataProvider))]
    public void TestMethod(int value1, string value2)
    {
        Assert.IsTrue(value1 > 0);
    }
}

Metode sumber berparameter DynamicData

Mulai dari MSTest v3.10, teruskan nilai ke metode sumber DynamicData dengan properti Arguments:

[TestMethod]
[DynamicData(nameof(GetValues), Arguments = new object[] { true })]
public void Value_IsPositive(int value, bool expected) => Assert.AreEqual(expected, value > 0);

public static IEnumerable<(int Value, bool Expected)> GetValues(bool includeZero) =>
    includeZero ? [(1, true), (0, false)] : [(1, true)];

Nama tampilan kustom

Sesuaikan nama tampilan kasus pengujian menggunakan DynamicDataDisplayName properti :

using System.Reflection;

[TestClass]
public class DynamicDataDisplayNameExample
{
    [TestMethod]
    [DynamicData(nameof(GetTestData), DynamicDataDisplayName = nameof(GetDisplayName))]
    public void TestMethod(int value1, string value2)
    {
        Assert.IsTrue(value1 > 0);
    }

    public static IEnumerable<(int, string)> GetTestData()
    {
        yield return (1, "first");
        yield return (2, "second");
    }

    public static string GetDisplayName(MethodInfo methodInfo, object[] data)
    {
        return $"{methodInfo.Name} with value {data[0]} and '{data[1]}'";
    }
}

Nota

Metode nama tampilan harus public static, mengembalikan string, dan menerima dua parameter: MethodInfo dan object[].

Petunjuk / Saran

Untuk pendekatan yang lebih sederhana untuk nama tampilan kustom, pertimbangkan untuk menggunakan TestDataRow<T> dengan propertinya DisplayName alih-alih metode terpisah.

Mengabaikan semua kasus pengujian dari sumber data

Dimulai dengan MSTest v3.8, gunakan IgnoreMessage untuk melewati semua kasus pengujian:

[TestClass]
public class IgnoreDynamicDataExample
{
    [TestMethod]
    [DynamicData(nameof(GetTestData), IgnoreMessage = "Feature not ready")]
    public void TestMethod(int value1, string value2)
    {
        // All test cases from GetTestData are skipped
    }

    public static IEnumerable<(int, string)> GetTestData()
    {
        yield return (1, "first");
        yield return (2, "second");
    }
}

Petunjuk / Saran

Untuk mengabaikan kasus pengujian individual, gunakan TestDataRow<T> dengan propertinya IgnoreMessage . Lihat bagian TestDataRow<T> .

TestDataRow

Kelas ini TestDataRow<T> memberikan kontrol yang ditingkatkan atas data pengujian dalam pengujian berbasis data. Gunakan IEnumerable<T> dari TestDataRow<T> sebagai jenis pengembalian sumber data Anda untuk menentukan:

Nota

MSTest memperkenalkan TestDataRow<T> pada versi 3.8.

  • Nama tampilan kustom: Atur nama tampilan unik per kasus pengujian menggunakan DisplayName properti .
  • Kategori pengujian: Lampirkan metadata ke kasus pengujian individual menggunakan TestCategories properti .
  • Abaikan pesan: Lewati kasus pengujian tertentu dengan alasan menggunakan IgnoreMessage properti .
  • Data berjenis aman: Gunakan generik untuk data uji yang berjenis kuat.

Penggunaan dasar

[TestClass]
public class TestDataRowExample
{
    [TestMethod]
    [DynamicData(nameof(GetTestDataRows))]
    public void TestMethod(int value1, string value2)
    {
        Assert.IsTrue(value1 > 0);
    }

    public static IEnumerable<TestDataRow<(int, string)>> GetTestDataRows()
    {
        yield return new TestDataRow<(int, string)>((1, "first"))
        {
            DisplayName = "Test Case 1: Basic scenario",
        };

        yield return new TestDataRow<(int, string)>((2, "second"))
        {
            DisplayName = "Test Case 2: Edge case",
            TestCategories = ["HighPriority", "Critical"],
        };

        yield return new TestDataRow<(int, string)>((3, "third"))
        {
            IgnoreMessage = "Not yet implemented",
        };
    }
}

DataSourceAttribute

Nota

DataSource hanya tersedia dalam .NET Framework. Untuk proyek .NET (Core), gunakan DataRow atau DynamicData sebagai gantinya.

DataSourceAttribute menghubungkan pengujian ke sumber data eksternal seperti berkas CSV, berkas XML, atau basis data.

Untuk informasi terperinci, lihat:

ITestDataSource

Antarmuka ITestDataSource memungkinkan Anda membuat atribut sumber data yang sepenuhnya disesuaikan. Terapkan antarmuka ini saat Anda memerlukan perilaku yang tidak didukung atribut bawaan, seperti menghasilkan data pengujian berdasarkan variabel lingkungan, file konfigurasi, atau kondisi runtime lainnya.

Anggota antarmuka

Antarmuka mendefinisikan dua metode:

Metode Tujuan
GetData(MethodInfo) Mengembalikan data pengujian sebagai IEnumerable<object?[]>
GetDisplayName(MethodInfo, object?[]?) Mengembalikan nama tampilan untuk kasus pengujian

Membuat atribut sumber data kustom

Untuk membuat sumber data kustom, tentukan kelas atribut yang mewarisi dari Attribute dan mengimplementasikan ITestDataSource:

using System.Globalization;
using System.Reflection;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyDataSourceAttribute : Attribute, ITestDataSource
{
    public IEnumerable<object?[]> GetData(MethodInfo methodInfo)
    {
        // Return test data based on your custom logic
        yield return [1, "first"];
        yield return [2, "second"];
        yield return [3, "third"];
    }

    public string? GetDisplayName(MethodInfo methodInfo, object?[]? data)
    {
        return data is null
            ? null
            : string.Format(CultureInfo.CurrentCulture, "{0} ({1})", methodInfo.Name, string.Join(",", data));
    }
}

[TestClass]
public class CustomDataSourceExample
{
    [TestMethod]
    [MyDataSource]
    public void TestWithCustomDataSource(int value, string name)
    {
        Assert.IsTrue(value > 0);
        Assert.IsNotNull(name);
    }
}

Contoh dunia nyata: Data pengujian berbasis lingkungan

Contoh ini menunjukkan atribut kustom yang menghasilkan data pengujian berdasarkan kerangka kerja target, pemfilteran berdasarkan sistem operasi:

using System.Globalization;
using System.Reflection;

[AttributeUsage(AttributeTargets.Method)]
public class TargetFrameworkDataAttribute : Attribute, ITestDataSource
{
    private readonly string[] _frameworks;

    public TargetFrameworkDataAttribute(params string[] frameworks)
    {
        _frameworks = frameworks;
    }

    public IEnumerable<object?[]> GetData(MethodInfo methodInfo)
    {
        bool isWindows = OperatingSystem.IsWindows();

        foreach (string framework in _frameworks)
        {
            // Skip .NET Framework on non-Windows platforms
            if (!isWindows && framework.StartsWith("net4", StringComparison.Ordinal))
            {
                continue;
            }

            yield return [framework];
        }
    }

    public string? GetDisplayName(MethodInfo methodInfo, object?[]? data)
    {
        return data is null
            ? null
            : string.Format(CultureInfo.CurrentCulture, "{0} ({1})", methodInfo.Name, data[0]);
    }
}

[TestClass]
public class CrossPlatformTests
{
    [TestMethod]
    [TargetFrameworkData("net48", "net8.0", "net9.0")]
    public void TestOnMultipleFrameworks(string targetFramework)
    {
        // Test runs once per applicable framework
        Assert.IsNotNull(targetFramework);
    }
}

Petunjuk / Saran

Untuk kasus sederhana di mana Anda hanya perlu menyesuaikan nama tampilan atau menambahkan metadata, pertimbangkan untuk menggunakan TestDataRow<T> dengan DynamicData alih-alih menerapkan ITestDataSource. Cadangkan implementasi kustom ITestDataSource untuk skenario yang memerlukan pemfilteran dinamis atau logika pembuatan data yang kompleks.

Strategi perumusan

Atribut pengujian berbasis data mendukung properti TestDataSourceUnfoldingStrategy, yang mengontrol bagaimana kasus pengujian muncul di Test Explorer dan hasil TRX. Properti ini juga menentukan apakah Anda dapat menjalankan kasus pengujian individual secara independen.

Fase penemuan dan eksekusi

MSTest memproses pengujian berbasis data dalam dua fase yang berbeda:

  • Fase penemuan: MSTest mengevaluasi semua atribut sumber data (DataRow, , DynamicDataITestDataSource) untuk menentukan daftar kasus pengujian. Evaluasi ini terjadi sebelum salah satu hook siklus hidup MSTest reguler dijalankan—AssemblyInitialize, ClassInitialize, dan metode penyiapan lainnya belum dieksekusi.
  • Fase eksekusi: MSTest menjalankan siklus hidup normal (inisialisasi perakitan, inisialisasi kelas, inisialisasi pengujian, metode pengujian, pembersihan) dan menjalankan setiap kasus pengujian dengan datanya.

Karena sumber data dievaluasi selama penemuan, kode pembuatan data Anda tidak dapat mengandalkan status apa pun yang disiapkan oleh AssemblyInitialize atau ClassInitialize. Jika sumber data Anda bergantung pada logika penyiapan (misalnya, membaca dari koneksi database yang diinisialisasi di ClassInitialize), evaluasi sumber data gagal selama penemuan.

Strategi yang tersedia

Strategi Perilaku
Auto (standar) MSTest menentukan strategi pengembangan terbaik.
Unfold Semua kasus pengujian diperluas dan ditampilkan secara individual.
Fold Semua kasus pengujian digabungkan menjadi satu simpul pengujian.

Tes terlipat vs. terbuka

Strategi pembukaan memengaruhi bagaimana hasil pengujian dilaporkan di Test Explorer dan output TRX.

  • Pengujian yang belum dilipat: Setiap baris data muncul sebagai entri pengujian independen terpisah di Test Explorer dan TRX. Anda dapat menjalankan, men-debug, atau memfilter kasus pengujian individual. Setiap entri memiliki status pass/fail sendiri.
  • Pengujian tergulung: Semua baris data muncul sebagai satu simpul pengujian di Test Explorer. Satu entri muncul di TRX, dengan beberapa hasil yang terkait dengan kasus pengujian tunggal tersebut. Anda tidak dapat menjalankan atau memfilter baris data individual secara independen.

Pengecualian selama penemuan menyebabkan pelipatan

Ketika MSTest mengevaluasi sumber data saat penemuan dan evaluasi melemparkan pengecualian, proses pengujian kembali ke keadaan terlipat terlepas dari strategi pembukaan yang dikonfigurasi. Karena kerangka kerja tidak dapat menghitung kasus pengujian individual, kerangka kerja mendaftarkan metode pengujian sebagai entri tunggal (terlipat).

Pada waktu eksekusi, MSTest mengevaluasi sumber data lagi sebagai bagian dari siklus hidup normal. Jika pengecualian disebabkan oleh status penyiapan yang hilang (misalnya, dependensi yang ClassInitialize sediakan), sumber data mungkin berhasil selama eksekusi karena proses siklus hidup sekarang telah berjalan.

Nota

Saat men-debug pengujian yang dilemparkan selama penemuan, Anda mungkin melihat pengecualian (misalnya, a NullReferenceException) sebelum pengujian dimulai. Pengecualian ini berasal dari evaluasi fase penemuan. Tekan Lanjutkan di debugger—pengujian kemudian dijalankan secara normal karena fase eksekusi menjalankan siklus hidup MSTest penuh, termasuk metode inisialisasi. Untuk detail selengkapnya, lihat microsoft/testfx#7774.

Kapan harus mengubah strategi

Untuk sebagian besar skenario, perilaku default Auto memberikan keseimbangan terbaik. Pertimbangkan untuk mengubah strategi pelaksanaan jika Anda memiliki persyaratan khusus.

  • Gunakan Fold jika sumber data Anda bergantung pada status runtime atau logika penyiapan yang tidak tersedia selama penemuan.
  • Gunakan Fold untuk sumber data non-deterministik yang mengembalikan nilai yang berbeda pada setiap evaluasi.
  • Gunakan Fold untuk mengurangi overhead saat performa menjadi perhatian dengan sejumlah besar kasus pengujian.

Contoh penggunaan

[TestClass]
public class UnfoldingExample
{
    [TestMethod(UnfoldingStrategy = TestDataSourceUnfoldingStrategy.Unfold)] // That's the default behavior
    [DataRow(1, "one")]
    [DataRow(2, "two")]
    [DataRow(3, "three")]
    public void TestMethodWithUnfolding(int value, string text)
    {
        // Each test case appears individually in Test Explorer
    }

    [TestMethod(UnfoldingStrategy = TestDataSourceUnfoldingStrategy.Fold)]
    [DataRow(1, "one")]
    [DataRow(2, "two")]
    [DataRow(3, "three")]
    public void TestMethodWithFolding(int value, string text)
    {
        // All test cases appear as a single collapsed node
    }
}

Praktik terbaik

  • Pilih atribut yang tepat: Gunakan DataRow untuk data sederhana dan sebaris, CombinatorialData untuk kombinasi lengkap input independen, dan DynamicData untuk data kompleks atau komputasi.
  • Beri nama kasus pengujian Anda: Gunakan DisplayName untuk membuat kegagalan pengujian lebih mudah diidentifikasi.
  • Jaga agar sumber data tetap dekat: Tentukan sumber data di kelas yang sama jika memungkinkan untuk pemeliharaan yang lebih baik.
  • Gunakan data yang bermakna: Pilih data pengujian yang menjalankan kasus tepi dan kondisi batas.

Lihat juga