Share via


ASP.NET Core hizmetlerini ve web uygulamalarını test etme

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Denetleyiciler, herhangi bir ASP.NET Core API hizmetinin ve ASP.NET MVC Web uygulamasının merkezi bir parçasıdır. Bu nedenle, uygulamanız için amaçlanan şekilde davrandıklarına güvenmelisiniz. Otomatikleştirilmiş testler size bu güveni sağlayabilir ve üretime ulaşmadan önce hataları algılayabilir.

Denetleyicinin geçerli veya geçersiz girişlere göre nasıl davrandığını test etmeniz ve denetleyici yanıtlarını gerçekleştirdiği iş işleminin sonucuna göre test etmeniz gerekir. Ancak, mikro hizmetleriniz için şu tür testlere sahip olmanız gerekir:

  • Birim testleri. Bu testler, uygulamanın tek tek bileşenlerinin beklendiği gibi çalışmasını sağlar. Onaylar bileşen API'sini test eder.

  • Tümleştirme testleri. Bu testler, veritabanı gibi dış yapıtlarda bileşen etkileşimlerinin beklendiği gibi çalışmasını sağlar. Onaylar bileşen API'sini, kullanıcı arabirimini veya veritabanı G/Ç, günlüğe kaydetme gibi eylemlerin yan etkilerini test edebilir.

  • Her mikro hizmet için işlevsel testler. Bu testler, uygulamanın kullanıcı açısından beklendiği gibi çalışmasını sağlar.

  • Hizmet testleri. Bu testler, aynı anda birden çok hizmetin test edilmesi de dahil olmak üzere uçtan uca hizmet kullanım örneklerinin test edilmesini sağlar. Bu tür testler için önce ortamı hazırlamanız gerekir. Bu durumda, hizmetleri başlatmak anlamına gelir (örneğin, docker-compose up kullanarak).

ASP.NET Core Web API'leri için birim testleri uygulama

Birim testi, bir uygulamanın bir bölümünü altyapısından ve bağımlılıklarından yalıtılarak test etmeyi içerir. Test denetleyicisi mantığını birleştirdiğinizde, bağımlılıklarının veya çerçevenin davranışını değil, yalnızca tek bir eylemin veya yöntemin içeriği test edilir. Birim testleri, tümleştirme testinin amacı olan bileşenler arasındaki etkileşimdeki sorunları algılamaz.

Denetleyici eylemlerinizi birim testi yaparken yalnızca davranışlarına odaklandığınızdan emin olun. Denetleyici birim testi filtreler, yönlendirme veya model bağlama (istek verilerinin ViewModel veya DTO ile eşlenmesi) gibi şeylerden kaçınıyor. Yalnızca bir şeyi test etmeye odaklandıkları için, birim testlerinin yazılacak basit ve hızlı bir şekilde çalıştırılması kolaydır. İyi yazılmış bir birim testi kümesi çok fazla ek yük olmadan sık sık çalıştırılabilir.

Birim testleri xUnit.net, MSTest, Moq veya NUnit gibi test çerçevelerine göre uygulanır. eShopOnContainers örnek uygulaması için xUnit kullanıyoruz.

Bir Web API denetleyicisi için birim testi yazdığınızda, testin mümkün olduğunca hızlı çalışması için C# dilindeki yeni anahtar sözcüğü kullanarak doğrudan denetleyici sınıfı örneği oluşturursunuz. Aşağıdaki örnekte, Test çerçevesi olarak xUnit kullanılırken bunun nasıl gerçekleştirdiği gösterilmektedir.

[Fact]
public async Task Get_order_detail_success()
{
    //Arrange
    var fakeOrderId = "12";
    var fakeOrder = GetFakeOrder();

    //...

    //Act
    var orderController = new OrderController(
        _orderServiceMock.Object,
        _basketServiceMock.Object,
        _identityParserMock.Object);

    orderController.ControllerContext.HttpContext = _contextMock.Object;
    var actionResult = await orderController.Detail(fakeOrderId);

    //Assert
    var viewResult = Assert.IsType<ViewResult>(actionResult);
    Assert.IsAssignableFrom<Order>(viewResult.ViewData.Model);
}

