यह मुझे इकाई परीक्षण में मिला और इसने मुझे बहुत खुश किया
हमने सिर्फ यूनिट टेस्टिंग करना शुरू किया। लंबे समय से मुझे पता था कि इसे करना शुरू करना अच्छा होगा लेकिन मुझे नहीं पता था कि कैसे शुरू किया जाए और अधिक महत्वपूर्ण बात यह है कि क्या परीक्षण करना है।
फिर हमें अपने लेखांकन कार्यक्रम में एक महत्वपूर्ण कोड को फिर से लिखना पड़ा। यह हिस्सा बहुत जटिल था क्योंकि इसमें बहुत सारे परिदृश्य शामिल थे। मैं जिस हिस्से के बारे में बात कर रहा हूं वह बिक्री और / या खरीद का भुगतान करने की एक विधि है जो पहले से ही लेखा प्रणाली में दर्ज की गई है।
मुझे नहीं पता था कि इसे कैसे कोडित करना शुरू करना है, क्योंकि बहुत सारे भुगतान विकल्प थे। एक चालान $ 100 हो सकता है लेकिन ग्राहक ने केवल $ 99 का हस्तांतरण किया। हो सकता है कि आपने किसी ग्राहक को बिक्री चालान भेजा हो लेकिन आपने उस ग्राहक से भी खरीदारी की हो। इसलिए आपने उसे $ 300 में बेचा लेकिन आपने $ 100 में खरीदा। आप अपने ग्राहक से शेष राशि का निपटान करने के लिए आपको $ 200 का भुगतान करने की उम्मीद कर सकते हैं। और क्या होगा यदि आप $ 500 के लिए बेचे, लेकिन ग्राहक आपको केवल $ 250 का भुगतान करता है?
इसलिए मुझे कई संभावनाओं के साथ हल करने के लिए एक बहुत ही जटिल समस्या थी कि एक परिदृश्य पूरी तरह से काम करेगा लेकिन एक अन्य प्रकार के चालान / भुगतान संयोजन पर गलत होगा।
यह वह जगह है जहाँ इकाई परीक्षण बचाव के लिए आया था।
मैंने बिक्री और खरीद दोनों के लिए चालान की एक सूची बनाने के लिए एक विधि लिखना शुरू कर दिया। फिर मैंने वास्तविक भुगतान बनाने के लिए एक दूसरी विधि लिखी। आम तौर पर एक उपयोगकर्ता एक यूजर इंटरफेस के माध्यम से उस जानकारी को दर्ज करेगा।
फिर मैंने पहला TestMethod बनाया, बिना किसी भुगतान छूट के एकल चालान के बहुत ही सरल भुगतान का परीक्षण किया। सिस्टम में सभी कार्रवाई तब होगी जब बैंकपेमेंट डेटाबेस में सहेजा जाएगा। जैसा कि आप देख सकते हैं कि मैंने एक चालान बनाया, एक भुगतान (एक बैंक लेनदेन) बनाया और लेनदेन को डिस्क पर सहेजा। अपने दावे में मैंने कहा कि बैंक लेनदेन में और लिंक्ड इनवॉइस में समाप्त होने वाली सही संख्याएँ क्या होनी चाहिए। मैं भुगतान की संख्या, भुगतान राशि, छूट राशि और लेनदेन के बाद चालान की शेष राशि की जांच करता हूं।
परीक्षण के बाद, मैं डेटाबेस में जाऊँगा और अगर मुझे उम्मीद थी कि दोबारा जाँच करेगा।
उपरांतपरीक्षण लिखने के , मैंने भुगतान विधि (BankHeader वर्ग का हिस्सा) को कोड करना शुरू किया। कोडिंग में मैंने केवल पहली परीक्षा पास करने के लिए कोड के साथ परेशान किया। मैंने अभी तक दूसरे, अधिक जटिल, परिदृश्यों के बारे में नहीं सोचा था।
मैंने पहला टेस्ट चलाया, एक छोटा बग तय किया जब तक कि मेरा टेस्ट पास नहीं हो जाता।
फिर मैंने दूसरा परीक्षण लिखना शुरू किया, इस बार भुगतान छूट के साथ काम करना। परीक्षण लिखने के बाद मैंने छूट का समर्थन करने के लिए भुगतान विधि को संशोधित किया।
भुगतान छूट के साथ शुद्धता के लिए परीक्षण करते समय, मैंने सरल भुगतान का भी परीक्षण किया। दोनों परीक्षणों को निश्चित रूप से पास होना चाहिए।
तब मैंने अधिक जटिल परिदृश्यों के लिए अपने तरीके से काम किया।
1) एक नए परिदृश्य के बारे में सोचो
2) उस परिदृश्य के लिए एक परीक्षण लिखें
3) यह देखने के लिए कि क्या यह पास होगा, उस एकल परीक्षा को चलाएं
4) अगर यह डिबग नहीं करता और कोड को संशोधित करता, जब तक कि यह पास नहीं हो जाता।
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);
}