Fakultas Ilmu Komputer UI

Commit c2c12e5c authored by Izzatul Muttaqin's avatar Izzatul Muttaqin
Browse files

Tambah test dan buat tutorial 6

parent 3ced2c33
Pipeline #24084 failed with stage
in 1 minute and 10 seconds
......@@ -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.
......@@ -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'
......
......@@ -37,7 +37,8 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'practice'
'practice',
'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