Her mikro hizmet için tümleştirme ve işlevsel testler uygulama

Belirtildiği gibi, tümleştirme testlerinin ve işlevsel testlerin farklı amaçları ve hedefleri vardır. Ancak, ASP.NET Core denetleyicilerini test ederken her ikisini de uygulama şekliniz benzerdir, bu nedenle bu bölümde tümleştirme testlerine odaklanacağız.

Tümleştirme testi, bir uygulamanın bileşenlerinin bir araya getirildiğinde düzgün çalışmasını sağlar. ASP.NET Core, birim test çerçevelerini ve ağ yükü olmadan istekleri işlemek için kullanılabilecek yerleşik bir test web konağını kullanarak tümleştirme testini destekler.

Birim testlerinden farklı olarak tümleştirme testleri genellikle veritabanı, dosya sistemi, ağ kaynakları veya web istekleri ve yanıtları gibi uygulama altyapısıyla ilgili endişeleri kapsar. Birim testleri bu endişeler yerine sahte veya sahte nesneler kullanır. Ancak tümleştirme testlerinin amacı, sistemin bu sistemlerle beklendiği gibi çalıştığını onaylamaktır, bu nedenle tümleştirme testi için sahte veya sahte nesneler kullanmazsınız. Bunun yerine, diğer hizmetlerden veritabanı erişimi veya hizmet çağrısı gibi altyapıyı eklersiniz.

Tümleştirme testleri, birim testlerinden daha büyük kod segmentlerini kullandıklarından ve tümleştirme testleri altyapı öğelerine dayandığından, birim testlerinden daha yavaş olan siparişler olma eğilimindedir. Bu nedenle, yazıp çalıştırdığınız tümleştirme testlerinin sayısını sınırlamak iyi bir fikirdir.

ASP.NET Core, ağ yükü olmadan HTTP isteklerini işlemek için kullanılabilecek yerleşik bir test web konağı içerir. Bu da bu testleri gerçek bir web konağı kullandığınızdan daha hızlı çalıştırabileceğiniz anlamına gelir. Test web konağı (TestServer), NuGet bileşeninde Microsoft.AspNetCore.TestHost olarak kullanılabilir. Tümleştirme testi projelerine eklenebilir ve ASP.NET Core uygulamalarını barındırmak için kullanılabilir.

Aşağıdaki kodda görebileceğiniz gibi, ASP.NET Core denetleyicileri için tümleştirme testleri oluşturduğunuzda, test konağı aracılığıyla denetleyicilerin örneğini oluşturursunuz. Bu işlev bir HTTP isteğiyle karşılaştırılabilir, ancak daha hızlı çalışır.

public class PrimeWebDefaultRequestShould
{
    private readonly TestServer _server;
    private readonly HttpClient _client;

    public PrimeWebDefaultRequestShould()
    {
        // Arrange
        _server = new TestServer(new WebHostBuilder()
           .UseStartup<Startup>());
        _client = _server.CreateClient();
    }

    [Fact]
    public async Task ReturnHelloWorld()
    {
        // Act
        var response = await _client.GetAsync("/");
        response.EnsureSuccessStatusCode();
        var responseString = await response.Content.ReadAsStringAsync();
        // Assert
        Assert.Equal("Hello World!", responseString);
    }
}

Ek kaynaklar

Çok kapsayıcılı bir uygulamada hizmet testleri uygulama

Daha önce belirtildiği gibi, çok kapsayıcılı uygulamaları test ettiğinizde, tüm mikro hizmetlerin Docker konağı veya kapsayıcı kümesi içinde çalışması gerekir. Birkaç mikro hizmet içeren birden çok işlem içeren uçtan uca hizmet testleri, docker-compose up komutunu (veya düzenleyici kullanıyorsanız benzer bir mekanizmayı) çalıştırarak uygulamanın tamamını Docker konağına dağıtmanızı ve başlatmanızı gerektirir. Uygulamanın tamamı ve tüm hizmetleri çalıştırıldıktan sonra uçtan uca tümleştirme ve işlevsel testler yürütebilirsiniz.

