Story 6 PPW

Pada story kali ini, saya diminta untuk melakukan metode TDD (Test Driven Development) dalam membangun website saya. Saya merasa sedikit bingung untuk memulai melakukanya karena ini pertama kalinya saya membuat sebuah program dengan metode TDD. Dalam melalukan metode TDD, ada beberapa tahapan yang harus dilakukan antara lain membuat fungsi untuk melakukan unit-test serta functional test, melakukan testing, menuliskan kode agar dapat lolos dari unit-test serta functional test, dan melakukan refactoring. Yang pertama, membuat beberapa fungsi untuk melakukan unit-test serta functional test pada suatu program. Apa itu unit-test? Unit-test ialah melakukan tes kepada beberapa potongan kecil dari suatu program utama secara terpisah. Unit-test dapat dilakukan dengan melakukan tes kepada seluruh fungsi yang ada pada program tersebut. Dalam pengerjaan story ini, terdapat 6 fungsi yang saya buat pada berkas tests.py untuk melakukan unit-test yang berguna untuk mengecek apakah routing url sudah baik, apakah template yang digunakan sudah sesuai, apakah konten yang saya muat ada pada template tersebut, apakah database pada models.py sudah dapat berfungsi, apakah form pada forms.py sudah dapat bisa membedakan input yang valid ataupun tidak, serta apakah form saya sudah bisa menerima sebuah input lalu memasukanya kedalam database serta menampilkanya pada halaman website. Selain membuat fungsi pada berkas tests.py, saya juga melakukan import terhadap beberapa modul yang saya perlukan antara lain Client(), models, form serta HttpRequest(). Berikut ialah potongan kode yang saya buat untuk melakukan unit-test:

Setelah membuat fungsi untuk melakukan unit-test, hal yang saya lakukan ialah membuat fungsi untuk melakukan functional test. Apa itu functional test? Functional test ialah melakukan testing kepada suatu fitur pada sebuah program. Namun sebelum itu saya lakukan, ada hal lain yang harus saya lakukan terlebih dahulu yaitu menyiapkan modul Selenium yang akan saya gunakan untuk melakukan functional test. Selenium adalah modul yang dapat melakukan otomasi pada sebuah sebuah browser. Sebelum mengerjakan story ini, saya telah pernah menggunakan modul ini sebelumnya sehingga saya merasa mengerti bagaimana cara menggunakanya. Untuk menggunakanya, ada dua hal utama yang harus dilakukan. Yang pertama ialah melakukan instalasi terhadap modul Selenium itu sendiri. Hal itu dapat dilakukan dengan cara menuliskan perintah berikut di command prompt:
>pip install selenium
Setelah itu, saya juga mengunduh Selenium Driver yang berfungsi untuk membuka browser saat modul Selenium sedang dijalankan. Selenium Driver yang diunduh harus sesuai dengan tipe serta versi browser yang ingin digunakan.
Setelah selesai menyiapkan modul Selenium, barulah saya mulai untuk membuat fungsi-fungsi yang akan digunakan untuk melakukan functional test. Pertama-tama, saya membuat dua fungsi yang salah satunya berguna untuk membuka Selenium Driver lalu mengakses website saya serta yang lainya berguna untuk menutup Selenium Driver. Berikut ialah fungsi yang saya buat untuk melakukan hal tersebut:

