Fakultas Ilmu Komputer UI

Commit ff354ea9 authored by Rayza Arasj Mahardhika's avatar Rayza Arasj Mahardhika
Browse files

Merge branch 'exercise-6' into 'master'

Exercise 6

See merge request !5
parents f3686cef c06edc47
Pipeline #24101 failed with stage
in 1 minute and 22 seconds
......@@ -51,4 +51,58 @@ Pada bab 7 saya belajar bahwa dengan menambahkan fitur-fitur baru, fitur-fitur t
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.
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.
\ No newline at end of file
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`)
\ No newline at end of file
from django.apps import apps
from django.test import TestCase
from lists.apps import ListsConfig
class ListsConfigTest(TestCase):
def test_apps(self):
self.assertEqual(ListsConfig.name, 'lists')
self.assertEqual(apps.get_app_config('lists').name, 'lists')
\ No newline at end of file
......@@ -3,7 +3,7 @@ from django.test import TestCase
from django.http import HttpRequest
from django.utils.html import escape
from lists.views import home_page, about_page, \
COMMENTARY_ZERO, COMMENTARY_LESS_THAN_FIVE, COMMENTARY_MORE_THAN_EQUAL_FIVE
COMMENTARY_ZERO, COMMENTARY_LESS_THAN_FIVE, COMMENTARY_MORE_THAN_EQUAL_FIVE, get_commentary
from lists.models import Item, List
......@@ -125,4 +125,14 @@ class NewListTest(TestCase):
def test_invalid_list_items_arent_saved(self):
self.client.post('/lists/new', data={'item_text': ''})
self.assertEqual(List.objects.count(), 0)
self.assertEqual(Item.objects.count(), 0)
\ No newline at end of file
self.assertEqual(Item.objects.count(), 0)
class CustomTest(TestCase):
def test_commentary_correct_count_5_correct(self):
result = get_commentary(5)
self.assertEqual(result, COMMENTARY_MORE_THAN_EQUAL_FIVE)
def test_commentary_correct_count_less_than_5_correct(self):
result = get_commentary(4)
self.assertEqual(result, COMMENTARY_LESS_THAN_FIVE)
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
astmonkey==0.3.6
Django==2.2.5
django-mutpy==0.1.2
gunicorn==19.9.0
Jinja2==2.10.3
MarkupSafe==1.1.1
MutPy==0.6.0
pkg-resources==0.0.0
pydot==1.4.1
pyparsing==2.4.4
pytz==2019.2
PyYAML==5.1.2
selenium==3.141.0
sqlparse==0.3.0
termcolor==1.1.0
urllib3==1.25.3
......@@ -41,6 +41,7 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'lists',
'django_mutpy'
]
MIDDLEWARE = [
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment