Sprint Blog #3

Bram Sedana
slovneek
Published in
7 min readApr 1, 2019
Stress karena belum selesai UTS heheh

Haloo! Kembali lagi dengan saya, Bram Sedana, Hacker dari Kelompok D6 atau yang biasa dikenal di instagram dengan nama slovneek. Jadi pada sprint ini, kita memasuki masa-masa UTS, sehingga saya ingin membahas tentang Stress. Stress yang dimaksud disini bukan stress yang disebabkan oleh UTS, namun Testing.

Jadi pada blog ini, saya ingin menjelaskan tentang Testing: Mock Object, Stub (Isolation Testing), More Testing: Stress and Penetration, dan Data Seeding and Migration.

Testing! (Mock Object, Stub)

— Mock Object —

Apa itu mock? Kalau menurut google translate, mock artinya mengejek, tapi apa yang akan saya bahas bukan ini sih wkwk.

Image result for mock object testing

Mock Object, atau biasa saya panggil mock, itu mensimulasikan dependencies yang dibutuhkan class dalam melaksanakan testing seperti pada gambar diatas. Mock akan perform setiap call yang dia terima.

Bagaimana cara mock membantu dalam testing front-end? Kan terkadang ada component yang harus diinteraksi oleh user sehingga baru menjalankan fungsinya seperti suatu button baru akan menjalankan fungsinya setelah diklik oleh user. Nah, mock ini akan mensimulasikan “klik” pada button sehingga fungsi pada button dapat dilakukan test.

Berikut adalah contoh potongan kode mock

Berikut adalah test untuk ContentModulePage. Pada test di atas, mock akan mensimulasikan klik button, jika button diklik akan mengeluarkan component modal. Simulasi klik tersebut bisa dilakukan denngan menjalankan function .simulate(‘click’), lalu akan dicek apakah component modal berhasil keluar atau tidak dengan melakukan assert/expect.

— Stub —

Stub ini adalah objek yang menyimpan data yang sudah didefinisikan dari awal dan digunakan untuk perform call saat test. Biasanya stub akan digunakan jika kita tidak ingin melibatkan objek yang akan mereturn data asli, di kasus seperti ini kita gantikan dengan stub dan kita define sendiri data yang akan direturn oleh stub.

Selain itu, stub juga bisa digunakan untuk menggantikan suatu program atau module yang masih dalam progress (Work In Progress). Sehingga kita masih bisa melanjutkan testing tanpa harus menunggu implementasi dari module atau program tersebut.

Image result for stub testing

Bagaimana cara kerja stub? Seperti pada gambar, untuk mengetes suatu fungsi pada student, dibutuhkan mengambil data dari gradesystem yang akan mengembalikan nilai suatu murid. Agar kita tidak perlu menggunakan data asli nilai suatu murid, lebih baik kita menggunakan stub untuk module pengambil nilai seperti pada potongan kode berikut:

public class GradeSystem {
private final Gradebook gradebook;

public GradeSystem (Gradebook gradebook) {
this.gradebook = gradebook;
}
Double averageGrades(Student student) {
return gradebook.gradesFor(student));
}
}

Sehingga saat dilakukan testing akan menjadi seperti berikut:

public class GradesSystemTest {    
private Student student;
private Gradebook gradebook;
@Before
public void setUp() throws Exception {
gradebook = mock(Gradebook.class);
student = new Student();
}
@Test
public void calculates_grades_average_for_student() {
when(gradebook.gradesFor(student)).thenReturn(grades(8, 6, 10)); //stubbing gradebook
double averageGrades = new GradesService(gradebook).averageGrades(student);
assertThat(averageGrades).isEqualTo(8.0);
}
}

More Testing!! (Stress and Penetration)

Dari test yang sudah kita pelajari sebelum-sebelumnya, banyak hal yang sudah tercakup dalam tersebut, namun banyak bukan berarti semuanya, terdapat beberapa yang belum ditest, dan beberapa hal dapat diselesaikan dengan test yang akan kita pelajari setelah ini yaitu Stress Testing dan Penetration Testing.

