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.
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
Steve Smith. Test denetleyicileri (ASP.NET Çekirdek)
https://learn.microsoft.com/aspnet/core/mvc/controllers/testingSteve Smith. Tümleştirme testi (ASP.NET Çekirdek)
https://learn.microsoft.com/aspnet/core/test/integration-testsDotnet testi kullanarak .NET'te birim testi
https://learn.microsoft.com/dotnet/core/testing/unit-testing-with-dotnet-testxUnit.net. Resmi site.
https://xunit.net/Birim Testi Temel Bilgileri.
https://learn.microsoft.com/visualstudio/test/unit-test-basicsMoq. GitHub deposu.
https://github.com/moq/moqNUnit. Resmi site.
https://nunit.org/
Ç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:
{MicroserviceName} içinde yer alan yalnızca düz eski normal birim testleri olan birim testleri. UnitTests projeleri
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.
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.
Ş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
eShopOnContainers üzerinde Birim ve Tümleştirme testi
https://github.com/dotnet-architecture/eShopOnContainers/wiki/Unit-and-integration-testingeShopOnContainers üzerinde yük testi
https://github.com/dotnet-architecture/eShopOnContainers/wiki/Load-testing
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin