Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.

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/

pipeline status

coverage report

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.