Penjaminan Mutu Perangkat Lunak 2019
1506722765
This is Practice Repository PMPL Course
Jordan Muhammad Andrianda 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