Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
user avatar
jordan authored
b9631c16
History

Penjaminan Mutu Perangkat Lunak 2019

Jordan Muhammad Andrianda
1506722765
This is Practice Repository PMPL Course

Cerita Latihan 9 Mengapa implementasi Functional Test untuk fitur login lebih baik menggunakan implementasi subbab 20.1

Penjelasan

Bab 20.1 disini kita menggunakan functionnal authentication system supaya bisa identifkasikan ke user dan akan bisa menampilkan list yang sudah dibuat.

Kemudian dari situ kita membuat sebuah functional test untuk user logged in yang bisa menghemat waktu tak perlu melakukan dari awal log in lgi, hal ini akan melewati bagian kita harus melakukan log in email

Sedangkan di tahap implementasi kita bisa tambah function create pre autenthicated session untuk bisa melakukan login, dengan hal tersebubt kita bbisa memakai session untuk functional test lain yang bisa membuat kita tak perlu melakukan log in lg

Cerita Latihan8 Perbedaan antara manual mocking dan menggunakan mock library

Manual Mocking

Manual Mocking dilakukan pada saat Unit Test akan bbuat object yang melakukan sifat dari object yang sebbenarnya.

Saat memulai manual mocking kita akan membbuat sendiri function yang ingin di manual mock. pada latihan ini kita menyusun bagaimana cara melakukan test kirim email yang sebenarnya kita tidak mengirim email tersebut Di accounts/views ada bagian yang kita akan panggil fungsi send_mail dari (django.core.mail)

def send_login_email(request): email = request.POST['email'] token = Token.objects.create(email=email) url = request.build_absolute_uri(
reverse('login') + '?token=' + str(token.uid) ) message_body = f'Use this link to log in:\n\n{url}' send_mail( 'Your login link for Superlists', message_body, 'noreply@superlists', [email] )

return redirect('/')

Supaya saat melakukan Unit Test kita tak perlu kirim email, maka kita membuat function untuk mengganti function send_mail. Ketika di accounts/test_views kita membuat fungsi fake_send_mail yang berfungsi seperti fungsi send_mail. Lalu setelah fake_send_mail terpanggil maka accounts.views.send_mail akan ter-assign jadi fungsi 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

Mock Library

Dalam python mock object library = unittest.mock. ini memudahkan proses mock pada unit test unittest.mock akan menghasilkan class Mock yang bisa digunakan untuk buat copyan dari object yang membbuat class bersifat mudah diatur . @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"])

Patch akan berfungsi ketika kita replace fungsi send_mail ke fake_send_mail yang sesuai pada penjelasan di atas. lalu mock_send_mail sebagai argumen yang dimasukan oleh patch function. Ketika melakukan test send_mail tidak dipanggil tetapi mock_send_mail yang akan terpanggil. Jadi ini membuat fungsi views tidak akan kirim email saat kita melakukan test tersebut

Cerita Latihan8b mocking dapat membuat implementasi yang kita buat tightly coupled

Example pada contoh message sukses di account/views.py def send_login_email(request): email = request.POST['email'] token = Token.objects.create(email=email) url = request.build_absolute_uri(
reverse('login') + '?token=' + str(token.uid) ) messages.success( request, "Check your email, we've sent you a link you can use to log in." )

di accounts/tests/test_views.py

def test_adds_success_message(self): response = self.client.post( "/accounts/send_login_email", data={"email": "edith@example.com"}, follow=True, )

    message = list(response.context["messages"])[0]
    self.assertEqual(
        message.message,
        "Check your email, we've sent you a link you can use to log in.",
    )
    self.assertEqual(message.tags, "success")

pada mock library

@patch("accounts.views.messages") def test_adds_success_message_with_mocks(self, mock_messages): response = self.client.post( "/accounts/send_login_email", data={"email": "edith@example.com"} )

    expected = "Check your email, we've sent you a link you can use to log in."
    self.assertEqual(
        mock_messages.success.call_args, call(response.wsgi_request, expected)
    )

Mocking akan membuat implementasi code yg kita bbuat menjadi tightly coupled karena mock sering test detail dri implementasi fungsi code.

Cerita Latihan04 Prettification

Latihan ini bertujuan untuk implementasi secara increment, yang dimaksud adalah kita membuat perlahan perlahan tidak langsung semuanya dibuat. Lalu dilatihan 4 ini membuat styling yang membuat rusak functional test kita dan disini juga saya belaajar css pada aplikasi yang kita buat. Disini kita membuat static files juga u/ css untuk halaman menjadi lebih rapih dari sebelumnya. Mmebuat juga function action di form classs yang berada di home.html dan mengimplementasi function2 baru yang berada di class views.py yang membuat jika ada todo list terbaru dari user yang baru maka akan dibuatkan alamat url baru untuk user baru , jika user sudah ada dengan url tadi maka akan ditambahkan ke list todo yang ada.

Cerita Latihan03 Isolation Test

Bertujuan untuk menggabungkan Functional Test yang akan mengeksekusi database yang ada dan tidak akan menghapus data yang sudah pernah diinput, hal tersebut membuat data akan menumpuk. Melakukan Isolation Test dengan library Django yaitu 'LiveServerTestCase' yang akan membuat data base saat menjalankan unit test yang tidak akan mempengaruhi setiap unit test.

Perbedaan Design

1

Sebelumnya untuk Selenium Webdriver memakai URL biasa
self.browser.get('localhost:8000')
Lalu sekarang menggunakan dari 'LiveServerTestCase'
self.browser.get(self.live_server_url)

2

Sebelumnya 'NewVisitorTest' dengan framework dari python sendiri
Lalu sekarang menggunakan 'LiveServerTestCase' dari library Djanggo