— STRESS —

Di saat mendevelop suatu aplikasi, terkadang kita tidak memperhitungkan apa yang akan terjadi kepada aplikasi kita jika terdapat banyak sekali user yang mengakses secara bersamaan. Nah situasi ini dapat kita simulasikan dengan melakukan test yang disebut dengan Stress Testing.

Apa itu sebenarnya Stress Testing? Stress Testing itu adalah sebuah tipe software testing untuk mengecek stability dan reliability sistem. Guna utama dari testing ini yaitu untuk mengecek ketahanan dan error handling pada kondisi dengan beban yang extreme.

Dalam Software Engineering, Stress testing sering dikenal sebagai Endurance Testing, karena dapat digunakan untuk mengecek batasan dimana program tersebut akan rusak.

Contoh Stress Testing untuk suatu web dapat dilakukan dengan melakukan post sebanyak ribuan dalam jangka waktu yang sangat singkat (Bisa menggunakan postman untuk melakukan Stress Testing)

— Penetration —

Selain Stress Testing, juga perlu dicek keamanan pada aplikasi kita, terutama jika mengandung informasi-informasi penting seperti password, informasi kartu kredit, atau data-data sensitif lainnya. Untuk mengecek keamanan terseut, dapat digunakan Penetration Testing.

Penetration Testing ini sesuai dengan namanya, adalah test yang berusaha untuk mempenetrasi keamanan aplikasi kita. Terdapat beberapa tahapan pada Penetration Testing, yaitu:

Reconnaissance / Planning

Pada tahap ini, kita menentukan scope dan goal dari test serta metode testing yang akan digunakan. Selain itu, pada tahap ini kita juga berusaha memahami bagaimana cara kerja dari aplikasi serta mencari potential vulnerabilities pada aplikasi.

Scanning

Pada tahap ini, dilakukan analisis terhadap bagaimana aplikasi akan merespon terhadap cyberattack. Hal tersebut biasanya dilakukan dengan cara:

  • Static Analysis: menganalisa kode untuk mengestimasi bagaimana kode akan bekerja saat dijalankan.
  • Dynamic Analysis: menganalisa kode selagi kode tersebut sedang dalam state berjalan. Lebih praktikal untuk digunakan karena menyediakan hasil real-time terhadap performa suatu aplikasi.

Exploit Vulnerabilities

Pada tahap ini, dilakukan serangan terhadap potential vulnerabilities yang ditemukan sebelumnya, atau dilakukan juga upaya serangan menggunakan teknik serangan lainnya.

Gain Access

Setelah berhasil membobolkan keamanan, diambil data sebagai bukti bahwa berhasil meng-exploit vulnerability, selain itu dicek seberapa besar kerusakan yang bisa dilakukan.

Maintain Access

Tujuan tahap ini yaitu untuk mengecek apakah vulnerabilities tersebut dapat digunakan untuk mendapatkan akses kepada sistem dalam waktu yang cukup lama sehingga bisa didapatkan in-depth access. Hal ini dilakukan dengan mengimitasi advanced persistent threats, yang sering menetap pada sistem berbulan-bulan untuk mencuri data sensitif suatu organisasi.

Report

Pada tahap ini, dibuat laporan mengenai:

  • Vulnerabilites yang dapat dieksploitasi
  • Data sensitif yang dapat diakses
  • Berapa lama tester dapat mengakses sistem tanpa diketahui

Laporan tersebut kemudian dapat digunakan untuk meningkatkan aplikasi yang ditesting tersebut.

Data Seeding and Migration

Karena daritadi kita sudah membahas banyak tentang Testing dan More Testing, pasti sudah mulai enek kan dengerin kata testing (yang pasti saya sudah hehehe). Jadi lebih baik kita membahas hal lain yang seharusnya tidak ada hubungannya dengan Testing, yaitu Data Seeding dan Migration!

— Migration —

