-
Dwi Nanda Susanto authoredDwi Nanda Susanto authored
Simple Home Page
Dwi Nanda Susanto - 1506722720 - Computer Science 2015 - PMPL A - Practice Repo
The deployed simple home page can be accessed here : http://dwi-simplehomepage.herokuapp.com/
UAS TAKE HOME PROGRAMMING
duration of coding : almost 4 days
first task is done : implementing header and footer in SQA way, branch is fix_uas_take_home
second task is done also : create my own feature, reset all items
on branch new_ftr_uas_take_home
here below is the code coverage for the the
unittest
from the pipeline process
$ coverage report
Name Stmts Miss Cover
-----------------------------------------------------------
accounts/__init__.py 0 0 100%
accounts/admin.py 1 0 100%
accounts/authentication.py 22 0 100%
accounts/migrations/0001_initial.py 6 0 100%
accounts/migrations/__init__.py 0 0 100%
accounts/models.py 30 4 87%
accounts/tests/test_authentication.py 30 0 100%
accounts/tests/test_models.py 13 0 100%
accounts/tests/test_views.py 29 0 100%
accounts/urls.py 4 0 100%
accounts/views.py 28 2 93%
lists/__init__.py 0 0 100%
lists/admin.py 1 0 100%
lists/migrations/0001_initial.py 6 0 100%
lists/migrations/__init__.py 0 0 100%
lists/models.py 6 0 100%
lists/tests.py 74 0 100%
lists/urls.py 3 0 100%
lists/views.py 30 21 30%
manage.py 13 6 54%
superlists/__init__.py 0 0 100%
superlists/settings.py 30 0 100%
superlists/urls.py 7 0 100%
-----------------------------------------------------------
TOTAL 333 33 90%
Job succeeded
and here below is the code coverage for the
functional test
from the pipeline process
$ coverage report -m
Name Stmts Miss Cover Missing
----------------------------------------------------------------------------
accounts/__init__.py 0 0 100%
accounts/admin.py 1 0 100%
accounts/apps.py 3 3 0% 1-5
accounts/authentication.py 22 6 73% 10-11, 16-17, 25-26
accounts/migrations/0001_initial.py 6 0 100%
accounts/migrations/__init__.py 0 0 100%
accounts/models.py 30 4 87% 20, 22, 33, 37
accounts/tests.py 1 0 100%
accounts/urls.py 4 0 100%
accounts/views.py 28 0 100%
functional_test/__init__.py 0 0 100%
functional_test/base.py 55 18 67% 34-37, 41-56, 76-77
functional_test/test_layout_and_styling.py 9 0 100%
functional_test/test_list_item_validation.py 15 8 47% 12-19
functional_test/test_login.py 36 4 89% 38, 76-78
functional_test/test_my_lists.py 32 4 88% 44-47
functional_test/tests.py 52 12 77% 43-58
lists/__init__.py 0 0 100%
lists/admin.py 1 0 100%
lists/apps.py 3 3 0% 1-5
lists/migrations/0001_initial.py 6 0 100%
lists/migrations/__init__.py 0 0 100%
lists/models.py 6 0 100%
lists/tests.py 74 0 100%
lists/urls.py 3 0 100%
lists/views.py 30 11 63% 15, 19, 29-31, 34-40
----------------------------------------------------------------------------
TOTAL 417 73 82%
Job succeeded
Exercise 3
Pada exercise 3 kali ini dibuat sebuah integration test yang akan mengautomasi waktu menunggu hingga terjadi perubahan pada rows. Pada integration test ini sudah bisa melakukan listening terhadap request dari url LiveServer yang sedang aktif. Jadi tidak perlu melihat lagi url apa yang sedang berjalan. Jika dibandingkan dengan test lama, fungsi test memanggil sleep selama 1 second. Tidak ada jaminan selama 1 second tersebut apakah benar ada perubahan pada row atau tidak. Tetapi dengan integration test dari fungsi test yang baru sekarang adalah disediakan waktu maksimal 10 detik untuk menunggu, maksudnya adalah 10 detik tersebut adalah waktu maksimal bagi fungsi untuk menunggu akan ada perubahan atau tidak, apa bila waktu menunggu sudah melebihi 10 detik maka fungsi wait_for_row_in_list_table tidak akan me-return apa-apa.Sedangkan pengecekan terhadap perubahan dilakukan dalam interval setengah detik sekali.
Exercise 4
Pada exercise kali ini terdapat beberapa hal yang dikerjakan, hal tersebut adalah
- Mengupdate model
- Menambah unique URL untuk setiap list
- Menambah URL untuk menambah item baru ke list yang sudah ada menggunakan POST methode
- Refactor duplikasi pada
urls.py
- Memperindah tampilan dengan CSS
In Short, pada chapter 7 dibuat sedemikian hingga agar ada 2 atau lebih user yang mengakses To-Do List yaang tidak berada dalam satu tempat. Setiap user memiliki unique url to-do list
nya. Sedangkan chapter 8 hanya menambahkan styling pada halaman tersebut
Exercise 5 - Refactoring Unit Tests
Refactor ditujukan untuk melakukan penyesuaian antara fungsi yang ingin di test dengan test nya sendiri. Agar dapat tercapai clean code
dimana agar hanya ada 1 file yang berkesinambungan dengan test-nya. Sehingga memudahkan untuk melakukan mantainability
. Pengelompokkan file test menjadi class-class dalam bentuk file unit test dan functional test nya secara terpisah memudahkan melakukan maintain
dan lebih effortless
sehingga nantinya jika aplikasi berkembang dalam skala besar, pengecekan atau pergantian file test dan fungsi hanya akan dilakukan di satu tempat tidak terpecah-pecah.
Exercise 6 - Mutant
Dalam exercise kali ini saya membuat mutant yang bertujuan untuk membuat functional_test menjadi fail. Mutant yang saya buat merupakan kondisi yang salah dari apa yang saya inginkan, yaitu item yang <= 1 dianggap waktunya berlibur
, kemudian yang > 1 dianggap oh tidak
, kondisi ini akan membuat functional test yang dibuat me-return error
Exercise 7
Dalam exercise kali ini mempelajari tentang Spiking
. Spiking
adalah sebuah aktivitas explore program ketika membuat sebuah fitur tanpa membuat TDD functional dan unittest. Pada exercise kali ini spiking diterapkan ketika membuat fitur auth tanpa tanpa menggunakan passworrd.
Sedangkan De-Spiking
adalah menghapus keseluruhan implementasi spiking lalu memulai membuat implementasi fitur barusan, dari awal lagi hanya saja lengkap dengan TDD nya.
Exercise 8
Mocking adalah sebuah cara untuk melakukan testing dengan membuat fungsi fake
yang menerima input dan mengeluarkan hasil yang sama seperti fungsi yang ingin di test dengan tujuan untuk menghindari pemanggilan fungsi yang berlebihan dan untuk menghindari fungsi lain terpengaruh oleh fungsi yang tadi dipanggil
Pada exercise ini dipelajari 2 cara melakukan mocking yaitu manual mocking
dan mocking dengan library
.
Pada manual mocking dilakukan dengan mengganti fungsi send_mail
dengan versi fake nya yang bernama fake_send_mail
:
def test_sends_mail_to_address_from_post(self):
self.send_mail_called = False
def fake_send_mail(subject, body, from_email, to_list):
self.send_mail_called = True
self.subject = subject
self.body = body
self.from_email = from_email
self.to_list = to_list
accounts.views.send_mail = fake_send_mail
self.client.post('/accounts/send_login_email', data={
'email': 'edith@example.com'
})
self.assertTrue(self.send_mail_called)
self.assertEqual(self.subject, 'Your login link for Superlists')
self.assertEqual(self.from_email, 'noreply@superlists')
self.assertEqual(self.to_list, ['edith@example.com'])
Sedangkan mocking dengan library
, dilakukan dengan menggunakan library dari Python yang sudah tersedia bernama Mock
. Library tersebut menyediakan decorator bernama patch
yang digunakan pada fungsi yang membutuhkan mock
@patch('accounts.views.send_mail')
def test_sends_mail_to_address_from_post(self, mock_send_mail):
self.client.post('/accounts/send_login_email', data={
'email': 'edith@example.com'
})
self.assertEqual(mock_send_mail.called, True)
(subject, body, from_email, to_list), kwargs = mock_send_mail.call_args
self.assertEqual(subject, 'Your login link for Superlists')
self.assertEqual(from_email, 'noreply@superlists')
self.assertEqual(to_list, ['edith@example.com'])
Dengan memberikan anotasi @Patch
fungsi yang berada dibawahnya akan secara otomatis dibuatkan versi Mock-nya oleh library tersebut.
Exercise 10
Setiap kali kita melakukan perubahan pada models, sebelum manjalankan aplikasi, kita harus terlebih dahulu mengupdate skema ORM django ke dalam format db dengan melakukan makemigrations
dan migrate
agar tidak terjadi IntegrityError
. Karena adanya penambahan attribute pada models juga akan menyebabkan pengupdate-an column pada table. agar tidak error.