এটি আমাকে ইউনিট পরীক্ষায় ফেলেছে এবং এটি আমাকে খুব আনন্দিত করেছে
আমরা সবেমাত্র ইউনিট পরীক্ষা করা শুরু করেছি। একটি দীর্ঘ সময়ের জন্য আমি জানতাম এটি করা শুরু করা ভাল হবে তবে কীভাবে শুরু করবেন এবং গুরুত্বপূর্ণভাবে কী পরীক্ষা করতে হবে তা সম্পর্কে আমার কোনও ধারণা ছিল না।
তারপরে আমাদের অ্যাকাউন্টিং প্রোগ্রামে কোডের একটি গুরুত্বপূর্ণ অংশটি আবার লিখতে হয়েছিল। এই অংশটি খুব জটিল ছিল কারণ এতে প্রচুর পরিমাণে বিভিন্ন পরিস্থিতিতে জড়িত। আমি যে অংশটির কথা বলছি সেটি হ'ল অ্যাকাউন্টিং সিস্টেমে ইতিমধ্যে প্রবেশ করা বিক্রয় এবং / অথবা চালানের ক্রয় প্রদানের একটি পদ্ধতি।
আমি কীভাবে এটির কোডিং শুরু করবেন তা জানতাম না, কারণ অনেকগুলি বিভিন্ন অর্থপ্রদানের বিকল্প ছিল। একটি চালান $ 100 হতে পারে তবে গ্রাহক কেবল $ 99 স্থানান্তরিত করতে পারেন। হতে পারে আপনি কোনও গ্রাহকের কাছে বিক্রয় চালানগুলি প্রেরণ করেছেন তবে আপনি সেই গ্রাহকের কাছ থেকেও কিনেছেন। সুতরাং আপনি তাকে 300 ডলারে বিক্রি করেছেন তবে আপনি 100 ডলারে কিনেছেন। ব্যালেন্স নিষ্পত্তি করতে আপনি আপনার গ্রাহককে 200 ডলার দেবেন বলে আশা করতে পারেন। এবং যদি আপনি 500 ডলারে বিক্রি করেন তবে গ্রাহক আপনাকে কেবল 250 ডলার দেয়?
সুতরাং অনেকগুলি সম্ভাবনা সমাধান করার জন্য আমার খুব জটিল সমস্যা হয়েছিল যে একটি দৃশ্যে নিখুঁতভাবে কাজ করবে তবে অন্য ধরণের ইনভোসি / পেমেন্ট সমন্বয়টি ভুল হবে।
এখানেই ইউনিট টেস্টিং উদ্ধারকাজে এসেছিল।
বিক্রয় এবং ক্রয় উভয়ের জন্যই চালানের তালিকা তৈরি করার জন্য আমি একটি পদ্ধতি (পরীক্ষার কোডের অভ্যন্তরে) লিখতে শুরু করি। তারপরে আসল অর্থ প্রদানের জন্য আমি একটি দ্বিতীয় পদ্ধতি লিখেছিলাম। সাধারণত কোনও ব্যবহারকারী কোনও তথ্য ব্যবহারকারী ইন্টারফেসের মাধ্যমে প্রবেশ করতে পারে।
তারপরে আমি প্রথম টেস্টমেথোদ তৈরি করেছি, কোনও অর্থপ্রদান ছাড় ছাড়াই একটি মাত্র চালানের খুব সহজ অর্থ প্রদানের পরীক্ষা করে। সিস্টেমের সমস্ত ক্রিয়াকলাপ ঘটবে যখন কোনও ব্যাংক পেমেন্ট ডাটাবেসে সংরক্ষণ করা হবে। আপনি দেখতে পাচ্ছেন যে আমি একটি চালান তৈরি করেছি, একটি অর্থ প্রদান (একটি ব্যাংক লেনদেন) তৈরি করেছি এবং লেনদেনটিকে ডিস্কে সংরক্ষণ করেছি। আমার দৃ In় প্রতিবেদনে আমি ব্যাংকের লেনদেন এবং লিঙ্কযুক্ত ইনভয়েসে শেষ হওয়া সঠিক নম্বরগুলি কী হওয়া উচিত। আমি লেনদেনের পরে প্রদানের সংখ্যা, প্রদানের পরিমাণ, ছাড়ের পরিমাণ এবং চালানের ভারসাম্য পরীক্ষা করে দেখি।
পরীক্ষাটি চালানোর পরে আমি ডাটাবেসে গিয়ে ডাবল চেক করতাম যে আমি কী প্রত্যাশা রেখেছিলাম তা সেখানে ছিল কিনা।
আমি পরীক্ষাটি লেখার পরে , আমি অর্থপ্রদানের পদ্ধতিটি (ব্যাংকহিডার শ্রেণীর অংশ) কোডিং শুরু করেছি। কোডিংয়ে আমি প্রথম পরীক্ষার পাস করার জন্য কোড দিয়ে বিরক্ত করেছি। আমি অন্যান্য, আরও জটিল, পরিস্থিতি সম্পর্কে এখনও ভাবি নি।
আমি প্রথম পরীক্ষাটি চালিয়েছি, আমার পরীক্ষা পাস না হওয়া অবধি একটি ছোট বাগ ঠিক করেছি।
তারপরে আমি দ্বিতীয় পরীক্ষা লিখতে শুরু করি, এবার পেমেন্ট ছাড় নিয়ে কাজ করছি working আমি পরীক্ষাটি লেখার পরে ছাড়গুলি সমর্থন করার জন্য আমি অর্থ প্রদানের পদ্ধতিটি পরিবর্তন করেছি।
অর্থপ্রদানের ছাড়ের সাথে নির্ভুলতার জন্য পরীক্ষা করার সময়, আমি সহজ পেমেন্টও পরীক্ষা করেছিলাম। উভয় পরীক্ষা অবশ্যই পাস করা উচিত।
তারপরে আমি আরও জটিল পরিস্থিতিতে যাওয়ার পথে কাজ করেছি।
1) একটি নতুন দৃশ্যের কথা চিন্তা করুন
2) সেই দৃশ্যের জন্য একটি পরীক্ষা লিখুন
3) এটি পাস হবে কিনা তা দেখতে সেই একক পরীক্ষা চালান
৪) যদি আমি কোডটি ডিবাগ এবং সংশোধন না করি যতক্ষণ না এটি পাস হয়।
5) কোডটি সংশোধন করার সময় আমি সমস্ত পরীক্ষা চালিয়ে যাচ্ছি
এইভাবে আমি আমার অত্যন্ত জটিল অর্থপ্রদানের পদ্ধতি তৈরি করতে পরিচালিত হয়েছি। ইউনিট পরীক্ষা না করে আমি কোডিং কীভাবে শুরু করব তা জানতাম না, সমস্যাটি অপ্রতিরোধ্য বলে মনে হয়েছিল। পরীক্ষার মাধ্যমে আমি একটি সহজ পদ্ধতি দিয়ে শুরু করতে পারি এবং ধাপে ধাপে বাড়িয়ে দিতে পারি এই আশ্বাস দিয়ে যে সহজ পরিস্থিতিগুলি এখনও কাজ করবে।
আমি নিশ্চিত যে ইউনিট পরীক্ষার সাহায্যে আমাকে কোডিংয়ের কয়েক দিন (বা সপ্তাহ) বাঁচানো হয়েছিল এবং আমার পদ্ধতির যথাযথতার গ্যারান্টি দিচ্ছে।
আমি যদি পরে কোনও নতুন দৃশ্যের কথা চিন্তা করি তবে আমি এটি পরীক্ষাগুলিতে এটি যুক্ত করছে কিনা এটি কাজ করছে কিনা তা দেখার জন্য। যদি না হয় আমি কোডটি সংশোধন করতে পারি তবে এখনও নিশ্চিত হন যে অন্য পরিস্থিতিতে এখনও সঠিকভাবে কাজ করছে। এটি রক্ষণাবেক্ষণ এবং বাগ ফিক্সিং পর্যায়ে দিন এবং দিন সাশ্রয় করবে।
হ্যাঁ, এমনকি যদি কোনও ব্যবহারকারী এমন কিছু করেন যা আপনি ভাবেননি বা তাকে কাজ করতে বাধা দিয়েছেন তবে পরীক্ষিত কোডটিতেও বাগ থাকতে পারে
আমার অর্থ প্রদানের পদ্ধতিটি পরীক্ষা করার জন্য আমি নীচে কয়েকটি পরীক্ষার তৈরি করেছি।
public class TestPayments
{
InvoiceDiaryHeader invoiceHeader = null;
InvoiceDiaryDetail invoiceDetail = null;
BankCashDiaryHeader bankHeader = null;
BankCashDiaryDetail bankDetail = null;
public InvoiceDiaryHeader CreateSales(string amountIncVat, bool sales, int invoiceNumber, string date)
{
......
......
}
public BankCashDiaryHeader CreateMultiplePayments(IList<InvoiceDiaryHeader> invoices, int headerNumber, decimal amount, decimal discount)
{
......
......
......
}
[TestMethod]
public void TestSingleSalesPaymentNoDiscount()
{
IList<InvoiceDiaryHeader> list = new List<InvoiceDiaryHeader>();
list.Add(CreateSales("119", true, 1, "01-09-2008"));
bankHeader = CreateMultiplePayments(list, 1, 119.00M, 0);
bankHeader.Save();
Assert.AreEqual(1, bankHeader.BankCashDetails.Count);
Assert.AreEqual(1, bankHeader.BankCashDetails[0].Payments.Count);
Assert.AreEqual(119M, bankHeader.BankCashDetails[0].Payments[0].PaymentAmount);
Assert.AreEqual(0M, bankHeader.BankCashDetails[0].Payments[0].PaymentDiscount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[0].InvoiceHeader.Balance);
}
[TestMethod]
public void TestSingleSalesPaymentDiscount()
{
IList<InvoiceDiaryHeader> list = new List<InvoiceDiaryHeader>();
list.Add(CreateSales("119", true, 2, "01-09-2008"));
bankHeader = CreateMultiplePayments(list, 2, 118.00M, 1M);
bankHeader.Save();
Assert.AreEqual(1, bankHeader.BankCashDetails.Count);
Assert.AreEqual(1, bankHeader.BankCashDetails[0].Payments.Count);
Assert.AreEqual(118M, bankHeader.BankCashDetails[0].Payments[0].PaymentAmount);
Assert.AreEqual(1M, bankHeader.BankCashDetails[0].Payments[0].PaymentDiscount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[0].InvoiceHeader.Balance);
}
[TestMethod]
[ExpectedException(typeof(ApplicationException))]
public void TestDuplicateInvoiceNumber()
{
IList<InvoiceDiaryHeader> list = new List<InvoiceDiaryHeader>();
list.Add(CreateSales("100", true, 2, "01-09-2008"));
list.Add(CreateSales("200", true, 2, "01-09-2008"));
bankHeader = CreateMultiplePayments(list, 3, 300, 0);
bankHeader.Save();
Assert.Fail("expected an ApplicationException");
}
[TestMethod]
public void TestMultipleSalesPaymentWithPaymentDiscount()
{
IList<InvoiceDiaryHeader> list = new List<InvoiceDiaryHeader>();
list.Add(CreateSales("119", true, 11, "01-09-2008"));
list.Add(CreateSales("400", true, 12, "02-09-2008"));
list.Add(CreateSales("600", true, 13, "03-09-2008"));
list.Add(CreateSales("25,40", true, 14, "04-09-2008"));
bankHeader = CreateMultiplePayments(list, 5, 1144.00M, 0.40M);
bankHeader.Save();
Assert.AreEqual(1, bankHeader.BankCashDetails.Count);
Assert.AreEqual(4, bankHeader.BankCashDetails[0].Payments.Count);
Assert.AreEqual(118.60M, bankHeader.BankCashDetails[0].Payments[0].PaymentAmount);
Assert.AreEqual(400, bankHeader.BankCashDetails[0].Payments[1].PaymentAmount);
Assert.AreEqual(600, bankHeader.BankCashDetails[0].Payments[2].PaymentAmount);
Assert.AreEqual(25.40M, bankHeader.BankCashDetails[0].Payments[3].PaymentAmount);
Assert.AreEqual(0.40M, bankHeader.BankCashDetails[0].Payments[0].PaymentDiscount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[1].PaymentDiscount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[2].PaymentDiscount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[3].PaymentDiscount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[0].InvoiceHeader.Balance);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[1].InvoiceHeader.Balance);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[2].InvoiceHeader.Balance);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[3].InvoiceHeader.Balance);
}
[TestMethod]
public void TestSettlement()
{
IList<InvoiceDiaryHeader> list = new List<InvoiceDiaryHeader>();
list.Add(CreateSales("300", true, 43, "01-09-2008")); //Sales
list.Add(CreateSales("100", false, 6453, "02-09-2008")); //Purchase
bankHeader = CreateMultiplePayments(list, 22, 200, 0);
bankHeader.Save();
Assert.AreEqual(1, bankHeader.BankCashDetails.Count);
Assert.AreEqual(2, bankHeader.BankCashDetails[0].Payments.Count);
Assert.AreEqual(300, bankHeader.BankCashDetails[0].Payments[0].PaymentAmount);
Assert.AreEqual(-100, bankHeader.BankCashDetails[0].Payments[1].PaymentAmount);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[0].InvoiceHeader.Balance);
Assert.AreEqual(0, bankHeader.BankCashDetails[0].Payments[1].InvoiceHeader.Balance);
}