Pertama-tama, saya ingin mengatakan bahwa matematika membantu menertibkan pikiran kita dan secara efektif mengembangkan pemikiran logis, dan ini adalah beberapa kualitas yang paling penting dari para peserta dalam pengembangan perangkat lunak. Berbicara tentang pengujian, ini terutama menyangkut perilaku sistem, yang ortogonal dengan representasi struktural yang umum bagi pengembang perangkat lunak. Perbedaan antara representasi struktural dan perilaku adalah bahwa struktural berfokus pada apa perangkat lunak itu, dan pandangan perilaku memperhitungkan apa yang dilakukan perangkat lunak.
Salah satu kesulitan penguji adalah bahwa dokumentasi teknis dasar atau manual pengembangan perangkat lunak biasanya ditulis oleh dan untuk pengembang, dan penekanan utama adalah pada informasi struktural daripada informasi perilaku. Tentu saja, bagian struktural dan perilaku sangat penting untuk pengujian, karena kesalahan pemrograman dapat ditemukan di masing-masing bagian ini. Itu sebabnya kita akan berbicara tentang metode matematika diskrit untuk menunjukkan hubungan antara struktur program dan perilakunya.
Dalam pekerjaan sehari-hari mereka, insinyur jaminan kualitas perangkat lunak (QA) bekerja dengan operasi formula, perilaku fungsi, dan struktur data. Mereka selalu memantau dan memverifikasi keadaan sistem yang selalu berubah, sehingga mereka harus memiliki pemikiran algoritmik dan matematis untuk memahami logika perangkat lunak.
Jika seorang pengembang menggunakan pendekatan matematika dalam karyanya, sebagai akibatnya, semua operasi logis akan terhubung satu sama lain, tindakan akan mengikuti rantai logis, dan setiap fungsi akan dipertimbangkan secara struktural.
Matematika diskrit membantu kita menemukan solusi terbaik dalam berbagai situasi. Misalnya, Anda dapat menemukan serangkaian kasus uji yang paling cocok (Uji kasus), tanpa mencakup semua opsi yang memungkinkan. Selain itu, matematika diskrit membantu kita memvisualisasikan bagian yang tepat dari perangkat lunak yang telah diterapkan dan dicakup dalam tes.
Sayangnya, kita tidak hidup di dunia yang ideal, dan hasil nyata yang diharapkan dari menggunakan perangkat lunak dan hasil aktual dapat bervariasi. Jadi, tujuan utama Departemen Jaminan Kualitas (QA) adalah untuk secara efektif mencakup sebanyak mungkin kasus uji.
Untuk menunjukkan kepada Anda konsep ini secara lebih rinci, kami membuat diagram Venn berikut dengan contoh yang telah kami uraikan sebelumnya:

Diagram Venn di atas menggambarkan banyak situasi, dengan demikian membantu untuk menggambarkan dan mendefinisikan set situasi. Sebagai contoh, ini dapat membantu kita melihat perbedaan antara set objek. Matematika diskrit membantu menganalisis dan mengoptimalkan serangkaian tindakan yang dapat memengaruhi perangkat lunak yang sedang dikembangkan.
Tetapkan teori
Menggunakan prinsip-prinsip teori himpunan dasar, kita dapat membuat pseudo-code untuk menggambarkan semua kasus yang mungkin untuk aplikasi Next Day (program yang menghitung hari mana yang akan berikutnya menggunakan tanggal yang dimasukkan):
M1={month:month has 30 days} M2={month:month has 31 days except December} M3={month:month is February} M4={month:month is December} D1={day:1<=day<=28} D2={day:1<=day<=29} D3={day:1<=day<=30} D4={day:1<=day<=31} Y1={year:year is a leap year} Y2={year:year is not a leap year}
Kodesemu ini sudah disiapkan untuk pengembangan dan pengujian aplikasi, sehingga penguji juga dapat menerapkan semua kasus uji yang mungkin berdasarkan data ini. Menggunakan data dalam format ini membantu meningkatkan kecepatan pengembangan dan mengurangi kemungkinan kesalahan.
Teori grafik
Kebanyakan matematika diskrit adalah apa yang disebut "teori graf", yang mempelajari grafik. Grafik digunakan untuk mewakili hubungan antara beberapa objek atau data, dan jaringan komputer adalah contoh grafik yang sesuai.
Grafik juga merupakan hal mendasar dalam proses pengembangan perangkat lunak. Misalnya, dengan menggunakan grafik, kita dapat menguraikan fungsi kompleks menjadi beberapa bagian yang lebih kecil, yang membantu kita untuk lebih memahami logika bisnis.
Grafik dapat berupa directional dan non-directional, yang berarti bahwa kita dapat bergerak dari node ke node dalam satu arah atau dalam kedua arah (dalam kasus grafik yang diarahkan), atau kita tidak dapat bergerak dari satu node ke yang lain (jika grafik diarahkan secara ketat dalam satu arah)
Jadi, mari kita kembali ke pengujian perangkat lunak dan bayangkan bahwa kita memiliki aliran dari beberapa proses (misalnya, memindahkan tugas dalam beberapa jenis sistem pelacakan tugas); kita memiliki kondisi untuk beberapa masalah, dan kita dapat memindahkannya ke tahap lain (grafik berorientasi), atau kita dapat mencapai beberapa titik di mana kita tidak dapat melakukan apa pun dengan entitas (grafik tidak diarahkan). Dengan pendekatan visualisasi ini, kami dapat dengan mudah mengumpulkan serangkaian tindakan yang mungkin tersedia untuk entitas ini:

Mari kita lanjutkan dan lihat matriks adjacency, yang dapat dibangun berdasarkan grafik yang tidak diarahkan. Dalam contoh di bawah ini, elemen-elemen dari matriks adjacency menunjukkan apakah pasangan simpul berdekatan atau tidak:

Sekarang bayangkan bahwa node adalah kondisi dari beberapa entitas, dan jika kita membangun matriks adjacency untuk grafik ini (set entitas), kita akan melihat serangkaian tindakan terbatas yang bisa kita ambil. Misalnya, mengubah status dari simpul "0" ke simpul "1" tersedia karena mereka terkait satu sama lain. Tetapi entitas "0" tidak dapat diubah ke tahap "2" atau "3", seperti yang dapat kita lihat dari matriks kita - "nol" ditulis dalam sel. Dengan menggunakan matriks ini, kita bisa menghilangkan set langkah entitas yang tidak perlu dan mengurangi set kasus uji.
Matriks lain yang dapat kita gunakan untuk mengumpulkan kasus uji adalah matriks kejadian, yang menunjukkan hubungan antara dua kelas objek. Pada gambar berikut ini kita melihat grafik tidak berarah dan matriks kejadiannya: "1", "2", "3" dan "4" adalah simpul (entitas), "e1", "e2", "e3" "e4" adalah ujung-ujung grafik , dan matriks menggambarkan entitas dan tindakan yang dapat kita lakukan dengannya. Dengan simpul "1" kita dapat melakukan tindakan "e1", "e2" dan "e3", tetapi tindakan "e4" tidak tersedia untuk simpul "1.". Metode ini sangat membantu dalam membuat satu set kasus uji.

Bayangkan bahwa penguji menerima daftar entitas dan tindakan yang dapat dilakukan dengan entitas ini. Dengan matriks ini, ia dapat mengurangi set kasus uji. Mengurangi jumlah tes adalah bagian yang sangat penting dari proses pengujian perangkat lunak. Pengujian perangkat lunak sangat tergantung pada pengurangan jumlah kasus pengujian, dan dengan pendekatan ini, cakupan pengujian dan penghindaran redundansi dimaksimalkan.
Tujuan penguji perangkat lunak adalah untuk melindungi produk menggunakan case uji efektif yang memungkinkan Anda menguji semua kombinasi tindakan yang mungkin. Penguji dapat berhasil dengan upaya minimal menggunakan pendekatan matematika diskrit (algoritma) untuk menemukan set kasus uji yang optimal dan memaksimalkan efektivitas proses pengujian perangkat lunak.
Matematika diskrit juga membantu kita memahami bagaimana perangkat lunak sebenarnya dibuat, karena semua perangkat lunak menggunakan algoritma dan metode matematika diskrit dan logika matematika. Karenanya, jika kami memahami cara kerjanya, kami dapat menemukan kesalahan atau masalah dalam program yang tidak dapat dideteksi oleh pengguna.
Petri nets
Mari kita lihat contoh bagaimana aplikasi bekerja pada teknologi microservice menggunakan Petri Nets (grafik dinamis):

Di sini kita melihat bahwa sistem memiliki keadaan awal dan harus menerima beberapa sinyal yang dikirim dari layanan lain (sebuah penanda muncul). Bergantung pada hasilnya, tindakan berikut harus dilakukan. Dengan demikian, jaring Petri menggambarkan dinamika seluruh sistem. Jika ada masalah, kami dapat melokalisasi cacat lebih cepat.
Jaringan saraf
Jaringan saraf tiruan juga didasarkan pada prinsip-prinsip grafik. Mereka meniru pemrosesan informasi oleh neuron otak manusia. Setiap bagian dari sistem saraf didasarkan pada grafik yang berisi "input" node, "tersembunyi" lapisan dan "output" node.

Beberapa data masuk ke lapisan input, dan algoritma lapisan tersembunyi memproses data ini dan mengirimkan hasilnya ke tahap output. Dengan demikian, jaringan saraf dapat melakukan tindakan berdasarkan data ini. Jaringan saraf juga terdiri dari banyak grafik serupa dengan logika berbeda, sehingga mereka dapat mengambil keputusan berdasarkan parameter input.
Pengujian Milenium
Contoh terakhir kami menggunakan matematika diskrit dalam pengujian melibatkan membangun proses pengujian perangkat lunak. Saat ini, ada banyak metodologi dan pendekatan yang disebut "pengujian milenium", yang dikembangkan jauh sebelum penggunaannya yang sebenarnya, mulai dari tahun 2000-an, ketika pengembangan perangkat lunak mulai berkembang pesat.
BDD (Behaviour Driven Development) adalah bagian dari apa yang disebut Pengujian Millenium, metodologi ini merupakan perpanjangan dari TDD (Test Driven Development). BDD memungkinkan penguji untuk membangun hubungan yang lebih dekat antara kriteria penerimaan untuk fungsi yang diberikan dan tes yang digunakan untuk menguji fungsi ini. BDD dapat mengubah pernyataan terstruktur dalam bahasa alami menjadi tes yang dapat dieksekusi, sehingga memperkenalkan lebih banyak kejelasan dan pemahaman ke sisi bisnis dan sisi pengembangan, ketika mereka mulai berbicara satu bahasa yang sama. Struktur dasar alur kerja BDD juga didasarkan pada grafik dinamis (Petri Net).

Seperti dapat dilihat dari struktur ini, setiap proses disertai oleh proses yang berbeda, dan tidak dapat pindah ke tahap berikutnya sampai tahap sebelumnya selesai. Sekali lagi, prinsip-prinsip matematika diskrit membantu kita memahami proses dengan lebih efisien.
Sebagai kesimpulan, saya ingin sekali lagi daftar keuntungan menggunakan matematika diskrit dalam proses pengembangan perangkat lunak:
- Bantuan dalam memahami logika bisnis dari fungsionalitas yang diperlukan
- Sederhanakan kemampuan untuk membagi tugas yang kompleks menjadi tugas yang lebih sederhana
- Memungkinkan profesional untuk melakukan pengujian yang efektif dengan sedikit usaha
- Membantu dalam memahami dan memvisualisasikan struktur dari semua yang kita inginkan
Contoh di atas menunjukkan bagaimana matematika diskrit dapat digunakan untuk secara efektif meningkatkan kinerja tes. Setiap aspek dari matematika diskrit dapat membantu pengembang memahami alur kerja perangkat lunak umum dan prinsip-prinsipnya sepanjang siklus hidup pengembangan perangkat lunak.