Fakultas Ilmu Komputer UI

README.md 6.84 KB
Newer Older
Rayza Arasj Mahardhika's avatar
Rayza Arasj Mahardhika committed
1
# Rayza Arasj Mahardhika - 1606876052 - Practice Repo
Rayza Arasj Mahardhika's avatar
Rayza Arasj Mahardhika committed
2
3
4
PMPL Course - Class A

URL: http://pmpl-rayza.herokuapp.com
Rayza Arasj Mahardhika's avatar
Rayza Arasj Mahardhika committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

## Exercise - 3 : Test Isolation


### Test Isolation

Test Isolation adalah proses pemecahan sistem / aplikasi menjadi modul-modul kecil yang dapat dilakukan `test` ataupun `evaluasi` secara lebih mudah. Tipe software testing ini biasanya dilakukan jika bug yang ada pada aplikasi sulit untuk ditemukan. Dengan bantuan Test Isolation, testing dapat dilakukan dengan lebih mudah dan tanpa side effect apapun. Hal ini dikarenakan dengan menggunakan Test Isolation, testing akan dilakukan pada environment yang masih bersih dari side effect apapun serta dengan menggunakan database yang bersih pula.

### Implementation

Dalam tutorial-6 yang terdapat pada buku **Test-Driven Development with Python: Obey the Testing Goat: Using Django, Selenium, and JavaScript**, Test Isolation dilakukan dengan cara membuat `functional_test.py` yang sudah dibuat pada tutorial-tutorial sebelumnya menjadi suatu module pada django testing dengan memanfaatkan class `LiveServerTestCase`. Berikut adalah perubahan code yang terjadi dari `functional_test.py` menjadi `functional_tests/tests.py` :
#### Sebelum :
```
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import unittest

class  NewVisitorTest(unittest.TestCase):

	def  setUp(self):
		[...]
```
#### Sesudah :
```
from django.test import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import WebDriverException
import time

class  NewVisitorTest(LiveServerTestCase):

	def  setUp(self):
		[...]
```

42
43
44
45
Dengan melakukan perubahan tersebut, To-Do List yang ada pada aplikasi selalu mulai dari kosong pada saat menjalankan test. Berbeda ketika belum menggunakan `LiveServerTestCase` dimana To-Do List yang ada akan terus bertambah saat dijalan dari test ke test berikutnya.

## Exercise - 4 : Prettification

46
47
48
49
50
51
52
53
Pada bab 7 saya belajar bahwa dengan menambahkan fitur-fitur baru, fitur-fitur tersebut harus dapat dipecah agar dapat dilakukan test terhadap fitur tersebut. Tidak terkecuali jika ingin menambahkan styling atau prettification yang dilakukan pada bab 8, styling tersebut pun harus dapat dipecah agar dapat dilakukan test. Testing pada styling yang dilakukan pada bab 8 adalah mengecek apakah input berada pada tengah layar atau tidak. Untuk membuat css yang dapat menggagalkan test yang sudah ada, saya menambahkan id pada div yang membuat input tersebut berada di tengah layar, lalu saya menambahkan styiling baru dengan menggunakan id tersebut untuk membuat text berada di sebelah kiri dengan menggunakan styling `text-allign: left`.

## Exercise - 5 : Test Organization

### Jelaskan keterkaitan antara penerapan refactoring (Red, Green, Refactor) dengan konsep clean code.
Red, Green, Refactor adalah tahapan-tahapan yang ada pada TDD (Test Driven Development). Red melambangkan tahap dimana kita sudah menuliskan test yang ingin kita lakukan terhadap kode kita. Green melambangkan tahap dimana kita sudah berhasil mengimplementasikan kode kita sehingga menghasilkan test yang berhasil dijalankan. Refactor melambangkan tahap dimana kita melakukan refactor terhadap kode kita yang sudah berhasil ditest (green). Keterkaitannya denga clean code adalah dengan menggunakan Red, Green, Refactor diharapkan kode yang dibuat dapat tersusun rapih dan bersih. Hal ini dikarenakan setiap proses penulisan kode yang dilakukan pasti akan ditest terlebih dahulu. Dan jika terdapat code yang kotor (code smell) akan dibersihkan pada tahap refactor.