Selain membuat fungsi tersebut, agar Selenium dapat dijalankan ketika saya menuliskan perintah “python manage.py test” pada suatu command prompt, saya harus menjalankan perintah “python manage.py runserver” terlebih dahulu di command prompt lain agar halaman website saya dapat diakses secara lokal.
Setelah memastikan bahwa Selenium Driver dapat berfungsi dengan baik, saya membuat fungsi untuk melakukan functional test sesuai dengan requirement yang ada pada soal. Ide dari fungsi ini ialah saya memasukan sebuah kalimat secara otomatis ke dalam form yang saya buat lalu memeriksa, apakah kalimat tersebut tampil pada halaman tersebut atau tidak. Langkah-langkah yang saya lakukan dalam membuat fungsi tersebut diawali dengan saya membuat sebuah variabel yang beirisikan kalimat yang ingin saya masukan. Lalu saya membuat sebuah variabel yang menampung objek form yang dicari oleh Selenium dengan menggunakan id. Setelah itu, saya memasukan kalimat yang saya ingin masukan ke dalam objek form tersebut. Setelah kalimat tersebut dimasukan, saya membuat variabel yang menampung objek button yang berfungsi untuk memasukan kalimat yang ada pada form ke dalam database. Objek button tersebut yang dicari oleh Selenium dengan menggunakan id. Setelah itu, saya menuliskan kode agar objek button tersebut dapat diklik selayaknya dijalankan oleh manusia. Terakhir, barulah saya melakukan pemeriksaan apakah kalimat yang saya masukan ada atau tidak pada halaman tersebut menggunakan fungsi self.assertIn(). Berikut adalah fungsi yang saya buat untuk melakukan hal tersebut:

Dalam membuat fungsi ini, saya tidak merasa kesulitan karena saya sudah pernah menggunakan modul Selenium sebelumnya.
Setelah selesai membuat fungsi untuk menjalankan unit-test serta functional test, saya menjalankan seluruh fungsi tersebut untuk memeriksa apakah website saya sudah berjalan sesuai dengan harapan. Apabila belum, saya menuliskan kode agar website saya dapat berjalan sesuai dengan harapan lalu menjalankan seluruh fungsi tersebut hingga website saya sudah berjalan sesuai harapan dengan munculnya kata “OK” setelah menjalankan seluruh fungsi tersebut. Setelah hal tersebut terjadi, saya dapat melihat code coverage dari keseluruhan kode yang saya buat. Apa itu code coverage? Code coverage ialah presentase banyaknya kode dalam source code yang sudah lulus dari test. Dalam story kali ini, saya berhasil mencapai code coverage sebesar 100%. Hal tersebut dapat diketahui dengan menjalankan beberapa perintah berikut di dalam command prompt:
> pip install coverage
> coverage run — include=”NAMA_APP/*” manage.py test
> coverage report -m
Setelah ketiga perintah tersebut dijalankan, maka akan muncul tulisan seperti ini pada command prompt:

Menurut saya, apabila code coverage hanya mencapai 80%, itu belum cukup karena setiap kode memiliki proporsi yang sama dalam perhitungan code coverage. Sehingga, sangat mungkin terjadi 20% kode yang belum di test merupakan kode yang merupakan inti dari program tersebut yang berakibat fungsionalitas dari program tersebut belum dapat dipastikan dapat berjalan dengan baik. Code coverage dapat ditingkatkan dengan cara memperbanyak fungsi yang digunakan untuk melakukan test sehingga seluruh fungsi tersebut dapat mencakup seluruh barisan kode yang terdapat dalam source code.
Setelah melakukan testing, saya melakukan deployment website baru saya ke dalam aplikasi Herokuapp. Dalam melakukan deployment, kesulitan yang saya dapatkan ialah saya merasa kesulitan untuk melakukan 2 stage pipeline karena pipeline test yang saya lakukan gagal. Saya mencoba untuk berdiskusi dengan teman-teman saya yang mengalami kesulitan yang sama dengan saya. Ternyata, hal tersebut terjadi karena adanya kesalahan versi Selenium yang saya masukan ke dalam berkas requirements.txt. Setelah saya merubah isi dari berkas tersebut, 2 stage pipeline saya berhasil dan website baru saya secara sukses ter-deploy ke dalam aplikasi Herokuapp.
Link Gitlab: https://gitlab.com/gibranbrahmanta/story-6-ppw
Link Herokuapp: story-ppw-brahmanta.herokuapp.com