Dari gambar diatas seharusnya sudah menjelaskan dengan jelas pengertian migration. Nah, sebenarnya gambar diatas tidak ada hubungannya sama sekali dengan migration yang akan kita bahas. Migration yang akan kita bahas ada hubungannya dengan database.

Apa sih Migration? Sebelum kita masuk ke situ, lebih baik kita bahas dulu tentang tabel pada database. Tabel pada database memberi tahu bentuk data yang akan disimpan

Data tabel mengenai posisi kerja

Pada gambar diatas, terdapat baris dan kolom kan? Apa sih maksudnya? Kolom pada data tabel itu menunjukkan attribute yang dimiliki oleh data tersebut, seperti pada contoh gambar diatas, dapat dikatakan bahwa data yang disimpan terdiri dari attribute posisi, gaji, lokasi kantor, dan seterusnya. Sedangkan baris pada tabel itu menunjukkan data yang sudah tersimpan dalam tabel tersebut, dari contoh diatas, dapat dikatakan bahwa sudah terdapat 10 data di dalam database.

Pada proyek PPL ini, kami menggunakan Django. Pada Django terdapat yang disebut model. Model ini merupakan data tabel yang digunakan pada Django. Apa kaitannya dengan migration? Migration itu untuk memberi tahu pada database bahwa telah terjadi perubahan pada model nya. Cara menjalankan migration pada Django adalah seperti berikut.

# membuat migration baru dari perubahan yang dilakukan pada model
> python manage.py makemigrations
# mengaplikasikan migration yang sudah dibuat sebelumnya
> python manage.py migrate

— Data Seeding —

Sekarang kita akan membahas tentang Data Seeding. Nah apa sih yang dimaksud Data Seeding? Sama seperti gambar diatas, Data Seeding itu menanam, tapi bukan berarti menanam tanaman seperti pada gambar, melainkan menanam sebuah data dummy pada tabel sehingga minimal terdapat sebuah data sehingga bisa dilakukan testing terhadap database tersebut (yah nyambung lagi ke testing).

Data Seeding ini biasa dilakukan setelah membuat suatu model /tabel. Proses tersebut dilakukan dengan menyiapkan data-data dalam file JSON yang bentuknya sudah sesuai dengan model/tabel data. Best practicenya yaitu dengan menyimpan file tersebut di dalam folder fixture. Contoh file nya:

[
{
"model: "bdd-content.DataDefinition",
"pk": "1",
"fields": {
"name": "Hacker",
"definition": "Capek"
}
}
]

Untuk membaca file tersebut, Django sudah menyiapkan fungsi yaitu dengan menjalankan command

> python manage.py loaddata nama_file.json

Namun, penggunaan loaddata dapat menyebabkan sebuah inkonsistensi antara model dengan database, hal tersebut dikarenakan fungsi tersebut tidak dapat mengatasi perubahan pada model seperti penambahan attribute pada model yang wajib diisi. Untuk mengatasi masalah tersebut, dapat dilakukan dengan membuat fungsi yang dapat menangkap jika terjadi error, cara mengatasinya bisa seperti berikut:

from django.db import migrations
from django.core.serializers import base, python
from django.core.management import call_command


def load_fixture(apps, schema_editor):
old_get_model = python._get_model

def _get_model(model_identifier):
try:
return apps.get_model(model_identifier)
except (LookupError, TypeError):
raise base.DeserializationError("Invalid model identifier: '%s'" % model_identifier)


python._get_model = _get_model

try:
# Call loaddata command
call_command('loaddata', 'your_data.json', app_label='yourapp')
finally:
# Restore old _get_model() function
python._get_model = old_get_model


class Migration(migrations.Migration):
dependencies = [
# Dependencies to other migrations
]

operations = [
migrations.RunPython(load_fixture),
]

Sekian

Cukup sampai sini saja yang bisa sampaikan, semoga untuk kedepannya saya bisa lebih termotivasi dan lebih jelas lagi dalam menjelaskan materi pada blog ini. Sampai ketemu di Sprint blog selanjutnya!

--

--