Share via


Veri temelli birim testi oluşturma

Yönetilen kod için Microsoft birim testi çerçevesini (MSTest) kullanarak bir veri kaynağından değer alacak bir birim testi yöntemi ayarlayabilirsiniz. yöntemi, veri kaynağındaki her satır için ardışık olarak çalıştırılır ve bu sayede tek bir yöntem kullanarak çeşitli girişleri test etmek kolaylaşır.

Veri temelli birim testi aşağıdaki türlerden herhangi birini kullanabilir:

  • özniteliğini DataRow kullanarak satır içi veriler
  • özniteliğini DynamicData kullanan üye verileri
  • özniteliğini kullanan iyi bilinen bir kaynak sağlayıcısından DataSource

Test altındaki yöntem

Örneğin, aşağıdakilere sahip olduğunuzu varsayalım:

  1. Farklı hesap türleri için işlemleri kabul eden ve işleyen adlı MyBank bir çözüm.

  2. hesapları için işlemleri yöneten adlı BankDb bir projeMyBank.

  3. Herhangi bir işlemin bankaya avantajlı olmasını sağlamak için matematik işlevlerini gerçekleştiren projede BankDb adlı Maths bir sınıf.

  4. Bileşenin davranışını BankDb test etmek için çağrılan BankDbTests birim testi projesi.

  5. Sınıfının davranışını Maths doğrulamak için çağrılan MathsTests bir birim testi sınıfı.

içinde bir döngü kullanarak iki tamsayı ekleyen bir yöntemi Maths test edeceğiz:

public int AddIntegers(int first, int second)
{
    int sum = first;
    for (int i = 0; i < second; i++)
    {
        sum += 1;
    }

    return sum;
}

Test test yöntemi

Satır içi veri temelli test

Satır içi testlerde MSTest, veri temelli test tarafından kullanılan değerleri belirtmek için kullanır DataRow . Bu örnekteki test, her veri satırı için art arda çalıştırılır.

