TransactionScope ile Test Verilerini İzole Etmek

günü tarafından yayınlandı.

Entegrasyon testlerini yazarken yapmamız gereken ama canlı veritabanında çalışmadıkça aksattığımız o minik konu (veritabanını bulduğumuz gibi bırakmak) var ya işte bu yazıda onun kolay yolundan bahsedeceğiz.

Kodun en ufak scope’larına kadar giren unit testlerimizi yazdıktan sonra, happy path’i kontrol ettiğimiz entegrasyon testlerine sıra geldiğinde özellikle veritabanı entegrasyonunda eklediğimiz, güncellediğimiz hatta sildiğimiz verileri, test ortamını eski durumuna getirebilmek için silmemiz, güncellememiz hatta eklememiz gerekir. Bu rollback işlemlerini yazmak yerine System kütüphanesi içerisinde ki TransactionScope‘u kullanabiliriz.

TransactionScope test başlangıcında oluşturulup, bitiminde dispose edilerek kullanılabilir hatta NUnit test framework’un bize sağladığı ITestAction interface’i ile bunu sadece bir attribute çağrısına çevirebiliriz.

Aşağıdaki gibi kendi Isolated attribute’umuzu yazdıktan sonra…

using NUnit.Framework;
using System;
using System.Transactions;

namespace GigHub.IntegrationTests
{
  public class Isolated : Attribute, ITestAction
  {
    private TransactionScope _transactionScope;

    public ActionTargets Targets
    {
      get { return ActionTargets.Test; }
    }

    public void BeforeTest(TestDetails testDetails)
    {
      _transactionScope = new TransactionScope();
    }

    public void AfterTest(TestDetails testDetails)
    {
      _transactionScope.Dispose();
    }
  }
}

İzole etmek istediğimiz test case’lerde bu attribute’u kullanabiliriz.

[Test, Isolated]
public void Update_WhenCalled_ShouldUpdateTheGivenGig()
{ /* ... */ }
test, nunit, integration, c# Testing

Yazar: Olcay Bayram

Çeşitli teknoloji firmalarında çalışmış, yurtiçi ve yurtdışı farklı sektörlerden tecrübe edinmiş, derdini iki yabancı dilde anlatabilen bir yazılım uzmanı.