Kullanabileceğiniz birkaç yaklaşım vardır. Uygulamayı çözüm düzeyinde dağıtmak için kullandığınız docker-compose.yml dosyasında, giriş noktasını dotnet testini kullanacak şekilde genişletebilirsiniz. Hedeflediğiniz görüntüde testlerinizi çalıştıracak başka bir oluşturma dosyası da kullanabilirsiniz. Kapsayıcılardaki mikro hizmetlerinizi ve veritabanlarınızı içeren tümleştirme testleri için başka bir oluşturma dosyası kullanarak, testleri çalıştırmadan önce ilgili verilerin her zaman özgün durumuna sıfırlandığından emin olabilirsiniz.

Oluşturma uygulaması çalışır duruma geçtikten sonra, Visual Studio çalıştırıyorsanız kesme noktalarından ve özel durumlardan yararlanabilirsiniz. İsterseniz Tümleştirme testlerini Azure DevOps Services'teki CI işlem hattınızda veya Docker kapsayıcılarını destekleyen başka bir CI/CD sisteminde otomatik olarak çalıştırabilirsiniz.

eShopOnContainers'da test etme

Başvuru uygulaması (eShopOnContainers) testleri yakın zamanda yeniden yapılandırıldı ve şimdi dört kategori var:

  1. {MicroserviceName} içinde yer alan yalnızca düz eski normal birim testleri olan birim testleri. UnitTests projeleri

  2. Mikro hizmet işlevsel/tümleştirme testleri, her mikro hizmetin altyapısını içeren ancak diğerlerinden yalıtılmış olan ve {MicroserviceName} içinde yer alan test çalışmalarıdır. FunctionalTests projeleri.

  3. Birkaç mikro hizmet uygulayan test çalışmalarıyla mikro hizmetler tümleştirmesine odaklanan uygulama işlevsel/tümleştirme testleri. Bu testler Application.FunctionalTests projesinde bulunur.

Birim ve tümleştirme testleri mikro hizmet projesindeki bir test klasöründe düzenlenirken, uygulama ve yük testleri Şekil 6-25'te gösterildiği gibi kök klasör altında ayrı olarak yönetilir.

Screenshot of VS pointing out some of the test projects in the solution.

Şekil 6-25. eShopOnContainers'da test klasörü yapısı

Mikro hizmet ve Uygulama işlev/tümleştirme testleri, normal test çalıştırıcısı kullanılarak Visual Studio'dan çalıştırılır, ancak önce çözüm test klasöründe bulunan bir dizi docker-compose dosyasıyla gerekli altyapı hizmetlerini başlatmanız gerekir:

docker-compose-test.yml

version: '3.4'

services:
  redis.data:
    image: redis:alpine
  rabbitmq:
    image: rabbitmq:3-management-alpine
  sqldata:
    image: mcr.microsoft.com/mssql/server:2017-latest
  nosqldata:
    image: mongo

docker-compose-test.override.yml

version: '3.4'

services:
  redis.data:
    ports:
      - "6379:6379"
  rabbitmq:
    ports:
      - "15672:15672"
      - "5672:5672"
  sqldata:
    environment:
      - SA_PASSWORD=Pass@word
      - ACCEPT_EULA=Y
    ports:
      - "5433:1433"
  nosqldata:
    ports:
      - "27017:27017"

Bu nedenle, işlev/tümleştirme testlerini çalıştırmak için önce çözüm testi klasöründen şu komutu çalıştırmanız gerekir:

docker-compose -f docker-compose-test.yml -f docker-compose-test.override.yml up

Gördüğünüz gibi, bu docker-compose dosyaları yalnızca Redis, RabbitMQ, SQL Server ve MongoDB mikro hizmetlerini başlatır.

Ek kaynaklar