NoSQL veritabanlarını araştırıyorum ve birim testi ile ilgili bir sorum var. İş mantığını test etmek için uygun yöntem nedir? Bir NoSQL veritabanı nasıl alay ediyor?NoSQL - Birim testi için veritabanı nasıl alay edilir?
cevap
İş mantığınız veritabanına doğrudan dokunmamalı, bir veritabanı erişim katmanından geçmelidir. Bu, birim testi için ara katmanla dalga geçmenize izin verir. Bunu yapmak için bağımlılık enjeksiyonunu ve alayları kullanabilirsiniz. Bu şeylerin her ikisinde de size yardımcı olabilecek çerçeveler var, ancak el ile de yapabilirsiniz. İşte bir örnek: Gördüğünüz gibi
public class DBDataProvider: IDataProvider
{
public string getData()
{
//SQL to get data from actual database.
}
}
, bu iş katmanı için veri sağlar şey için bir arabirim uygulayan:
bir DAL olduğunu varsayalım. Böyle görünebilir:
public Interface IDataProvider
{
String getData();
}
İşiniz tabaka şöyle görünebilir: Üretim kodunda Şimdi
public BusinessClass
{
private IDataProvider dataProvider;
public BusinessClass()
{
dataProvider = new DBDataProvider();
}
public BusinessClass(IDataProvider provider)
{
dataProvider = provider;
}
public void doBusinessStuff()
{
dataProvider.getData();
//Do something with data.
}
}
, hangi irade, varsayılan kurucuyu kullanarak iş sınıfını yapacak sınıfınızı otomatik olarak DB ile bağlantı kurar. Ancak, belirttiğimiz bir IDataProvider ile bir BusinessClass oluşturabileceğimize dikkat edin. Bu nedenle, sadece test için bir "sahte" veri sağlayıcı yapabilirsiniz: En testinde Şimdi
public class MockDataProvider: IDataProvider
{
public string getData()
{
//return some expected result that you can control, without doing a DB call.
}
}
, yeni bir MockDataProvider oluşturmak ve BUSINESSCLASS için yapıcı içine geçebilir. İş sınıfınız artık gerçek DB yerine sahte veri sağlayıcınızı kullanacaktır.
Her şeyi el ile yaptım, ancak bunun nasıl çalıştığı hakkında bir fikir veriyor. Gerçek hayatta, bu kod bir demet yazmak için alay ve bağımlılık enjeksiyon çerçeveleri kullanabilirsiniz.
Aynı şekilde herhangi bir bağımlılık ile dalga geçiyorsunuz. Uygulama ayrıntılarının soyutlanabileceği, daha sonra bu sözleşmeyle alay edilecek güzel ve düzgün bir sözleşme yazınız. Tipik olarak bu, Veri Erişim Katmanı kullanılarak sözleşme (ler) olarak yapılır.
Gerçek uygulama ayrıntılarına girmeden, test etmek istediğiniz yöntemde bir sorgunun olduğunu varsayalım: (not, bu kodu bir ravenDB örneğinden kopyaladım, ama ravenDB hakkında 0 biliyorum, bu yüzden derlemeyebilir)
public void SomeMethod()
{
var name = "Hello";
var motto = "World";
using (var docStore = new DocumentStore("localhost", 8080).Initialize())
using (var session = documentStore.OpenSession()){
session.Store(new Company { Name = name, Motto = motto });;
session.SaveChanges();
}
}
başka sınıfa içine bu mantığı ayırmak eğer, Şimdi 8080 tarihinde yerel sunucuda bir db gerektirdiğinden/testi alay etmek oldukça zor olacak
: enjeksiyon için
public class AwesomeDAL
public virtual void AddCompany(string name, string motto){
using (var docStore = new DocumentStore("localhost", 8080).Initialize())
using (var session = documentStore.OpenSession()){
session.Store(new Company { Name = name, Motto = motto });;
session.SaveChanges();
}
}
ve izin Bağımlılık (AwesomeDal):
public class ClassBeingTested
{
public AwesomeDal DAL { get; set; }
public ClassBeingTested() : this(new AwesomeDal()){}
public ClassBeingTested(AwesomeDal dal)
{
this.DAL = dal;
}
public void SomeMethod()
{
var name = "Hello";
var motto = "World";
this.DAL.AddCompany(name, motto);
}
}
Şimdi BL kodunu da izole olarak test edebilirsiniz. Ya da veri erişim katmanının soyutlandığından ve uygulamanızın Moq veya RhinoMocks
Bir örneğe bağlantınız var mı? Aramayı denedim ama fazla bulmadım. Cevap için teşekkürler. – mtm927
Bunu böyle yapmayın, RavenDB.Embedded kullanın ve InMemory'u çalıştırın - bkz. Http://stackoverflow.com/questions/7533435/unit-testing-ravendb. Ayrıca, RavenDB ile DAL/BLL katmanlarını kullanmayın, çok anlamlı değil. – synhershko
gibi bir çerçeveyle kolayca anlaşılabilir olması için veritabanı istisnalarını veya test etmeniz gereken başka bir şey simüle edebilirsiniz. Alternatif bir çözüm önereyim: Gerçek bir gelişim veritabanı kullanın! Hiçbir şey gerçek olanın daha gerçekçi bir şey değildir. Doğrudan test ederseniz, en azından kodunuzun gerçekten çalışacağını biliyorsunuzdur.
Veritabanınızı kolayca soyutlayabilirseniz, bunu yapmanızı öneririm.
Ayrıca test için bir bellek içi DB'yi de düşünebilirsiniz. –
Sorun, NoSQL teknolojisidir. Birçoğu bellek içi yeteneklere sahip, diğerinin kendi numaraları var. Grafik DB, doc DB'den farklıdır ve tıpkı ikisi de bir RDBMS'den farklıdır. – synhershko
@synhershko - MongoDB – mtm927