Akhdani Tech Talk 2021 Series #5 – Test Driven Development

Test Driven Development

Oleh: Agus, Dimas, Moris

Apa itu Test Driven Development (TDD)

Praktek koding yang pertama kali dibuat adalah uji tesnya, lalu membuat koding yang bisa membuat test tersebut lolos. Menagapa harus TDD ? TDD baiknya digunakan apabila Anda ingin menjaga base code dalam waktu yang lama.  TDD itu merupakan proses tertutup yang berulang. Hal ini membuat programmer paham dengan apa yang dia buat. Sebagai contoh berikut adalah gambaran dari proses pembuatan TDD tersebut

Mengapa menggunakan TDD?

Karena TDD adalah cara paling sederhana untuk mencapai kode berkualitas baik dan cakupan pengujian yang baik.

Untuk Jawaban lebih panjang, keep scrolling!

Lima langkah dalam flow TDD

  1. Baca, pahami dan proses permintaan fitur atau fix-bug.
  2. Terjemahkan persyaratan dengan menulis tes unit. Jika memiliki pengaturan hot-reload, unit test akan berjalan dan gagal karena belum ada kode yang diimplemen.
  3. Tulis dan implementasikan kode yang memenuhi persyaratan. Jalankan semua tes dan pastikan test berhasil/lulus. Jika ada yang tidak lulus ,silakan ulangi langkah ini.
  4. Bersihkan kode dengan refactoring.
  5. Check dan ulangi hingga test sudah bisa diimpelemtasikan untuk produksi (production).

tdd

tdd-red-green-refactoring-v3

 

 

Terdapat beberapa keuntungan dan kekurangan yang didapatkan jika menggunakan metode TDD. Berikut adalah contohnya :

Keuntungan : 

  1. Bisa memberitahu pada kondisi apa kodingan tersebut bisa berjalan sempurna dan tidak jalan sempurna. Programmer bisa mengetahui jika terjadi kesalahan karena sebelumnya kodingan tersebut berjalan dengan baik.
  2. Membuat waktu yang lebih singkat untuk melakukan refactor kodingan jika diperlukan, karena programmer dapat mengetes dengan mudah.
  3. Membuat programmer lebih percaya diri. karena apabila ada penambahan fitur, dapat dites dengan mudah.

Kekurangan : 

  1. Tidak mudah untuk memulai dengan TDD. Anda harus mengetahui mengetahui banyak praktik dan teknik baru. Contoh: unit testing, dan asertions, dll.
  2. Dibutuhkan lebih banyak waktu diawal saat melakukan pengembangan, karena Programmer harus menguji kode saat membuat kodingan juga.

Secara umum, TDD dapat dibagi menjadi 4 bagian yaitu : 

  1. Unit Testing: Unit test yang paling rendah. Biasanya yang di test hanya 1 method. Hal ini membuat unit testing mudah untuk digunakan.
  2. Integration Testing: Integration testing yang menyentuh beberapa class. Selain berhubungan dengan beberapa class, ada juga yang berhubungan dengan pihak external lainnya, misalnya API lain. 
  3. Functional Testing: Functional testing adalah tipe testing yang dilakukan kepada semua fitur. Testing ini agak memakan banyakan waktu karena fitur yang dites nya lebih banyak dari integration testing.
  4. Acceptance Testing: Acceptance testing merupakan test yang paling atas. Testing ini hanya dianggap sukses apabila customer sudah mengatakan testnya selesai.

Sebagai contoh, disini kita akan membuat 1 bagian TDD yaitu unit testing. Sebagai awalan, framework yang digunakan adalah menggunakan laravel (contoh menggunakan laravel karena saat menginstal laravel sudah sekaligus otomatis terinstal contoh unit testnya). Untuk menjalankan TDD secara otomatis, ketikan “vendor\bin\phpunit” pada root folder laravel.

Script test yang dibuat biasanya disimpan pada folder test\Unit

folder

lalu pada terminal akan muncul tampilan seperti ini

success1

hal tersebut menandakan bahwa semua test lolos.

