EF Core kullanan kodu test etme
Bir veritabanına erişen kodu test etmek için şu iki işlemden birini gerekir:
- Sorguları ve güncelleştirmeleri üretimde kullanılan aynı veritabanı sisteminde çalıştırma.
- Veritabanı sistemini yönetmesi daha kolay olan başka bir sistemle ilgili sorgular ve güncelleştirmeler çalıştırma.
- Veritabanı kullanmaktan kaçınmak için test çiftlerini veya başka bir mekanizmayı kullanma.
Bu belgede, bu seçimlerin her birsinde yer alan takaslar özetlenmiş ve EF Core yaklaşımda nasıl kullanıLLKlı olduğu açık bir şekilde açık ve açık bir şekilde açık bir şekilde kullanılmaktadır.
İpucu
Burada EF Core kavramlarını gösteren kod için örnek test etme örneklerine bakın.
Tüm veritabanı sağlayıcıları eşit değildir
Temel alınan veritabanı sisteminin her EF Core soyutlama için tasarlanmamalıdır. Bunun EF Core, herhangi bir veritabanı sistemiyle kullanılan yaygın bir desen ve kavram kümesidir. EF Core sağlayıcılar daha sonra bu ortak çerçeve üzerinde veritabanına özgü davranışı ve işlevselliği katmanlar. Bu, her veritabanı sisteminin diğer veritabanı sistemleriyle uygun olduğunda ortaklığı korurken en iyi şekilde yaptığı şeyi yapmalarını sağlar.
Temelde bu, veritabanı sağlayıcısını değiştirmenin davranış EF Core değişeceği ve davranış farklılıkları açıkça hesaba çıkmadıkça uygulamanın düzgün çalışması beklenmiyor anlamına gelir. Ancak çoğu durumda ilişkisel veritabanları arasında yüksek bir ortaklık derecesi olduğundan bunu yapmak işe gelir. Bu iyi ve kötüdür. İyi çünkü veritabanı sistemleri arasında geçiş yapmak görece kolay olabilir. Uygulama yeni veritabanı sisteminde tam olarak test edilmemişse yanlış bir güvenlik algısı vereliktir.
Yaklaşım 1: Üretim veritabanı sistemi
Önceki bölümde açıklandığı gibi, üretimde çalışanları test etme konusunda emin olmak için tek yol aynı veritabanı sistemini kullanmaktır. Örneğin, dağıtılan uygulama SQL Azure kullanıyorsa, test aynı zamanda sanal SQL Azure.
Ancak, her geliştiricinin kod üzerinde etkin SQL Azure sırasında test çalıştırması hem yavaş hem de pahalı olabilir. Bu yaklaşımların tamamında yer alan temel takası göstermektedir: Test verimliliğini artırmak için üretim veritabanı sisteminden ne zaman sapmak uygun olur?
Neyse ki bu durumda yanıt oldukça kolaydır: geliştirici testi için yerel veya SQL Server şirket içi hizmet kullanın. SQL Azure ve SQL Server son derece benzerdir, bu nedenle SQL Server test etmek genellikle makul bir takastır. Ancak üretime başlamadan önce testlerin SQL Azure çalıştırmak akıllıca olacaktır.
Yerel veritabanı
Tüm büyük veritabanı sistemleri, yerel test için bir tür "Developer Edition" içerir. SQL Server LocalDB adlı bir özelliği de vardır. LocalDB'nin birincil avantajı, veritabanı örneğini isteğe bağlı olarak oluşturmasıdır. Bu, testleri çalıştırmamanıza rağmen makineniz üzerinde bir veritabanı hizmetinin çalıştırılmasından kaçınıyor.
LocalDB sorunları olmadan değildir:
- SQL Server Developer Edition'ın yaptığı her şeyi desteklemez.
- Linux'ta kullanılamaz.
- Hizmet çalıştırılana kadar ilk test çalıştırması gecikmeye neden olabilir.
Kişisel olarak, geliştirme makinemde çalışan bir veritabanı hizmetiyle ilgili bir sorun bula ilgili hiçbir zaman bir sorun oluşturmadım ve bunun yerine genellikle Developer Edition'ın kullanılması önerilir. Ancak LocalDB, özellikle daha az güçlü geliştirme makinelerinde bazı kişiler için uygun olabilir.
Docker SQL Server (veya benzeri) bir veritabanı sisteminde (veya başka bir veritabanı sisteminde) çalışma, veritabanı sisteminin doğrudan geliştirme makineniz üzerinde çalıştırılamaması için bir diğer yol olabilir.
Yaklaşım 2: SQLite
EF Core, SQL Server yerel bir örnek üzerinde çalıştırarak SQL Server test eder. Bu testler hızlı bir makinede birkaç dakika içinde on binlerce sorgu çalıştırıyor. Bu, gerçek veritabanı sisteminin iyi bir çözüm olduğunu gösterir. Testleri hızlı bir şekilde çalıştırmanın tek yolu hafif veritabanı kullanmaktır.
Burada da ifade etmek gerekirse, herhangi bir nedenle üretim veritabanı sisteminize yakın bir sistemde test çalıştırasanız ne olur? Bir sonraki en iyi seçenek, benzer işlevlere sahip bir şey kullanmaktır. Bu, genellikle SQLite'ın bariz bir seçim olduğu başka bir ilişkisel veritabanı anlamına gelir.
SQLite iyi bir seçenektir çünkü:
- Uygulamanız ile işlem içinde çalışır ve bu nedenle düşük ek yüke sahiptir.
- Veritabanları için basit, otomatik olarak oluşturulan dosyalar kullanır ve bu nedenle veritabanı yönetimi gerektirmez.
- Dosya oluşturmanın bile önüne geçen bir bellek içinde modu vardır.
Ancak şunu unutmayın:
- SQLite kaçınılmaz olarak üretim veritabanı sisteminizin yaptığı her şeyi desteklemez.
- SQLite, bazı sorgular için üretim veritabanı sisteminize göre farklı davranır.
Bu nedenle, bazı testler için SQLite kullanıyorsanız, gerçek veritabanı sisteminize karşı da test sınayın.
Daha fazla bilgi için bkz. SQLite EF Core test etme.
Yaklaşım 3: EF Core bellek içinde veritabanı
EF Core kendi içinde test etmek için kullanabileceğimiz bir bellek içi veritabanı EF Core gelir. Bu veritabanı, genel olarak tarafından kullanan uygulamaları test etmek için EF Core. Özellikle:
- İlişkisel veritabanı değildir.
- İşlemleri desteklemez.
- Ham sorgular SQL çalıştıramaz.
- Performans için en iyi duruma getirilmiş değildir.
Veritabanının testle ilgisiz olduğu EF Core iç içleri test etme sırasında bunların hiçbiri çok önemli değildir. Öte yandan, bu şeyler, EF Core kullanan bir uygulamayı test etme sırasında önemli EF Core.
Birim testi
Veritabanından bazı verileri kullanması gerektiren ancak veritabanı etkileşimlerini doğal olarak test etmeyen bir iş mantığı parçasını test etme düşünün. Seçeneklerden biri sahte veya sahte gibi bir test çifti kullanmak.
Test double'larını şirket içi test etme amacıyla EF Core. Ancak, hiçbir zaman DbContext veya IQueryable'ın sahtesini yapmaya çalışmayiz. Bunu yapmak zor, hantal ve kırılgandır. Bunu yapma.
Bunun yerine DbContext kullanan bir şeyi birim testi sırasında EF bellek içinde veritabanı kullanırsınız. Bu durumda, test veritabanı davranışına bağımlı olduğundan EF bellek içinde veritabanının kullanımı uygundur. Gerçek veritabanı sorgularını veya güncelleştirmelerini test etmek için bunu yapma.
Örnek EF Core, EF bellek içinde veritabanının yanı sıra SQLite ve SQL Server testlerini gösterir.