diff --git a/README.md b/README.md index 69d1774b957bee8b3232706dc83f9d3bb716c49a..530da8eb4336574e5cdaf5c084fad2f8d77f0d24 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,108 @@ Test isolation yang dilakukan adalah test dapat berjalan sesuai dengan request dari url liveserver bukan dari url yang ditentukan pada awal yaitu localhost -Fitur yang ditambahkan adalah proses menunggu 10 detik tidak dilakukan hanya dengan serta merta menunggu melainkan dengan proses menunggu dari webdriver hingga input muncul selama 10 detik \ No newline at end of file +Fitur yang ditambahkan adalah proses menunggu 10 detik tidak dilakukan hanya dengan serta merta menunggu melainkan dengan proses menunggu dari webdriver hingga input muncul selama 10 detik + +## Latihan 6 + +#### Mutant 1 (ABS –– Absolute Value Insertion) + ```python + def home_page(request): + if request.method == 'POST': + Item.objects.create(text=request.POST['item_text']) + return redirect('/') + + items = Item.objects.all() + comment = counter_comment(abs(Item.objects.count())) + return render(request, 'homepage/home.html', {'items': items, 'comment' : comment, 'name': 'Izzatul Muttaqin'}) + ``` + +#### Mutant 2 (UOI –– Unary Operator Insertion) + ```python + def home_page(request): + if request.method == 'POST': + Item.objects.create(text=request.POST['item_text']) + return redirect('/') + + items = Item.objects.all() + comment = counter_comment(-(Item.objects.count())) + return render(request, 'homepage/home.html', {'items': items, 'comment' : comment, 'name': 'Izzatul Muttaqin'}) + ``` +#### Test Suit + ```python + def test_all_comment(self): + request = HttpRequest() + response = home_page(request) + + self.assertIn('yey, waktunya libur', response.content.decode()) + + Item.objects.create(text='itemey 1') + Item.objects.create(text='itemey 2') + + request = HttpRequest() + response = home_page(request) + + self.assertIn('sibuk tapi santai', response.content.decode()) + + Item.objects.create(text='itemey 3') + Item.objects.create(text='itemey 4') + Item.objects.create(text='itemey 5') + + request = HttpRequest() + response = home_page(request) + + self.assertIn('oh tidak', response.content.decode()) + ``` +Test suit yang dibuat memiliki hasil yang berbeda untuk kedua mutant yang dibuat. Dengan ketentuan mutant hanya dapat di buat dalam fungsi yang ada di helper. + +Untuk mutant yang pertama, tidak dapat dilakukan 'kill' untuk testcase apapun. Karena hasil dari komen akan langsung didapatkan dari perhitungan data dalam database Item. Oleh sebab itu, angka yang mungkin didapatkan adalah dari 0 hingga tak hingga sesuai dengan jumlah data pada saat itu. Angka tersebut merupakan 0 atau positif sehingga absolute mutant tidak mengubah hasil dari angka database. + +Untuk mutant yang kedua, dapat dilakukan 'strongly kill' dengan test suit tersebut. Karena hasil dari komen akan langsung didapatkan dari perhitungan data dalam database Item yang akan diubah menjadi angka negatif. Oleh sebab itu, akan terjadi fail untuk angka yang lebih besar dari 0 karena menjadi angka negatif sehingga pada test case `self.assertIn('sibuk tapi santai', response.content.decode())` akan fail. + +### Menggunakan mutation testing tool yaitu MutPy + +Dalam menjalankan `python3 manage.py muttest practice` + +Hasil akhirnya adalah sebagai berikut: + +[*] Mutation score [5.84569 s]: 93.8% + - all: 48 + - killed: 45 (93.8%) + - survived: 3 (6.2%) + - incompetent: 0 (0.0%) + - timeout: 0 (0.0%) + +Terdapat 3 mutant yang tidak terbunuh yaitu + +```python + 1: from django.apps import AppConfig + 2: + 3: + 4: class PracticeConfig(AppConfig): +- 5: name = 'practice' ++ 5: name = 'mutpy' +``` + +```python + 1: from django.apps import AppConfig + 2: + 3: + 4: class PracticeConfig(AppConfig): +- 5: name = 'practice' ++ 5: name = '' +``` + +```python + 1: def counter_comment(number): + 2: if number == 0: + 3: return 'yey, waktunya libur' + 4: +- 5: if (number < 5 and number > 0): ++ 5: if (number < 5 and number >= 0): + 6: return 'sibuk tapi santai' + 7: + 8: if number >= 5: + 9: return 'oh tidak' +``` + +Untuk 2 kasus pertama, mutant survived karena dilakukan perubahan nama apps. Hal ini tidak mempengaruhi apapun karena dalam tutorial hanya terdapat 1 apps saja. Untuk kasus ke 3, dilakukannya ROR –– Relational Operator Replacement dari > menjadi >= tidak mengubah hasil apapun karena kasus jika number == 0 sudah dilakukan return sehingga tidak akan melewati baris ke 5 yang dilakukan mutation. diff --git a/practice/tests.py b/practice/tests.py index 93b05703ddb3dd9e2c8e0d36db6afa6b87037d0c..0611d7a9d9d488f9289f190bb0131efed6b39e2c 100644 --- a/practice/tests.py +++ b/practice/tests.py @@ -70,6 +70,29 @@ class HomePageTest(TestCase): self.assertIn('itemey 1', response.content.decode()) self.assertIn('itemey 2', response.content.decode()) + def test_all_comment(self): + request = HttpRequest() + response = home_page(request) + + self.assertIn('yey, waktunya libur', response.content.decode()) + + Item.objects.create(text='itemey 1') + Item.objects.create(text='itemey 2') + + request = HttpRequest() + response = home_page(request) + + self.assertIn('sibuk tapi santai', response.content.decode()) + + Item.objects.create(text='itemey 3') + Item.objects.create(text='itemey 4') + Item.objects.create(text='itemey 5') + + request = HttpRequest() + response = home_page(request) + + self.assertIn('oh tidak', response.content.decode()) + def test_home_page_redirects_after_POST(self): request = HttpRequest() request.method = 'POST' diff --git a/testproject/settings.py b/testproject/settings.py index 870ad5d5b0c06dc63046c0bb2c9935c7c9935764..41a8ddbb412c8bfabab1f57161c283a1440559c7 100644 --- a/testproject/settings.py +++ b/testproject/settings.py @@ -37,7 +37,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'practice' + 'practice', ] MIDDLEWARE = [