diff --git a/README.md b/README.md index c67961c6a04fae2d2d9614d1d865e26b18ccdaca..c7dff96f59e6be4f2e183dbbea62892830e8dc3d 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/templates/list.html b/lists/templates/list.html index 62f4164ed9d9b9891ddf186d667479a0d24fd2f8..8ba393e8191deeff9f42b02b59599b1dd304d519 100644 --- a/lists/templates/list.html +++ b/lists/templates/list.html @@ -12,4 +12,5 @@
{{ comment }}
{% endblock %} \ No newline at end of file diff --git a/lists/tests/test_views.py b/lists/tests/test_views.py index 144a3e52b7e3d953ff9f4ccb21be3b1c89fae5e7..e8e6bba772a6f3ec0b9a5da28ac3c5242f18f017 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()) - # 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/lists/views.py b/lists/views.py index 4a6622d509d2a11780b7af0cef707253c901945a..5167262ee01fb8c4c5138271a11c05823966ea3c 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() diff --git a/requirements.txt b/requirements.txt index 144fc63b5206c2e910d0b1badf9414a92e9f14ef..9996180f729015f51a5eddecac7ef7eb0e04bb57 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 f959be80339be694d1ebf201218c9f7a39b2f357..e499bef74685a606382b61343f43ed73e8fbc23b 100644 --- a/superlists/settings.py +++ b/superlists/settings.py @@ -42,6 +42,7 @@ INSTALLED_APPS = [ 'lists', 'functional_tests', 'sass_processor', + 'django_mutpy', ] MIDDLEWARE = [ diff --git a/superlists/static/failed_base.scss b/superlists/static/failed_base.scss new file mode 100644 index 0000000000000000000000000000000000000000..c4b06e669f6c9a798bd9b6573f812df7b9451491 --- /dev/null +++ b/superlists/static/failed_base.scss @@ -0,0 +1,3 @@ +body { + display: none +} \ No newline at end of file