[TestMethod]
[DataRow(1, 1, 2)]
[DataRow(2, 2, 4)]
[DataRow(3, 3, 6)]
[DataRow(0, 0, 1)] // The test run with this row fails
public void AddIntegers_FromDataRowTest(int x, int y, int expected)
{
    var target = new Maths();
    int actual = target.AddIntegers(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

Üye veri temelli test

MSTest, veri temelli test tarafından kullanılan verileri sağlayacak üyenin adını, türünü (özellik, varsayılan veya yöntem) ve tanımlama türünü (varsayılan olarak geçerli tür kullanılır) belirtmek için özniteliğini kullanır DynamicData .

public static IEnumerable<object[]> AdditionData
{
    get
    {
        return new[]
        { 
            new object[] { 1, 1, 2 },
            new object[] { 2, 2, 4 },
            new object[] { 3, 3, 6 },
            new object[] { 0, 0, 1 }, // The test run with this row fails
        };
    }
}

[TestMethod]
[DynamicData(nameof(AdditionData))]
public void AddIntegers_FromDynamicDataTest(int x, int y, int expected)
{
    var target = new Maths();
    int actual = target.AddIntegers(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

Özniteliğin özelliğini DynamicData kullanarak DynamicDataDisplayName varsayılan olarak oluşturulan görünen adı geçersiz kılmak da mümkündür. Görünen ad yöntemi imzası olmalıdır public static string ve türün ilki MethodInfo ve ikinci object[]türü olan iki parametreyi kabul etmelidir.

public static string GetCustomDynamicDataDisplayName(MethodInfo methodInfo, object[] data)
{
    return string.Format("DynamicDataTestMethod {0} with {1} parameters", methodInfo.Name, data.Length);
}

[DynamicData(nameof(AdditionData), DynamicDataDisplayName = nameof(GetCustomDynamicDataDisplayName))]

Kaynak sağlayıcı veri temelli test

Veri kaynağı temelli birim testi oluşturmak aşağıdaki adımları içerir:

  1. Test yönteminde kullandığınız değerleri içeren bir veri kaynağı oluşturun. Veri kaynağı, testi çalıştıran makinede kayıtlı herhangi bir tür olabilir.

  2. Test sınıfına türünde TestContext bir ortak TestContext özellik ekleyin.

  3. Birim testi yöntemi oluşturma

  4. Buna bir DataSourceAttribute öznitelik ekleyin.

  5. Testte DataRow kullandığınız değerleri almak için dizin oluşturucu özelliğini kullanın.

Veri kaynağı oluşturma

yöntemini test AddIntegers etmek için, parametreler için bir değer aralığını ve döndürülmesini beklediğiniz toplamı belirten bir veri kaynağı oluşturun. Bu örnekte, adlı MathsData bir Sql Compact veritabanı ve aşağıdaki sütun adlarını ve değerlerini içeren adlı AddIntegersData bir tablo oluşturacağız

FirstNumber İkinci Sayı Sum
0 1 1
1 Kategori 1 2
2 -3 -1

Test sınıfına TestContext ekleme

Birim testi çerçevesi, veri temelli test TestContext için veri kaynağı bilgilerini depolamak için bir nesne oluşturur. Çerçeve daha sonra bu nesneyi oluşturduğunuz özelliğin TestContext değeri olarak ayarlar.

public TestContext TestContext { get; set; }

Test yönteminizde, verilere dizininin DataRow dizin oluşturucu özelliği aracılığıyla erişebilirsiniz TestContext.

Not

.NET Core, DataSource özniteliğini desteklemez. Bir .NET Core, UWP veya WinUI birim testi projesinde test verilerine bu şekilde erişmeye çalışırsanız, "'TestContext' 'DataRow' için tanım içermiyor ve 'TestContext' türünün ilk bağımsız değişkenini kabul eden 'DataRow' erişilebilir bir uzantı yöntemi bulunamadı (kullanma yönergesi veya derleme başvurusu eksik mi?)" gibi bir hata görürsünüz.

Test yöntemini yazma

için AddIntegers test yöntemi oldukça basittir. Veri kaynağındaki her satır için FirstNumber ve SecondNumber sütun değerlerini parametre olarak çağırın AddIntegers ve Sum sütun değeriyle sonuç değerini doğrulayın:

[TestMethod]
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
public void AddIntegers_FromDataSourceTest()
{
    var target = new Maths();

    // Access the data
    int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
    int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
    int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
    int actual = target.AddIntegers(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

DataSourceAttribute'u belirtme

özniteliği, DataSource veri kaynağı için bağlantı dizesi ve test yönteminde kullandığınız tablonun adını belirtir. bağlantı dizesi içindeki tam bilgiler, kullandığınız veri kaynağı türüne bağlı olarak farklılık gösterir. Bu örnekte bir SqlServerCe veritabanı kullandık.

[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]

DataSource özniteliği üç oluşturucuya sahiptir.

[DataSource(dataSourceSettingName)]

Tek parametreli bir oluşturucu, çözüm için app.config dosyasında depolanan bağlantı bilgilerini kullanır. dataSource Ayarlar Name, bağlantı bilgilerini belirten yapılandırma dosyasındaki Xml öğesinin adıdır.

App.config dosyası kullanmak, birim testinin kendisinde değişiklik yapmadan veri kaynağının konumunu değiştirmenize olanak tanır. app.config dosyası oluşturma ve kullanma hakkında bilgi için bkz. İzlenecek Yol: Veri Kaynağı Tanımlamak için Yapılandırma Dosyası Kullanma

[DataSource(connectionString, tableName)]

DataSource İki parametresi olan oluşturucu, veri kaynağının bağlantı dizesi ve test yönteminin verilerini içeren tablonun adını belirtir.

bağlantı dizesi, veri kaynağının türüne bağlıdır, ancak veri sağlayıcısının sabit adını belirten bir Sağlayıcı öğesi içermelidir.

[DataSource(
    dataProvider,
    connectionString,
    tableName,
    dataAccessMethod
    )]

Verilere erişmek için TestContext.DataRow kullanma

Tablodaki AddIntegersData verilere erişmek için dizin oluşturucuyu TestContext.DataRow kullanın. DataRow bir DataRow nesnedir, bu nedenle sütun değerlerini dizine veya sütun adlarına göre alın. Değerler nesne olarak döndürüldüğünden, bunları uygun türe dönüştürün:

int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);

Testi çalıştırma ve sonuçları görüntüleme

Bir test yöntemi yazmayı bitirdiğinizde test projesini oluşturun. Test yöntemi, Test Gezgini'nde Testleri Çalıştırma grubu içinde görünür. Testlerinizi çalıştırır, yazar ve yeniden çalıştırırken, Test Gezgini sonuçları Başarısız Testler, Geçirilen Testler ve Testleri Çalıştırmama gruplarında görüntüler. Tüm testlerinizi çalıştırmak için Tümünü Çalıştır'ı veya çalıştırılacak testlerin bir alt kümesini seçmek için Çalıştır'ı seçebilirsiniz.

Test Gezgini'nin üst kısmındaki test sonuçları çubuğu, test çalıştırmaları sırasında animasyonludur. Test çalıştırmasının sonunda, tüm testler başarılı olursa çubuk yeşil veya testlerden herhangi biri başarısız olursa kırmızı olur. Test gezgini penceresinin alt kısmındaki ayrıntılar bölmesinde test çalıştırmasının özeti görüntülenir. Alt bölmede bu testin ayrıntılarını görüntülemek için bir test seçin.

Not

Her veri satırı için bir sonuç ve ayrıca bir özet sonuç vardır. Test her veri satırında geçirildiyse özet çalıştırması Geçirildi olarak gösterilir. Test herhangi bir veri satırında başarısız olduysa özet çalıştırması Başarısız olarak gösterilir.

Örneğimizde herhangi bir AddIntegers_FromDataRowTestveya AddIntegers_FromDataSourceTestAddIntegers_FromDynamicDataTest yöntemini çalıştırdıysanız, sonuç çubuğu kırmızıya döner ve test yöntemi Başarısız Testler'e taşınır. Veri kaynağından yinelenen yöntemlerden herhangi biri başarısız olursa veri temelli test başarısız olur. Test Gezgini penceresinde başarısız bir veri temelli test seçtiğinizde, ayrıntılar bölmesi veri satırı dizini tarafından tanımlanan her yinelemenin sonuçlarını görüntüler. Örneğimizde algoritmanın AddIntegers negatif değerleri doğru işlemediği görülüyor.

Test altındaki yöntem düzeltildiğinde ve test yeniden çalıştırıldığında, sonuç çubuğu yeşile döner ve test yöntemi Başarılı Test grubuna taşınır.