sebagai contoh lain, kita buat 1 class yang bernama Calculate yang isinya 1 methode untuk menghitung luas

public function areaOfSquare($length)
{
    return pow($length, 2);
}

lalu buat class testnya yang bernama CalculateTest pada folder “tests\Unit”

 

folder-2

 

buat 1 method pada CalculateTest yang berfungsi untuk mengetes hasil balikan dari method “areaOfSquare” pada class “Calculate”

public function test_areaOfSquare_WhenCalledWithLength2_Return4()
{
    $this->calculate = new Calculate();

    $length = 2;

    $response = $this->calculate->areaOfSquare($length);

    $this->assertTrue(is_int($response));
    $this->assertEquals(4, $response);
}

jalankan test maka akan menghasilkan tampilan seperti berikut

success1

untuk apabila ada logic yang salah pada method “areaOfSquare” pada class “Calculate”, maka akan muncul tampilan seperti berikut.

error

 

disana disebutkan bahwa pada test “test_areaOfSquare_WhenCalledWithLength6_Return36″ hasil yang diharapkan adalah 36, sedangkan hasil yang keluar dari uji test adalah 216. dari sana bisa diambil kesimpulan bahwa kodingan di method “areaOfSquare” pada class “Calculate” terdapat kesalahan. Namun tidak menutup kemungkinan juga jika output yang ditulis pada script test yang dibuat salah. padahal hasil yang dikeluarkan oleh kodingan di method tersebut betul.

Kesimpulan :

Pengembangan berbasis tes (TDD) adalah teknik pengembangan di mana harus terlebih dahulu menulis tes yang gagal sebelum menulis kode fungsional baru. TDD dengan cepat diadopsi oleh pengembang perangkat lunak tangkas untuk pengembangan kode sumber aplikasi. TDD tidak menggantikan pengujian tradisional, melainkan mendefinisikan cara yang telah terbukti untuk memastikan pengujian unit yang efektif. Efek samping dari TDD adalah bahwa tes yang dihasilkan adalah contoh kerja untuk menjalankan kode, sehingga memberikan spesifikasi kerja untuk kode tersebut. Pengalaman pribadi, bahwa TDD bekerja dengan sangat baik dalam praktiknya dan ini adalah sesuatu yang harus dipertimbangkan oleh semua pengembang perangkat lunak.

 

Mengenal Build Tools Gradle

Bagi para pengembang aplikasi, mungkin pernah mendengar istilah ant, gradle, maven, nodejs, npm, composer atau bower ketika sedang mencari sesuatu. Namun apakah yang dimaksud dengan istilah-istilah tersebut ?

Istilah-istilah tersebut merupakan beberapa contoh build tools yang digunakan oleh java, php, atau javascript. Build tools itu sendiri adalah program yang mengotomatiskan proses eksekusi aplikasi dari suatu soure code. Pada dasarnya proses otomatisasi dilakukan oleh pengembang aplikasi untuk melakukan hal hal seperti:

1. Mendownload dependencies.

2. Mengcompile dan mempackaging source code kedalam binary.

3. Melakukan deployment ke production sistem.

Setiap build tools yang digunakan memiliki konfigurasi yang berbeda beda agar dapat berjalan. Contohnya untuk build tools gradle, langkah pertama agar gradle dapat berjalan adalah dengan cara mendownload gradle terlebih dahulu lalu ekstrak hasil file download tersebut. Selanjutnya tambahkan variabel GRADLE_HOME pada environtment variabel (klik kanan my computer -> properties -> advance system settings ->environtment variable ), dan tambahkan juga GRADLE_HOME\bin pada variable path. Agar mengetahui apakah gradle sudah terpasang atau belum, cukup ketikkan gradle -v pada console cmd.

Konfigurasi gradle ada pada file build.gradle. Berikut adalah contoh isi dari file build.gradle

buildscript {
   ext {
      springBootVersion = '2.0.3.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'id.co.akhdani'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}


dependencies {
   // Apache commons
   compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
   compile group: 'commons-codec', name: 'commons-codec', version: '1.9'
   // DB Connection Pool
   compile group: 'com.zaxxer', name: 'HikariCP', version: '3.2.0'

   // thymeleaf
   compile('org.springframework.boot:spring-boot-starter-thymeleaf')
   compile group: 'nz.net.ultraq.thymeleaf', name: 'thymeleaf-layout-dialect', version: '2.3.0'
   compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity4')

   runtime('org.postgresql:postgresql')

   runtime('org.springframework.boot:spring-boot-devtools')
   testCompile('org.springframework.boot:spring-boot-starter-test')
   compile('org.springframework.boot:spring-boot-starter-web')

   compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.6'
   compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.6'

}

Untuk menambahkan suatu library gradle  kedalam project yang sedang dikerjakan, dapat dilakukan dengan cara menambahkan nya pada file build.gradle, dependencies. Sebagai contoh, kita ingin menambahkan library hikaricp kedalam project, langkah pertama yang dilakukan adalah dengan cara mencari nya pada google, biasanya akan diarahkan pada situs mvnrepository.com. setelah selesai memilih versi berapa yang akan dipakai, klik pada tab gradle, lalu copy tulisan yang ada pada tab tesebut (misal)

   compile group: 'com.zaxxer', name: 'HikariCP', version: '3.2.0'

kedalam dependencies, sehingga dependencies nya akan menjadi seperti ini

dependencies {
   // DB Connection Pool
   compile group: 'com.zaxxer', name: 'HikariCP', version: '3.2.0'
}

 

Setelah project selesai dibuat, langkah selanjutnya adalah melakukan build project. caranya dengan mengetikkan

gradle build

pada console atau terminal. gradle build berfungsi untuk mengkompile code kedalam suatu jar file yang dapat dieksekusi. Apabile build berhasil makan akan muncul tulisan

BUILD SUCCESSFUL

 

Sumber

https://www.techopedia.com/definition/16359/build-tool

https://www.okedroid.com/2016/10/belajar-mengenal-gradle-di-android-studio.html

http://ansorpunya.blogspot.com/2014/12/memulai-spring-dengan-gradle.html

https://spring.io/guides/gs/gradle/#initial

Mengenal SEO

SEO, SEO, SEO, apa itu SEO? Search Engine Optimization atau biasa disingkat SEO adalah sebuah proses agar sebuah website dapat dikenali oleh search engine seperti google. Tujuan utama dari SEO adalah website muncul pada halaman pertama pada suatu search engine, atau lebih baiknya lagi berada pada halaman pertama dan baris pertama. Dikarenakan SEO adalah sebuah proses, diperlukan langkah agar sebuah website dapat dikenali oleh search engine.

Apakah perlu SEO? Bagi para pengusaha yang websitenya ingin dilihat oleh orang banyak tentunya SEO sangat diperlukan. Sebagai contoh seorang pengusaha sabun memiliki webiste dengan nama sabunx. Agar sabunnya terjual melalui website tentunya website tersebut harus diketahui oleh orang lain. Bagaimana cara orang lain mengetahui website tersebut? tentunya melalui search engine. Orang yang ingin membeli sabun pertama mencari melalui search engine dengan kata kunci misalnya “jual sabun”. Search engine menampilkan list website yang berkaitan dengan kata kunci “jual sabun”. Orang yang ingin membeli sabun pertama kali tentunya akan melihat pada halaman pertama baris pertama. Apa yang terjadi apabila website sabunx yang dimiliki oleh pengusaha tersebut tidak berada pada halaman pertama baris pertama? tentunya produk yang dijual oleh pengusaha tersebut tidak akan laku. Dari contoh tersebut, SEO menjadi hal yang sangat penting bagi suatu website agar selalu muncul ketika seseorang mengetikan suatu kata kunci pada search engine.

Terdapat beberapa cara agar website dapat muncul di halaman pertama pada suatu search engine. Cara tersebut bisa dilakukan dengan cara melakukan perubahan pada halaman website agar search engine dapat mengenali website berdasarkan kata kunci yang dicari oleh pengguna. Perubahan pada halaman website tersebut berada pada bagian nama domain, title tag, meta description tag, kategori dan sub kategori halaman, url, heading, alt dari suatu image, isi halaman (body), tautan external kepada website yang sudah terkemuka.

Selain dengan cara melakukan perubahan pada halaman website, cara lainnya adalah dengan cara melakukan backlink. Backlink adalah menuliskan nama website kepada website lain. Pengusaha sabun memiliki website sabunx.com, lalu nama website tersebut dituliskan kolom komentar pada website terkenal yang berkaitan dengan sabun. Hal tersebutlah yang dinamakan backlink.

Seberapa Besar tingkat SEO Anda? Ada banyak tools yang dapat digunnakan untuk memeriksa seberapa tinggi SEO yang ada pada suatu website misalnya https://neilpatel.com/seo-analyzer/, https://sitechecker.pro/, atau https://seositecheckup.com. Tools-tools tersebut memberikan info mengenai apa yang kurang dari SEO yang sudah diterapkan pada suatu website misalnya kurangnya meta description, atau alt pada suatu gambar. Namun seberapa tinggipun skor SEO pada website pada tools-tools tersebut, tentunya tidak menjanjikan bahwa website tersebut akan ada pada halaman pertama atau baris pertama pada suatu search engine.

Teruslah update website dengan konten yang relevan, sering-sering menggunakan cara backlink agar website menjadi populer agar posisi website berada pada halaman pertama suatu search engine.

Sumber:

http://semseomanagement.com/apa-itu-seo/

https://www.shoutmeloud.com/backlink.html

Mengenal Keamanan API (Application Programming Interface)

API (Application Programming Interface) merupakan sekumpulan sintak yang berisi perintah atau fungsi yang dapat digunakan untuk berinteraksi dengan sistem operasi tertentu atau dengan sistem lainnnya. Sebuah API dapat diimplementasikan dengan menulis sintaks dalam program yang menyediakan sarana untuk meminta layanan program tersebut.

Sebagai contoh, Facebook menyediakan API sehingga para pengembang website dapat mengintegrasikan komentar di websitenya langsung melalui komentar akun Facebook si pengunjung, atau yang lebih spesifik lagi API Facebook juga dapat digunakan untuk membuat fungsi auto post artikel ke Facebook saat artikel di website ditambahkan. Semua ini dapat dilakukan karena Facebook menyediakan API untuk dapat mengakses sebagian fungsi dari program Facebook.

Berikut adalah ilustrasi permintaan layanan data pelanggan ke sistem (misalnya) X menggunakan API:

contoh-api

Sistem X mengembalikan data pelanggan sesuai dengan permintaan yang diminta oleh client dengan berbagai format data yang disediakan oleh sistem, misalnya JSON, XML, dan sebagainya. Pada contoh di atas, data yang dikirimkan oleh sistem X merupakan data pelanggan dan bisa dibayangkan apabila ketika data pelanggan yang dikirimkan kepada client di tengah jalan sebelum diambil oleh seseorang atau hacker untuk kepentingan yang tidak seharusnya? Misal data yang diambilnya adalah nomor telepon, alamat, dan nomor kartu kredit. Tentunya hal tersebut tidak boleh terjadi ketika menggunakan API. Oleh karena itu, API  harus didesain sebagus mungkin agar terhindar dari hal-hal semacam itu.

Ada tiga faktor utama yang menjadi sasaran hacker terhadap penggunaan API. Ketiga faktor itu adalah parameter, identitas, man-in-the-middle. Berikut adalah penjalasan dari ketiga faktor tersebut.

  1. Parameter, sasaran ini dilakukan dengan cara mengirimkan data input secara terus menerus kepada suatu fungsi API agar hacker mendapatkan data yang diinginkan olehnya, sepertinya misalnya data pelanggan. Para hacker dapat membaca respon balikan dari API, karena biasanya API mendefinisikan dengan jelas data balikan yang dikirim. Sasaran ini memang bukan hal baru, namun sering banyak digunakan karena kebanyakan developer mengabaikan untuk memfilter inputan pada api yang digunakan.
  2. Identitas, dilakukan dengan cara mengekploitasi kelemahan dari otentikasi, otorisasi dan penggunaan session. Kelemahan pada API dicari  karena kesalahan dalam mempraktekkan penggunaan otentikasi, otorisasi, dan session pada API. Dalam penggunaan API dalam suatu sistem, biasanya API pengirim memiliki suatu identitas (key) agar dikenali oleh API penerima. API key ini tersimpan pada aplikasi pengirim yang digunakan untuk keperluan autorisasi misalnya. Meskipun API key ini disimpan secara baik oleh pengirim API, biasanya API key mudah untuk ditemukan oleh hacker. Yang perlu digaris bawahi adalah jangan pernah memperlakukan API key sebagai sesuatu yang rahasia.
  3. Man-in-the-middle, pada hal ini, hacker memposisikan dirinya berada diantara pengirim API (client) dan penerima API. Hacker melakukannya dengan cara mengambil data yang dikirimkan oleh user, lalu mengubah data tersebut, dan diteruskan kepada penerima API. Hal ini dapat terjadi karena data yang dikirimkan oleh client tidak terenkripsi. API yang tidak menggunakan SSL/TLS sangat rentan terhadap serangan ini. Namun sayangnya, kebiasaan developer membiarkan hal ini agar komunikasi antara pengirim API dan penerima API dapat dilihat dengan jelas. man-in-the-middle

 

Untuk menanggulangi ancaman dari ketiga faktor tersebut, API harus dibuat lebih aman dan tetap dapat berfungsi dengan semestinya. Berikut adalah penjelasan cara untuk menanggulangi acaman yang mungkin terjadi pada penggunaan API.

  1. Memvalidasi parameter, langkah pertama yang dilakukan adalah dengan cara memvalidasi semua data yang masuk oleh penerima API, pastikan data yang diterima valid dan tidak menyebabkan kerusakan. Cara yang paling efektif adalah dengan mendeskripsikan input apa saja yang boleh diterima oleh suatu fungsi pada penerima API. Selalu periksa inputan bertipe raw untuk menghindari SQL injection. Selain itu berhati hati dengan serangan denial of service (Dos) yang dapat menyebabkan penerima API menjadi hang atau tidak berfungsi karena menerima begitu banyak data dan ditambah lagi apabila data yang dikirimkan data bertingkat. Gunakan pendeteksi virus untuk memeriksa beberapa konten file apabila penerima API dapat mendecode base64 attachment agar file attachment tersebut benar-benar bebas dari virus.
  2. Gunakan SSL/TLS untuk semua API. Untuk jaman sekarang, SSL bukan hal yang mewah lagi, tapi merupakan kebutuhan yang mendasar sebagai API. Dengan menambahkan SSL/TLS dan menerapkannya dengan benar merupakan hal yang sangat efektif untuk melawan serangan man-in-the-middle. SSL/TLS memberikan kepercayaan integritas pertukaran data diantara pengirim dan penerima API.
  3. Identitas user dan sistem yang menggunakan API merupakan sesuatu yang harus diimplementasikan dan dimanajemen secara terpisah. Selain menggunakan identitas user dan sistem sebagai tambahan keamanan, ada faktor lain yang dapat ditambahakan seperti alamat IP pengirim API, waktu akses API, identifikasi hardware (untuk penggunaan mobile apps), geolokasi, dan lainnya.

Sumber :

https://www.tuliskode.com/mengenal-konsep-application-programming-interface-api/

https://stormpath.com/blog/secure-your-rest-api-right-way

https://www.ca.com/content/dam/ca/us/files/ebook/five-simple-strategies-for-securing-apis.pdf

https://19yw4b240vb03ws8qm25h366-wpengine.netdna-ssl.com/wp-content/uploads/securing-the-api-stronghold.pdf

https://www.upwork.com/hiring/mobile/tips-for-building-a-safe-secure-api/

https://19yw4b240vb03ws8qm25h366-wpengine.netdna-ssl.com/wp-content/uploads/securing-the-api-stronghold.pdf