From c2c84f77832ecc0239a16f29a3c67a325b43fd4d Mon Sep 17 00:00:00 2001 From: Raden Fikri Date: Thu, 7 Nov 2019 22:44:05 +0700 Subject: [PATCH 1/5] [RED] Add test for comments --- lists/tests/test_views.py | 41 ++++++++++++++++-------------- superlists/static/failed_base.scss | 3 +++ 2 files changed, 25 insertions(+), 19 deletions(-) create mode 100644 superlists/static/failed_base.scss diff --git a/lists/tests/test_views.py b/lists/tests/test_views.py index 144a3e5..e8e6bba 100644 --- a/lists/tests/test_views.py +++ b/lists/tests/test_views.py @@ -7,35 +7,38 @@ class HomePageTest(TestCase): response = self.client.get('/') self.assertTemplateUsed(response, 'home.html') - # def test_comment_empty_item(self): - # response = self.client.get('/') + def test_comment_empty_item(self): + list_ = List.objects.create() + response = self.client.get('/lists/' + str(list_.id) + '/') - # self.assertEqual(0, Item.objects.count()) - # self.assertIn("

yey, waktunya berlibur

", response.content.decode()) + self.assertEqual(0, Item.objects.count()) + self.assertIn("

yey, waktunya berlibur

", response.content.decode()) - # def test_comment_less_than_5_item(self): - # Item.objects.create(text='antar adik ke sekolah') + def test_comment_less_than_5_item(self): + list_ = List.objects.create() + Item.objects.create(text='antar adik ke sekolah', list=list_) - # response = self.client.get('/') + response = self.client.get('/lists/' + str(list_.id) + '/') - # self.assertEqual(1, Item.objects.count()) - # self.assertIn("sibuk tapi santai", response.content.decode()) + self.assertEqual(1, Item.objects.count()) + self.assertIn("sibuk tapi santai", response.content.decode()) - # def test_comment_5_or_more_items(self): - # for i in range(5): - # Item.objects.create(text='antar adik ke sekolah') + def test_comment_5_or_more_items(self): + list_ = List.objects.create() + for i in range(5): + Item.objects.create(text='antar adik ke sekolah', list=list_) - # response = self.client.get('/') + response = self.client.get('/lists/' + str(list_.id) + '/') - # self.assertEqual(5, Item.objects.count()) - # self.assertIn("oh tidak", response.content.decode()) + self.assertEqual(5, Item.objects.count()) + self.assertIn("oh tidak", response.content.decode()) - # Item.objects.create(text='antar adik ke sekolah') + Item.objects.create(text='antar adik ke sekolah', list=list_) - # response = self.client.get('/') + response = self.client.get('/lists/' + str(list_.id) + '/') - # self.assertEqual(6, Item.objects.count()) - # self.assertIn("oh tidak", response.content.decode()) + self.assertEqual(6, Item.objects.count()) + self.assertIn("oh tidak", response.content.decode()) # def test_homepage_profile_returns_correct_profile(self): # response = self.client.get('/') diff --git a/superlists/static/failed_base.scss b/superlists/static/failed_base.scss new file mode 100644 index 0000000..c4b06e6 --- /dev/null +++ b/superlists/static/failed_base.scss @@ -0,0 +1,3 @@ +body { + display: none +} \ No newline at end of file -- GitLab From 8c119ffb0f912a0987d44a4dbdd3abdf481fb326 Mon Sep 17 00:00:00 2001 From: Raden Fikri Date: Thu, 7 Nov 2019 22:45:12 +0700 Subject: [PATCH 2/5] [GREEN] Add implementation for comments --- lists/templates/list.html | 1 + lists/views.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lists/templates/list.html b/lists/templates/list.html index 62f4164..8ba393e 100644 --- a/lists/templates/list.html +++ b/lists/templates/list.html @@ -12,4 +12,5 @@
{{error}}
+

{{ comment }}

{% endblock %} \ No newline at end of file diff --git a/lists/views.py b/lists/views.py index 4a6622d..5167262 100644 --- a/lists/views.py +++ b/lists/views.py @@ -14,7 +14,9 @@ def todo_list_comment(items): def view_list(request, list_id): list_ = List.objects.get(id=list_id) - return render(request, 'list.html', {'list': list_}) + items = Item.objects.filter(list=list_) + comment = todo_list_comment(items) + return render(request, 'list.html', {'list': list_, 'items':items, 'comment':comment}) def new_list(request): list_ = List.objects.create() -- GitLab From 8dd0a148a168e7f6f4816ba5663b8a672fd2fcc2 Mon Sep 17 00:00:00 2001 From: Raden Fikri Date: Thu, 7 Nov 2019 23:03:00 +0700 Subject: [PATCH 3/5] Add First mutant --- lists/views.py | 2 +- requirements.txt | 5 +++-- superlists/settings.py | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lists/views.py b/lists/views.py index 5167262..5d5256c 100644 --- a/lists/views.py +++ b/lists/views.py @@ -5,7 +5,7 @@ def home_page(request): return render(request, 'home.html') def todo_list_comment(items): - if (items.count() == 0): + if (items.count() >= 0): return 'yey, waktunya berlibur' elif (1 <= items.count() <= 4): return 'sibuk tapi santai' diff --git a/requirements.txt b/requirements.txt index 144fc63..9996180 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,21 +3,22 @@ dj-database-url==0.5.0 Django==2.2.4 django-appconf==1.0.3 django-compressor==2.3 +django-mutpy==0.1.2 django-sass-processor==0.7.3 gunicorn==19.9.0 isort==4.3.21 lazy-object-proxy==1.4.2 libsass==0.19.3 mccabe==0.6.1 -psycopg2==2.7.4 pylint==2.3.1 pytz==2019.2 rcssmin==1.0.6 rjsmin==1.1.0 selenium==3.141.0 +psycopg2==2.7.4 six==1.12.0 sqlparse==0.3.0 typed-ast==1.4.0 urllib3==1.25.3 whitenoise==4.1.3 -wrapt==1.11.2 +wrapt==1.11.2 \ No newline at end of file diff --git a/superlists/settings.py b/superlists/settings.py index f959be8..e499bef 100644 --- a/superlists/settings.py +++ b/superlists/settings.py @@ -42,6 +42,7 @@ INSTALLED_APPS = [ 'lists', 'functional_tests', 'sass_processor', + 'django_mutpy', ] MIDDLEWARE = [ -- GitLab From fa62c4d39f53aee0d85193751ebee8df6ba36a3d Mon Sep 17 00:00:00 2001 From: Raden Fikri Date: Thu, 7 Nov 2019 23:03:35 +0700 Subject: [PATCH 4/5] Add second mutant --- lists/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lists/views.py b/lists/views.py index 5d5256c..44494d9 100644 --- a/lists/views.py +++ b/lists/views.py @@ -5,9 +5,9 @@ def home_page(request): return render(request, 'home.html') def todo_list_comment(items): - if (items.count() >= 0): + if (items.count() == 0): return 'yey, waktunya berlibur' - elif (1 <= items.count() <= 4): + elif (1 <= items.count() <= 5): return 'sibuk tapi santai' elif (items.count() >= 5): return 'oh tidak' -- GitLab From a22518c7ced217e91c1afaad0d834412692f67b8 Mon Sep 17 00:00:00 2001 From: Raden Fikri Date: Thu, 7 Nov 2019 23:15:00 +0700 Subject: [PATCH 5/5] Add readme.md and fix the code to the correct state --- README.md | 39 ++++++++++++++++++++++++++++++++++++++- lists/views.py | 2 +- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c67961c..c7dff96 100644 --- a/README.md +++ b/README.md @@ -87,4 +87,41 @@ lebih efisien dan efektif dari jalannya kode kita, sehingga kita bisa meningkatk Untuk Test Organization, keuntungan yang didapatkan adalah menambah *maintainability* sistem, dikarenakan kode tes yang ada menjadi rapi dan berada di tempatnya masing-masing, dengan catatan penamaan folder serta file merepresentasikan tes yang dilakukan. Dengan Test Organization ini juga tes akan dapat lebih -dimengerti oleh developer lainnya. \ No newline at end of file +dimengerti oleh developer lainnya. + +## Exercise 6 - Mutation Testing + +Pada kesempatan kali ini, saya membuat 2 mutant pada *views.py* di fungsi todo_list_comment +Mutasi 1: +```python +def todo_list_comment(items): + if (items.count() != 0): + return 'yey, waktunya berlibur' + elif (1 <= items.count() <= 4): + return 'sibuk tapi santai' + elif (items.count() >= 5): + return 'oh tidak' +``` +Mutation 2: +```python +def todo_list_comment(items): + if (items.count() == 0): + return 'yey, waktunya berlibur' + elif (1 <= items.count() <= 5): + return 'sibuk tapi santai' + elif (items.count() >= 5): + return 'oh tidak' +``` +Lalu untuk salah satu contoh yang saya gunakan adalah untuk mutasi ke-2. Di mana test yang strongly +kill mutasi 2 adalah test_comment_5_or_more_items. + +Test case tersebut strongly kill mutant karena saat jumlah item 5, program masuk ke kondisional kedua sehingga expected output salah. + +*Additional* + +Saya juga telah mencoba untuk menggunakan salah satu *tools* untuk automasi mutant test. Saya menggunakan +MutPy. Dengan command berikut: +``` +python3 manage.py muttest lists --modules lists.views +``` +Saya mendapatkan bahwa terdapat mutasi yang dibuat secara otomatis dan semuanya sudah terbunuh secara kuat. \ No newline at end of file diff --git a/lists/views.py b/lists/views.py index 44494d9..5167262 100644 --- a/lists/views.py +++ b/lists/views.py @@ -7,7 +7,7 @@ def home_page(request): def todo_list_comment(items): if (items.count() == 0): return 'yey, waktunya berlibur' - elif (1 <= items.count() <= 5): + elif (1 <= items.count() <= 4): return 'sibuk tapi santai' elif (items.count() >= 5): return 'oh tidak' -- GitLab