এটি এমন একটি বিষয় যা আমি খুব আগ্রহী There এমন অনেক পিউরিস্ট রয়েছে যারা বলে যে আপনার EF এবং NHibernate এর মতো প্রযুক্তি পরীক্ষা করা উচিত নয়। তারা ঠিক আছে, তারা ইতিমধ্যে খুব কঠোরভাবে পরীক্ষা করা হয়েছে এবং পূর্ববর্তী উত্তর হিসাবে বলা হয়েছে যে আপনার নিজের কী নয় তা পরীক্ষার জন্য প্রচুর পরিমাণে ব্যয় করা প্রায়শই অর্থহীন।
তবে, আপনি নীচে ডাটাবেস নিজস্ব! এখানেই আমার মতে এই পন্থাটি ভেঙে যায়, আপনার পরীক্ষা করার দরকার নেই যে EF / NH তাদের কাজগুলি সঠিকভাবে করছে। আপনার ম্যাপিং / প্রয়োগগুলি আপনার ডাটাবেসের সাথে কাজ করছে তা পরীক্ষা করা দরকার। আমার মতে এটি আপনি পরীক্ষা করতে পারেন এমন একটি সিস্টেমের অন্যতম গুরুত্বপূর্ণ অঙ্গ।
কড়া কথায় বলতে গেলে আমরা ইউনিট পরীক্ষার ডোমেন থেকে বের হয়ে ইন্টিগ্রেশন টেস্টিংয়ে চলেছি কিন্তু নীতিগুলি একই রয়েছে remain
আপনাকে প্রথমে যা করতে হবে তা হ'ল আপনার ডালকে উপহাস করতে সক্ষম হওয়া যাতে আপনার বিএলএল ইএফ এবং এসকিউএল-এর স্বাধীনভাবে পরীক্ষা করা যায়। এগুলি আপনার ইউনিট পরীক্ষা। আপনার ডাল প্রমাণ করার জন্য আপনার নিজের ইন্টিগ্রেশন টেস্টগুলি ডিজাইন করতে হবে, আমার মতে এগুলি যতটা গুরুত্বপূর্ণ।
এখানে কয়েকটি বিষয় বিবেচনা করতে হবে:
- আপনার ডাটাবেস প্রতিটি পরীক্ষার সাথে একটি পরিচিত অবস্থায় থাকা প্রয়োজন। বেশিরভাগ সিস্টেমই হয় ব্যাকআপ ব্যবহার করে বা এর জন্য স্ক্রিপ্ট তৈরি করে।
- প্রতিটি পরীক্ষা অবশ্যই পুনরাবৃত্তিযোগ্য
- প্রতিটি পরীক্ষা অবশ্যই পারমাণবিক হতে হবে
আপনার ডাটাবেস সেট আপ করার জন্য দুটি প্রধান পন্থা রয়েছে, প্রথমটি হ'ল ইউনিটেষ্ট টেস্ট চালনা ডিবি স্ক্রিপ্ট। এটি নিশ্চিত করে যে আপনার ইউনিট পরীক্ষার ডাটাবেস সবসময় প্রতিটি পরীক্ষার শুরুতে একই অবস্থায় থাকবে (আপনি এটি পুনরায় সেট করতে পারেন বা এটি নিশ্চিত করতে প্রতিটি পরীক্ষা লেনদেনে চালাতে পারেন)।
আপনার অন্য বিকল্পটি আমি যা করি তা প্রতিটি স্বতন্ত্র পরীক্ষার জন্য নির্দিষ্ট সেটআপগুলি চালান। আমি বিশ্বাস করি যে এটি দুটি প্রধান কারণে সেরা পন্থা:
- আপনার ডাটাবেসটি সহজ, প্রতিটি পরীক্ষার জন্য আপনার পুরো স্কিমার প্রয়োজন হয় না
- প্রতিটি পরীক্ষাটি নিরাপদ, যদি আপনি আপনার তৈরি স্ক্রিপ্টের একটি মান পরিবর্তন করেন তবে এটি কয়েক ডজন অন্যান্য পরীক্ষাকে অবৈধ করে না।
দুর্ভাগ্যক্রমে আপনার আপস এখানে গতি। এই সমস্ত পরীক্ষা চালাতে, এই সমস্ত সেটআপ চালাতে / স্ক্র্যাপগুলি ছিঁড়ে ফেলতে সময় লাগে।
একটি চূড়ান্ত বিষয়, আপনার ওআরএম পরীক্ষার জন্য এত বড় এসকিউএল লিখতে খুব কঠোর পরিশ্রম হতে পারে। আমি এখানে খুব বাজে দৃষ্টিভঙ্গি গ্রহণ করি (এখানকার পিউরিস্টরা আমার সাথে একমত নন) আমি আমার পরীক্ষা তৈরি করতে আমার ওআরএম ব্যবহার করি! আমার সিস্টেমে প্রতিটি ডএল পরীক্ষার জন্য আলাদা স্ক্রিপ্ট না করে আমার একটি পরীক্ষা সেটআপ পর্ব রয়েছে যা বস্তুগুলি তৈরি করে, তাদের প্রসঙ্গে সংযুক্ত করে সংরক্ষণ করে। আমি তখন আমার পরীক্ষা চালাতে।
এটি আদর্শ সমাধান থেকে অনেক দূরে তবে বাস্তবে আমি দেখতে পেলাম যে এটি পরিচালনা করা খুব সহজ (বিশেষত যখন আপনার কয়েক হাজার পরীক্ষা রয়েছে), অন্যথায় আপনি প্রচুর স্ক্রিপ্ট তৈরি করছেন। বিশুদ্ধতার উপর ব্যবহারিকতা।
আমি নিঃসন্দেহে কয়েক বছর (মাস / দিন) এই উত্তরটি ফিরে ফিরে দেখব এবং আমার দৃষ্টিভঙ্গি পরিবর্তিত হওয়ায় নিজের সাথে একমত নই - তবে এটি আমার বর্তমান পদ্ধতি is
এটির উপরে আমি যা বলেছি সবগুলি চেষ্টা করার চেষ্টা করা এবং এটি আমার সাধারণ ডিবি ইন্টিগ্রেশন পরীক্ষা:
[Test]
public void LoadUser()
{
this.RunTest(session => // the NH/EF session to attach the objects to
{
var user = new UserAccount("Mr", "Joe", "Bloggs");
session.Save(user);
return user.UserID;
}, id => // the ID of the entity we need to load
{
var user = LoadMyUser(id); // load the entity
Assert.AreEqual("Mr", user.Title); // test your properties
Assert.AreEqual("Joe", user.Firstname);
Assert.AreEqual("Bloggs", user.Lastname);
}
}
এখানে লক্ষ্য করার মূল বিষয়টি হ'ল দুটি লুপের সেশনগুলি সম্পূর্ণ স্বাধীন। রানটেষ্টের প্রয়োগের ক্ষেত্রে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে প্রসঙ্গটি প্রতিশ্রুতিবদ্ধ এবং ধ্বংস হয়েছে এবং আপনার ডেটা কেবলমাত্র দ্বিতীয় অংশের জন্য আপনার ডাটাবেস থেকে আসতে পারে।
13/10/2014 সম্পাদনা করুন
আমি বলেছিলাম যে আমি সম্ভবত আগামী মাসগুলিতে এই মডেলটি সংশোধন করব। আমি যখন উচ্চতরভাবে আমার পক্ষে মতামতটির পক্ষে দাঁড়িয়েছি তখন আমি আমার পরীক্ষার ব্যবস্থাটি কিছুটা আপডেট করেছি। আমি এখন টেস্টসেটআপ এবং টেস্টটিয়ারডাউনে সত্ত্বা তৈরি করার ঝোঁক।
[SetUp]
public void Setup()
{
this.SetupTest(session => // the NH/EF session to attach the objects to
{
var user = new UserAccount("Mr", "Joe", "Bloggs");
session.Save(user);
this.UserID = user.UserID;
});
}
[TearDown]
public void TearDown()
{
this.TearDownDatabase();
}
তারপরে প্রতিটি সম্পত্তি পৃথকভাবে পরীক্ষা করুন
[Test]
public void TestTitle()
{
var user = LoadMyUser(this.UserID); // load the entity
Assert.AreEqual("Mr", user.Title);
}
[Test]
public void TestFirstname()
{
var user = LoadMyUser(this.UserID);
Assert.AreEqual("Joe", user.Firstname);
}
[Test]
public void TestLastname()
{
var user = LoadMyUser(this.UserID);
Assert.AreEqual("Bloggs", user.Lastname);
}
এই পদ্ধতির বিভিন্ন কারণ রয়েছে:
- কোনও অতিরিক্ত ডাটাবেস কল নেই (একটি সেটআপ, একটি টিয়ারডাউন)
- পরীক্ষাগুলি অনেক বেশি দানাদার, প্রতিটি পরীক্ষার একটি সম্পত্তি যাচাই করে
- সেটআপ / টিয়ারডাউন যুক্তি নিজেই টেস্ট পদ্ধতি থেকে সরানো হয়
আমি মনে করি এটি পরীক্ষার ক্লাসকে আরও সহজ করে তোলে এবং পরীক্ষাগুলি আরও দানাদার ( একক জমিদারি ভাল )
5/3/2015 সম্পাদনা করুন
এই পদ্ধতির উপর আরেকটি সংশোধন। শ্রেণি স্তরের সেটআপগুলি লোডিং বৈশিষ্ট্যগুলির মতো পরীক্ষাগুলির জন্য খুব সহায়ক যেখানে তারা বিভিন্ন সেটআপের প্রয়োজন সেখানে কম কার্যকর are এক্ষেত্রে প্রতিটি ক্ষেত্রে নতুন ক্লাস স্থাপন করা ওভারকিল।
এটির সাহায্যে আমার এখন দুটি বেস ক্লাস SetupPerTest
এবং আছে SingleSetup
। এই দুটি শ্রেণি প্রয়োজনীয় কাঠামোটি প্রকাশ করে।
আমাদের SingleSetup
প্রথম সংস্করণে বর্ণিত হিসাবে আমাদের মধ্যে একটি খুব অনুরূপ ব্যবস্থা রয়েছে। একটি উদাহরণ হবে
public TestProperties : SingleSetup
{
public int UserID {get;set;}
public override DoSetup(ISession session)
{
var user = new User("Joe", "Bloggs");
session.Save(user);
this.UserID = user.UserID;
}
[Test]
public void TestLastname()
{
var user = LoadMyUser(this.UserID); // load the entity
Assert.AreEqual("Bloggs", user.Lastname);
}
[Test]
public void TestFirstname()
{
var user = LoadMyUser(this.UserID);
Assert.AreEqual("Joe", user.Firstname);
}
}
তবে উল্লেখগুলি যেগুলি নিশ্চিত করে যে কেবলমাত্র সঠিক এনটাইটগুলি লোড হয়েছে সেগুলি সেটআপপারস্টেস্ট পদ্ধতির ব্যবহার করতে পারে
public TestProperties : SetupPerTest
{
[Test]
public void EnsureCorrectReferenceIsLoaded()
{
int friendID = 0;
this.RunTest(session =>
{
var user = CreateUserWithFriend();
session.Save(user);
friendID = user.Friends.Single().FriendID;
} () =>
{
var user = GetUser();
Assert.AreEqual(friendID, user.Friends.Single().FriendID);
});
}
[Test]
public void EnsureOnlyCorrectFriendsAreLoaded()
{
int userID = 0;
this.RunTest(session =>
{
var user = CreateUserWithFriends(2);
var user2 = CreateUserWithFriends(5);
session.Save(user);
session.Save(user2);
userID = user.UserID;
} () =>
{
var user = GetUser(userID);
Assert.AreEqual(2, user.Friends.Count());
});
}
}
সংক্ষেপে উভয় পন্থা আপনি যা পরীক্ষা করার চেষ্টা করছেন তার উপর নির্ভর করে কাজ করে।