### Jelaskan keuntungan yang dapat kita dapatkan dengan menrapkan Test Organization.
Rayza Arasj Mahardhika's avatar
Rayza Arasj Mahardhika committed
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Dengan menerapkan Test Organization, test yang kita miliki akan tersusun rapih. Berbeda dengan sebelum melakukan Latihan 5, test yang ada pada repo Latihan ini hanya berada di satu file baik untuk functional_test ataupun unit_test. Hal ini akan menjadi code smell jika file yang kita miliki semakin panjang. Oleh karena itu diperlukan Test Organization agar test yang kita miliki tetap maintainable dan tidak menimbulkan code smell. Dengan pemisahan file test ini juga kita jadi dapat memilih file mana saja yang ingin kita jalankan testnya, dimana sebelumnya jika kita ingin melakukan test hanya pada suatu fungsi, kita harus menjalankan semua test yang ada pada file tersebut.

## Exercise - 6 : Mutation

### Mutasi 1 : Relational Operator Replacement
Pada mutasi peratama ini saya menggunakan mutasi Relational Operator Replacement (ROR) dimana mutasi ini mengubah operator perbandingan, dari `<` menjadi `<=`. Saya membuat test dimana mengecek case khusus sepert `item_count` 5, dimana seharusnya mengembalikan `oh tidak`.

Code:
```
def get_commentary(item_count):
    if (item_count == 0):
        return COMMENTARY_ZERO
    elif (item_count <= 5):
        return COMMENTARY_LESS_THAN_FIVE
    elif (item_count >= 5):
        return COMMENTARY_MORE_THAN_EQUAL_FIVE
```
Test:
```
def test_commentary_correct_count_5_correct(self):
        result = get_commentary(5)
        self.assertEqual(result, COMMENTARY_MORE_THAN_EQUAL_FIVE)
```

### Mutasi 2 : Scalar Variable Replacement
Pada mutasi kedia ini saya menggunakan mutasi Scalar Variable Replacement (SVR) dimana mutasi ini mengubah variable yang digunakan pada suatu line code, pada mutasi ini saya mengganti variable `COMMENTARY_LESS_THAN_FIVE` menjadi `COMMENTARY_MORE_THAN_EQUAL_FIVE`. Saya membuat test dimana mengecek penggunaan variable tersebut.

Code:
```
def get_commentary(item_count):
    if (item_count == 0):
        return COMMENTARY_ZERO
    elif (item_count < 5):
        return COMMENTARY_MORE_THAN_EQUAL_FIVE
    elif (item_count >= 5):
        return COMMENTARY_MORE_THAN_EQUAL_FIVE
```
Test:
```
def test_commentary_correct_count_less_than_5_correct(self):
        result = get_commentary(4)
        self.assertEqual(result, COMMENTARY_LESS_THAN_FIVE)
```

### Mutation Tool (django-mutpy)
Setelah saya menggunakan django-mutpy untuk pertama kali (hasil dapat dilihat di file `mutation_test.result`), terdapat 46 mutasi yang survived dan 6 mutasi yang timeout. Mutasi yang survived mayoritas meruapakan mutasi pada migration file, sedangkan mutasi yang timeout semuanya karena mutasi AOR pada penjumlahan string yang memang akan membuat file gagal.

### After Mutation Tool (django-mutpy)
Setelah melihat hasil pada file `mutation_test.result`, saya melihat terdapat mutasi yang survived pada file `apps.py`. Hal ini dikarenakan memang belum ada test yang dibuat untuk melakukan test pada file `apps.py`. Oleh karena itu saya menambahkan test berikut pada file `test_apps.py`:
```
def test_apps(self):
        self.assertEqual(ListsConfig.name, 'lists')
        self.assertEqual(apps.get_app_config('lists').name, 'lists')
```
Dengan test tersebut jumlah mutant yang survived berkurang menjadi 44 karena terdapat 2 mutant yang berhasil di kill. (hasil baru dapat dilihat di file `mutation_test_after.result`)