Ini membuat saya memasuki unit testing dan itu membuat saya sangat bahagia
Kami baru mulai melakukan pengujian unit. Untuk waktu yang lama saya tahu akan baik untuk mulai melakukannya tetapi saya tidak tahu bagaimana memulainya dan yang lebih penting apa yang harus diuji.
Kemudian kami harus menulis ulang sepotong kode penting dalam program akuntansi kami. Bagian ini sangat kompleks karena melibatkan banyak skenario yang berbeda. Bagian yang saya bicarakan adalah metode untuk membayar penjualan dan / atau faktur pembelian yang sudah dimasukkan ke dalam sistem akuntansi.
Saya hanya tidak tahu bagaimana memulai mengkodekannya, karena ada begitu banyak opsi pembayaran yang berbeda. Faktur bisa menjadi $ 100 tetapi pelanggan hanya mentransfer $ 99. Mungkin Anda telah mengirim faktur penjualan ke pelanggan tetapi Anda juga telah membeli dari pelanggan itu. Jadi Anda menjualnya seharga $ 300 tetapi Anda membeli seharga $ 100. Anda dapat mengharapkan pelanggan membayar Anda $ 200 untuk menyelesaikan saldo. Dan bagaimana jika Anda menjual seharga $ 500 tetapi pelanggan hanya membayar Anda $ 250?
Jadi saya punya masalah yang sangat kompleks untuk dipecahkan dengan banyak kemungkinan bahwa satu skenario akan bekerja dengan sempurna tetapi akan salah pada jenis kombinasi invocie / pembayaran lainnya.
Di sinilah unit testing datang untuk menyelamatkan.
Saya mulai menulis (di dalam kode uji) metode untuk membuat daftar faktur, baik untuk penjualan maupun pembelian. Lalu saya menulis metode kedua untuk membuat pembayaran aktual. Biasanya pengguna akan memasukkan informasi itu melalui antarmuka pengguna.
Lalu saya membuat TestMethod pertama, menguji pembayaran yang sangat sederhana dari satu faktur tanpa diskon pembayaran. Semua tindakan dalam sistem akan terjadi ketika pembayaran bank akan disimpan ke database. Seperti yang Anda lihat saya membuat faktur, membuat pembayaran (transaksi bank) dan menyimpan transaksi ke disk. Dalam pernyataan saya, saya memasukkan angka yang benar yang harus berakhir dalam transaksi Bank dan dalam Faktur tertaut. Saya memeriksa jumlah pembayaran, jumlah pembayaran, jumlah diskon dan saldo faktur setelah transaksi.
Setelah tes berjalan saya akan pergi ke database dan periksa apakah yang saya harapkan ada di sana.
Setelah saya menulis tes, saya mulai mengkode metode pembayaran (bagian dari kelas BankHeader). Dalam pengkodean saya hanya repot dengan kode untuk membuat tes lulus pertama. Saya belum memikirkan skenario lain yang lebih kompleks.
Saya menjalankan tes pertama, memperbaiki bug kecil sampai tes saya akan berlalu.
Kemudian saya mulai menulis tes kedua, kali ini bekerja dengan diskon pembayaran. Setelah saya menulis tes saya memodifikasi metode pembayaran untuk mendukung diskon.
Saat menguji kebenaran dengan diskon pembayaran, saya juga menguji pembayaran sederhana. Kedua tes harus lulus tentu saja.
Kemudian saya bekerja sampai ke skenario yang lebih kompleks.
1) Pikirkan skenario baru
2) Tulis tes untuk skenario itu
3) Jalankan tes tunggal untuk melihat apakah itu akan lulus
4) Jika tidak, saya akan men-debug dan memodifikasi kode sampai lulus.
5) Saat memodifikasi kode saya terus menjalankan semua tes
Inilah cara saya berhasil membuat metode pembayaran yang sangat rumit. Tanpa pengujian unit, saya tidak tahu cara memulai pengkodean, masalahnya tampak luar biasa. Dengan pengujian saya bisa mulai dengan metode sederhana dan memperluasnya langkah demi langkah dengan jaminan bahwa skenario yang lebih sederhana masih akan berfungsi.
Saya yakin bahwa menggunakan pengujian unit menyelamatkan saya beberapa hari (atau minggu) pengkodean dan lebih atau kurang menjamin kebenaran metode saya.
Jika nanti saya memikirkan skenario baru, saya bisa menambahkannya ke tes untuk melihat apakah itu berfungsi atau tidak. Jika tidak, saya dapat memodifikasi kode tetapi masih memastikan skenario lain masih berfungsi dengan benar. Ini akan menghemat hari dan hari dalam fase pemeliharaan dan perbaikan bug.
Ya, bahkan kode yang diuji masih dapat memiliki bug jika pengguna melakukan hal-hal yang tidak Anda pikirkan atau mencegahnya melakukannya
Berikut adalah beberapa tes yang saya buat untuk menguji metode pembayaran saya.
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);
}