
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
 <channel>
   <title>Development Notes on Nafies Luthfi</title>
   <link>https://blog.inweeks.com/</link>
   <description>Recent content in Development Notes on Nafies Luthfi</description>
   <generator>Hugo -- gohugo.io</generator>
   <language>ID</language>
   <copyright>Copyright &amp;copy; 2017 - Nafies Luthfi</copyright>
   <lastBuildDate>Wed, 30 Mar 2022 23:06:00 +0800</lastBuildDate>
   
       <atom:link href="https://blog.inweeks.com/index.xml" rel="self" type="application/rss+xml" />
   
   
     <item>
       <title>Minder: Aplikasi Mindmap untuk GNU/Linux</title>
       <link>https://blog.inweeks.com/ubuntu/minder-aplikasi-mindmap-untuk-gnu-linux/</link>
       <pubDate>Wed, 30 Mar 2022 23:06:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/minder-aplikasi-mindmap-untuk-gnu-linux/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Minder: Aplikasi Mindmap untuk GNU/Linux:&lt;br&gt;
&lt;a href=&#34;https://github.com/phase1geo/Minder&#34;&gt;https://github.com/phase1geo/Minder&lt;/a&gt; (free software)&lt;/p&gt;
&lt;p&gt;Cocok untuk orang yang suka bikin konsep, bikin kerangka konten, bikin resume buku/tutorial, atau jadi bahan meeting. Saya sendiri pakai ini untuk bikin konsep fitur sistem, biar tidak lupa bagian-bagian yang harus dibuat (contoh screenshot).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2022-03-30-minder-aplikasi-mindmap-untuk-gnu-linux-01.jpg&#34; alt=&#34;Contoh penggunaan Minder mindmap&#34;&gt;&lt;/p&gt;
&lt;p&gt;Aplikasi alternatif terdahulu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://freemind.sourceforge.net/wiki/index.php/Main_Page&#34;&gt;Freemind&lt;/a&gt; (sudah tidak bisa diisntall di ubuntu versi 18.04 ke atas).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.freeplane.org/wiki/index.php/Home&#34;&gt;Freeplan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sourceforge.net/projects/vym&#34;&gt;VYM (View Your Mind)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Selamat mencoba. Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Notifikasi Suara Saat Perintah Terminal Selesai</title>
       <link>https://blog.inweeks.com/ubuntu/notifikasi-suara-saat-perintah-terminal-selesai/</link>
       <pubDate>Wed, 09 Feb 2022 17:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/notifikasi-suara-saat-perintah-terminal-selesai/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Saya ingin share sedikit, pernahkah teman-teman menunggu atau bolak-balik cek terminal untuk melihat apakah proses sudah selesai atau belum? Ternyata kita bisa meminta agar terminal &amp;ldquo;bersuara&amp;rdquo; saat proses selesai.&lt;/p&gt;
&lt;p&gt;Contoh perintah:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ls; spd-say done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Jadi ketika perintah &lt;code&gt;ls&lt;/code&gt; selesai dieksekusi, PC/laptop kita akan bersuara &lt;code&gt;done&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Referensi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://askubuntu.com/questions/277215/how-to-make-a-sound-once-a-process-is-complete&#34;&gt;https://askubuntu.com/questions/277215/how-to-make-a-sound-once-a-process-is-complete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/testing/speech-dispatcher/spd-say.1.en.html&#34;&gt;https://manpages.debian.org/testing/speech-dispatcher/spd-say.1.en.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kenapa untuk saya ini sangat bermanfaat? Karena kadang ada pekerjaan proses import data, migrasi data, atau backup/restore database, biasanya menggunakan terminal dan setiap proses butuh waktu beberapa menit.&lt;/p&gt;
&lt;p&gt;Daripada bolak-balik melihat ke terminal (untuk cek sudah selesai atau belum), dengan metode ini terminal akan memberi notifikasi jika prosesnya sudah selesai.&lt;/p&gt;
&lt;p&gt;Demikian teman-teman selamat mencoba, mudah-mudahan bermanfaat. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Deploy VPS Always Free Oracle Cloud</title>
       <link>https://blog.inweeks.com/web-server/cara-deploy-vps-always-free-oracle-cloud/</link>
       <pubDate>Sun, 26 Dec 2021 23:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/cara-deploy-vps-always-free-oracle-cloud/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada tulisan ini, kita akan membahas cara deploy satu VM (Virtual Machine) instance atau VPS yang always free pada Oracle Cloud. Berikut adalah spesifikasinya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server Shape: VM.Standard.E2.1.Micro&lt;/li&gt;
&lt;li&gt;Network Bandwidth (Gbps): 0.48&lt;/li&gt;
&lt;li&gt;CPU Count: 1&lt;/li&gt;
&lt;li&gt;Memory: 1 GB&lt;/li&gt;
&lt;li&gt;Local Disk: Block Storage Only (47GB)&lt;/li&gt;
&lt;li&gt;Operating System: Ubuntu Server 20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pastikan kita sudah memiliki akun Oracle Cloud aktif. Cek cara pendaftarannya di artikel ini: &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-mendaftar-akun-oracle-cloud/&#34;&gt;Cara Mendaftar Akun Oracle Cloud&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;login-ke-akun-oracle-cloud&#34;&gt;Login ke Akun Oracle Cloud&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Buka halaman melalui browser: &lt;a href=&#34;https://cloud.oracle.com&#34;&gt;https://cloud.oracle.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Isikan Cloud account name: &lt;strong&gt;nama_akun_anda&lt;/strong&gt; -&amp;gt; Klik &lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Pada Identity Providers: pilih &lt;strong&gt;oracleidentitycloudservice&lt;/strong&gt; -&amp;gt; Klik &lt;strong&gt;Continue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Isikan username: ***@mail.com (alamat email yang dipakai untuk mendaftar)&lt;/li&gt;
&lt;li&gt;Isikan password: ***&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Sign In&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Jika berhasil, kita akan redirect ke dashboard Oracle Cloud &lt;code&gt;https://cloud.oracle.com/?region=xxxxx&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-13.jpg&#34; alt=&#34;Dashboard Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;deploy-vm-instance&#34;&gt;Deploy VM Instance&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pada dashboard akun Oracle Cloud, scroll ke &lt;strong&gt;Launch Resources&lt;/strong&gt;. Pada bagian &lt;strong&gt;Compute&lt;/strong&gt; klik &lt;strong&gt;Create VM Instance&lt;/strong&gt; (perhatikan bahwa label &lt;code&gt;Always Free Eligible&lt;/code&gt; masih ada).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-01.jpg&#34; alt=&#34;Dashboard Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada formulir  &lt;strong&gt;Create compute instance&lt;/strong&gt;, silakan ubah &lt;strong&gt;name&lt;/strong&gt; jika diperlukan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada halaman ini, kita perlu mengubah bagian Image dari Oracle Linux menjadi Ubuntu Server. Klik &lt;strong&gt;Edit&lt;/strong&gt; untuk mengubahnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-02.jpg&#34; alt=&#34;Edit Image VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;Change Image&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-03.jpg&#34; alt=&#34;Change Image VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cetang &lt;strong&gt;Canonical Ubuntu (Always Free Eligible)&lt;/strong&gt;, Pilih versi OS &lt;strong&gt;20.04&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Select image&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-04.jpg&#34; alt=&#34;Select Image VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sekarang image sudah berubah menjadi &lt;strong&gt;Canonical Ubuntu 20.04&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-05.jpg&#34; alt=&#34;Image Changed VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada bagian &lt;strong&gt;Add SSH Keys&lt;/strong&gt; kita bebas pilih opsinya, tapi saran saya gunakan yang di-generate oleh Oracle Cloud. Jadi pilih &lt;strong&gt;Generate a key pair for me&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download SSH key: Klik &lt;strong&gt;Save Private Key&lt;/strong&gt; dan Klik &lt;strong&gt;Save Public Key&lt;/strong&gt;. Simpan di local disk PC kita. Untuk kasus saya, karena menggunakan Linux Mint, saya simpan di folder &lt;code&gt;~/.ssh/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-06.jpg&#34; alt=&#34;Add SSH Key VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setelah itu, klik tombol &lt;strong&gt;Create&lt;/strong&gt;, maka pembuatan VM Instance akan diproses.&lt;/p&gt;
&lt;p&gt;Pastikan VM baru kita ada label &lt;code&gt;Always Free&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-07.jpg&#34; alt=&#34;Provisioning new VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika proses sudah selesai, akan tampil informasi status VM instance kita sedang &lt;strong&gt;RUNNING&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sekarang kita bisa coba login ke VM dengan username &lt;code&gt;ubuntu&lt;/code&gt; dan &lt;code&gt;Public IP Address&lt;/code&gt; yang tampil di layar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-08.jpg&#34; alt=&#34;New Running VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;akses-ssh&#34;&gt;Akses SSH&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Sebelum login ke VM instance melalui SSH, kita perlu modifikasi dulu file &lt;strong&gt;private key&lt;/strong&gt; yang di-download tadi, yaitu mengubah file permissions menjadi &lt;code&gt;600&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Di sini saya menggunakan Linux Mint, maka dilakukan dengan perintah berikut:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ chmod 600 ~/.ssh/ssh-key-2021-09-05.key
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Kemudian akses SSH ke VM dengan perintah berikut:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ssh ubuntu@public-ip-address -i ~/.ssh/ssh-key-2021-09-05.key
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Seharusnya akses SSH ke VM Oracle Cloud berhasil.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-09.jpg&#34; alt=&#34;SSH Access VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;disk-drive-dan-memory-ram&#34;&gt;Disk Drive dan Memory (RAM)&lt;/h2&gt;
&lt;p&gt;Sekarang kita bisa cek kapasitas harddisk dan memory yang tersedia pada VM Instance Oracle Cloud yang baru.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ free -m
$ df -h
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Akan tampil informasi bahwa:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Total Memory: sekitar 1 GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disk size: 45 GB&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-12-26-cara-deploy-vps-always-free-oracle-cloud-10.jpg&#34; alt=&#34;Disk Size and Memory VM Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;penutup&#34;&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Baik teman-teman, seperti itu proses deploy satu VM instance atau &lt;strong&gt;VPS always free pada Oracle Cloud&lt;/strong&gt;. Selamat mencoba dan terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Melaporkan Problem Pendaftaran ke Customer Service Oracle Cloud</title>
       <link>https://blog.inweeks.com/web-server/melaporkan-problem-pendaftaran-ke-customer-service-oracle-cloud/</link>
       <pubDate>Sat, 30 Oct 2021 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/melaporkan-problem-pendaftaran-ke-customer-service-oracle-cloud/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Di artikel &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-mendaftar-akun-oracle-cloud/&#34;&gt;Cara Mendaftar Akun Oracle Cloud&lt;/a&gt;, saya informasikan proses pendaftaran akun Oracle Cloud tidak langsung berhasil karena beberapa kali gagal saat input informasi kartu kredit.&lt;/p&gt;
&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Pada langkah ke 14, saya mendapat error proses transaksi seperti ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-melaporkan-problem-pendaftaran-ke-customer-service-oracle-cloud-01.jpg&#34; alt=&#34;Error processing transaction Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kegagalan input kartu kredit ini tetap mengenakan charge sebesar &lt;code&gt;SGD 1.38&lt;/code&gt; sebanyak 3 kali karena saya mencobanya 3 kali juga.&lt;/p&gt;
&lt;h2 id=&#34;langkah-yang-dilakukan-mengirim-email&#34;&gt;Langkah yang dilakukan (mengirim email)&lt;/h2&gt;
&lt;p&gt;Jika teman-teman dapat problem yang sama, maka dapat melaporkan ke customer service oracle cloud dengan cara mengirim email seperti ini&lt;/p&gt;
&lt;p&gt;To: &lt;code&gt;oraclehelp_ww@oracle.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Subject: &lt;code&gt;My Card is being rejected for Free Trial Signup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Konten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Hello Oracle Cloud,

I want to register for Oracle Cloud Free Tier, but it rejects
my credit card and says:

&amp;#34;We&amp;#39;re unable to complete your sign up. Common sign up errors are due to:
(a) Using prepaid cards. Oracle only accepts credit card and debit cards
(b) Intentionally or unintentionally masking one&amp;#39;s location or identity
(c) Entering incomplete or inaccurate account details.&amp;#34;

I try to enter my credit card detail 3 times and get charged 3 times
(for verification), but the sign-up is kept failing.

I am using this email address xxxxxx@gmail.com and using MasterCard
for the credit card.

Could you please help me with this?

Thanks.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kemudian sekitar &lt;strong&gt;2 hari&lt;/strong&gt; dapat balasan dari oracle cloud, bahwa mereka sudah melakukan penyesuaian dan mempersilakan untuk mendaftar dengan alamat email yang sama dalam 5 hari ke depan.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-melaporkan-problem-pendaftaran-ke-customer-service-oracle-cloud-02.jpg&#34; alt=&#34;Solusi error processing transaction Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;p&gt;Setelah itu, proses registrasi saya ulang sekali lagi dan berhasil (sampai langkah ke 15 pada artikel sebelumnya).&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Mendaftar Akun Oracle Cloud</title>
       <link>https://blog.inweeks.com/web-server/cara-mendaftar-akun-oracle-cloud/</link>
       <pubDate>Sat, 30 Oct 2021 09:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/cara-mendaftar-akun-oracle-cloud/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Di beberapa artikel sebelumnya, saya share tentang cara pendaftaran akun di &lt;a href=&#34;https://blog.inweeks.com/cloud-server/#google-cloud-platform&#34;&gt;Google Cloud Platform&lt;/a&gt; dan &lt;a href=&#34;https://blog.inweeks.com/cloud-server/#microsoft-azure&#34;&gt;Microsoft Azure&lt;/a&gt; untuk dapat layanan VPS gratis. Kali ini kita bahas pendaftaran Oracle Cloud yang menawarkan layanan VPS gratis juga.&lt;/p&gt;
&lt;p&gt;Sebagai informasi, Oracle Cloud menyediakan &lt;strong&gt;2 VPS always free&lt;/strong&gt; (AMD Compute VMs). Ini yang menarik, karena layanan lain tidak ada yang menawarkan VPS always free.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-00.jpg&#34; alt=&#34;Free VPS Oracle Cloud Always Free&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sumber free trial info:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.oracle.com/id/cloud/free&#34;&gt;https://www.oracle.com/id/cloud/free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm&#34;&gt;https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;proses-pendaftaran-akun-oracle-cloud&#34;&gt;Proses Pendaftaran Akun Oracle Cloud&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Kunjungi &lt;a href=&#34;https://www.oracle.com/id/cloud/free&#34;&gt;https://www.oracle.com/id/cloud/free&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &amp;ldquo;Start for Free&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-01.jpg&#34; alt=&#34;Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Isi formulir dan klik &amp;ldquo;Verify my email&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-02.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Akan ada email masuk untuk verifikasi, lalu tekan tombol &amp;ldquo;Click here&amp;rdquo; pada email&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-03.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kita akan masuk ke form yang tadi tapi ada tambahan detail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pilih &lt;strong&gt;region&lt;/strong&gt; terdekat dengan kita, saya pilih &lt;code&gt;Japan East (Tokyo)&lt;/code&gt; karena latency nya paling kecil (&lt;a href=&#34;https://cloudpingtest.com/oracle&#34;&gt;https://cloudpingtest.com/oracle&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &amp;ldquo;Continue&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-04.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Isi data alamat dan telp (isi yang wajib saja)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &amp;ldquo;Continue&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-05.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada bagian payment verification klik &amp;ldquo;Add Payment Verification Method&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-06.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &amp;ldquo;Credit Card&amp;rdquo;. Di sini kita akan masukkan data kartu kredit&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-07.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada Billing Information, isi data yang wajib-wajib saja.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-08.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada Payment Detail, isi data kartu kredit, lalu klik Finish.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-09.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-10.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Centang agreement dan klik &amp;ldquo;Start my free trial&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-11.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;
&lt;strong&gt;Catatan:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Pada langkah ini, ada kemungkinan gagal dengan pesan: &lt;code&gt;We&#39;re unable to complete your sign up...&lt;/code&gt;&lt;br&gt;
Jika mengalami problem ini, silakan baca: &lt;a href=&#34;https://blog.inweeks.com/web-server/melaporkan-problem-pendaftaran-ke-customer-service-oracle-cloud/&#34;&gt;Melaporkan Problem Pendaftaran ke Customer Service Oracle Cloud&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Proses setup dilanjutkan hingga muncul tampilan Oracle Cloud Dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-12.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bisa teman-teman perhatikan ada informasi di bagian atas dashboard:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You are in a free trial. When your trial is over, your account will be limited to Always Free resources. Upgrade at any time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-10-30-cara-mendaftar-oracle-cloud-13.jpg&#34; alt=&#34;Formulir Pendaftaran Oracle Cloud&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, sampai Di sini proses pendaftaran Akun Oracle Cloud sudah selesai dan siap digunakan.&lt;/p&gt;
&lt;h2 id=&#34;problem-yang-saya-alami&#34;&gt;Problem yang saya alami&lt;/h2&gt;
&lt;p&gt;Sebagai informasi tambahan, proses pendaftaran ini &lt;strong&gt;tidak langsung berhasil&lt;/strong&gt;. Saat submit kartu kredit ditolak, silakan baca: &lt;a href=&#34;https://blog.inweeks.com/web-server/melaporkan-problem-pendaftaran-ke-customer-service-oracle-cloud/&#34;&gt;Melaporkan Problem Pendaftaran ke Customer Service Oracle Cloud&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Format Laporan Progress yang Disukai oleh Senior Dev/Project Manager</title>
       <link>https://blog.inweeks.com/tips/format-laporan-progress-yang-disukai-oleh-senior-dev-project-manager/</link>
       <pubDate>Mon, 20 Sep 2021 22:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/format-laporan-progress-yang-disukai-oleh-senior-dev-project-manager/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel ini, Saya pingin share satu contoh laporan progress yang disukai oleh senior, atau lead, atau project manager ketika kita di-assign task/ditugasi mengerjakan sesuatu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Ini hanya preferensi saya, menurut pengalaman kerja untuk klien maupun kerja bareng sesama developer selama beberapa tahun terakhir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;contoh-task-dan-laporan-harian&#34;&gt;Contoh Task dan Laporan Harian&lt;/h2&gt;
&lt;p&gt;Di contoh ini, saya pakai &lt;strong&gt;github issue&lt;/strong&gt; sebagai task management. Deskripsi issue dipakai untuk menulis feature requirements, dan komentar-komentar issue dipakai untuk lapor progress harian.&lt;/p&gt;
&lt;p&gt;Berikut beberapa screenshot dari salah satu task:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Issue dibuat oleh Senior Developer atau Project Manager.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-09-20-format-laporan-progress-yang-disukai-oleh-senior-dev-project-manager-01.jpg&#34; alt=&#34;Task Definition&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada deskripsi issue ada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Goal&lt;/strong&gt; (biar satu visi ini tasknya mau ngapain)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notes&lt;/strong&gt; (catatan penting yang harus diperhatikan)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Definition of Done&lt;/strong&gt; (Task ini dianggap selesai kalau item-item ini terpenuhi)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-09-20-format-laporan-progress-yang-disukai-oleh-senior-dev-project-manager-02.jpg&#34; alt=&#34;Task Grooming&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika ambil task ini, kita assign nama kita, biar mudah difilter per username/assignee&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika selesai mempelajari/mepahami requirement dari task ini, tuliskan &amp;ldquo;Apa yang saya pahami dari task ini&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tuliskan juga rencana kerja berdasarkan yang kita pahami di atas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(optional) Kita buat perkiraan berapa lama waktu pengerjaan (bisa dalam jam atau hari).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minta review dari orang yang membuat task, kira2 point 4, 5, 6 itu sudah OK atau belum. Kalau sudah sip, dia kasih jempol, kalau belum sip, dia kasih komentar/revisi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-09-20-format-laporan-progress-yang-disukai-oleh-senior-dev-project-manager-03.jpg&#34; alt=&#34;Daily Progress Report&#34;&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-09-20-format-laporan-progress-yang-disukai-oleh-senior-dev-project-manager-04.jpg&#34; alt=&#34;Close the task&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika sudah mulai progress, buat laporan harian. Komposisinya ada 2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Current progress&lt;/strong&gt;: Apa saja yang sudah dikerjakan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next TODO&lt;/strong&gt;: Progress selanjutnya kita mau ngapain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika progress sudah selesai, kita beri komentar &amp;ldquo;dengan jelas&amp;rdquo; bahwa tugas sudah selesai, dan issue di-close.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;kenapa-harus-begitu&#34;&gt;Kenapa Harus Begitu?&lt;/h2&gt;
&lt;p&gt;Nah manfaatnya apa kita lapor seperti ini? Tujuannya adalah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Menghemat waktu&lt;/strong&gt; Senior Dev/Project Manager saat monitoring tugas-tugas yang sudah diassign. Cukup baca laporan progress terakhir, sudah tahu task ini sudah sampai mana.&lt;/li&gt;
&lt;li&gt;Senior Dev/Project Manager &lt;strong&gt;tidak perlu bertanya&lt;/strong&gt;: &amp;ldquo;progressnya sudah sampai mana?&amp;rdquo; karena sudah jelas dari point 8.&lt;/li&gt;
&lt;li&gt;Menjadi &lt;strong&gt;dokumentasi dan referensi&lt;/strong&gt; jika ada pekerjaan serupa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mudah onboarding&lt;/strong&gt; developer yang baru join masuk tim.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Melatih disiplin&lt;/strong&gt; developer karena terbiasa lapor progress secara rutin (lapor harian).&lt;/li&gt;
&lt;li&gt;Melatih developer &lt;strong&gt;membuat estimasi&lt;/strong&gt; (point 6). Suatu saat jadi Senior Dev atau Project Manager, jadi lebih mudah.&lt;/li&gt;
&lt;li&gt;Senior Dev/Project Manager pasti &lt;strong&gt;senang&lt;/strong&gt; dengan developer yang seperti ini.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ini tidak hanya bisa diterapkan di github issue ya, bisa di Jira, Trello, Clickup, bitbucket issue. Kalau di tempat kerjanya belum ada format laporan progress harian, bisa coba diusulkan yang seperti ini.&lt;/p&gt;
&lt;p&gt;Nah kebayang &amp;lsquo;kan kalau si Project Manager/Senior Dev suka dengan cara kerja kita? Kalau dia pindah kerja ke tempat lain yang lebih baik, mesti kita diboyong/diajak/direkomendasikan.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat temen-temen. Selamat mencoba dan terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Tips Pull Request Github untuk Memudahkan Reviwer</title>
       <link>https://blog.inweeks.com/tips/tips-pull-request-github-untuk-memudahkan-reviwer/</link>
       <pubDate>Sun, 29 Aug 2021 22:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/tips-pull-request-github-untuk-memudahkan-reviwer/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel ini saya ingin sharing tentang tips pull request github yang disukai oleh reviewer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Ini hanya preferensi saya, menurut pengalaman kerja untuk klien maupun kerja bareng sesama developer selama beberapa tahun terakhir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Saya pingin share tips cara memikat klien dengan menunjukkan cara kita bekerja. Cara ini cukup efektif jika klien kita adalah senior programmer/developer. Yaitu cara membuat deskripsi Pull Request yang mempermudah reviewer (orang yang me-review kerjaan kita).&lt;/p&gt;
&lt;p&gt;Ini salah satu Pull Request yang saya bisa contohkan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/nafiesl/dompet/pull/64&#34;&gt;https://github.com/nafiesl/dompet/pull/64&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pada deskripsi pull request itu ada:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; (rangkuman di Pull request ini kita mengerjakan apa)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checklist&lt;/strong&gt; (apa saja yang kita lakukan di Pull Request ini)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to test on localhost&lt;/strong&gt; (ini menghemat waktu reviewer buat me-review kerjaan kita)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screenshot&lt;/strong&gt; atau lebih bagus lagi kalau kita buatkan rekaman video (ini mempermudah reviewer juga).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tujuannya adalah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menghemat waktu reviewer/senior developer untuk tahu di Pull Request ini kita ngapain (problemnya apa, solusinya apa)&lt;/li&gt;
&lt;li&gt;Mereka bisa cepat menangkap: mana yang sudah dan mana yang belum dikerjakan.&lt;/li&gt;
&lt;li&gt;Menghemat waktu mereka untuk cari tahu gimana cara me-review kerjaan kita (pasti mereka banyak kerjaan lain).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Saya yakin sih, reviewer pada seneng dengan pekerjaan yang seperti itu. Dengan model Pull Request seperti itu, saya dapat feedback yang bagus dari klien.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-08-29-tips-pull-request-github-untuk-memudahkan-reviwer-01.jpg&#34; alt=&#34;Pull Requset Praise&#34;&gt;&lt;/p&gt;
&lt;p&gt;Cara kerja seperti ini pasti bisa diterapkan untuk developer yang kerja di kantor juga (tidak hanya kerja freelance). Tujuannya sama, menghemat waktu senior yang me-review kerjaan kita. Secara tidak langsung, ini jadi kontribusi positif bagi perusahaan. Proses review sebuah tugas bisa lebih efisien.&lt;/p&gt;
&lt;p&gt;Jadi kalau di tempat kerjanya belum ada template Pull Request, bisa coba diusulkan. Mudah2an bermanfaat untuk temen-temen. Selamat mencoba.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Bertanya dan Menjawab di Forum Komunitas</title>
       <link>https://blog.inweeks.com/komunitas/cara-bertanya-dan-menjawab-di-forum-komunitas/</link>
       <pubDate>Sat, 31 Jul 2021 09:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/komunitas/cara-bertanya-dan-menjawab-di-forum-komunitas/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Kali ini saya ingin sharing tentang komunikasi di forum komunitas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Ini hanya preferensi saya, menurut pengalaman berkomunitas selama beberapa tahun terakhir. Bukan jadi aturan komunitas tertentu.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;kenapa-dibahas&#34;&gt;Kenapa dibahas?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Banyak yang japri ke saya, diarahkan ke grup, ternyata sudah tanya, tapi tidak ditanggapi. Ternyata karena pertanyaannya tidak lengkap, jadi orang malas merespons.&lt;/li&gt;
&lt;li&gt;Cara bertanya menunjukkan seberapa baik kemampuan kita mengkomunikasikan problem.&lt;/li&gt;
&lt;li&gt;Cara menjawab menunjukkan seberapa baik kita diajak kerjasama.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;cara-bertanya&#34;&gt;Cara bertanya&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Sebelum tanya, coba cari tahu dulu di grup, siapa tahu ada yang sudah pernah tanya kasus yang sama sebelumnya.&lt;/li&gt;
&lt;li&gt;Bertanya yang lengkap, usahakan tidak membuat orang lain bertanya balik.&lt;/li&gt;
&lt;li&gt;Usahakan menghemat waktu orang yang membantu.&lt;/li&gt;
&lt;li&gt;Tunjukkan sudah googling dengan keyword apa.&lt;/li&gt;
&lt;li&gt;Hormati semua orang yang menjawab, jika ada jawaban yang kita anggap sepele, hargai dan tetap berterima kasih.&lt;/li&gt;
&lt;li&gt;Jika ketemu solusi, usahakan memberi tanda &amp;ldquo;solved&amp;rdquo; dan merangkum solusi yang diterapkan.&lt;/li&gt;
&lt;li&gt;Jangan lupa terima kasih, mention orang yang membantu sampai solved, ini jadi penghargaan bagi teman-teman yang membantu menjawab.&lt;/li&gt;
&lt;li&gt;Jika ketemu solusi, jangan menghapus posting, karena dapat dimanfaatkan oleh member/teman-teman lain yang memiliki kasus serupa.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;cara-menjawab&#34;&gt;Cara Menjawab&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Jangan takut salah kalau menjawab. Lebih baik tahu salah daripada mengira pikiran kita benar.&lt;/li&gt;
&lt;li&gt;Lebih baik tidak menjawab daripada jawaban tidak bermanfaat. Saya pribadi, biasanya menjawab seperti seolah-olah ditanya saat interview kerja. Karena jawaban kita itu dilihat banyak orang, termasuk developer senior, business owner dan para leader.&lt;/li&gt;
&lt;li&gt;Jangan takut bilang &amp;ldquo;saya tidak paham&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Lihat apakah sudah ada yang menjawab dengan jawaban kita? Jika sudah ada, tinggal kasih like atau lengkapi.&lt;/li&gt;
&lt;li&gt;Jika ada yang bertanya lanjutan japri, dengan sopan, arahkan agar bertanya ke grup. Tujuan
&lt;ul&gt;
&lt;li&gt;Agar member lain bisa ikut belajar&lt;/li&gt;
&lt;li&gt;Agar member lain bisa bantu jawab&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;manfaat&#34;&gt;Manfaat&lt;/h2&gt;
&lt;p&gt;Manfaat banyak membantu jawab pertanyaan di komunitas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jadi ilmu yang bermanfaat, amal jariyah.&lt;/li&gt;
&lt;li&gt;Membuat kita dikenal orang (jawaban kita bisa menentukan reputasi kita di mata teman-teman member komunitas).&lt;/li&gt;
&lt;li&gt;Bisa mempromosikan skill. Cara kita menjawab dengan baik dan jawaban yang menjadi solusi bisa jadi sarana promosi untuk skill kita.&lt;/li&gt;
&lt;li&gt;Bisa tahu banyak error dan cara menanganinya (ada kemungkinan kita juga kena error serupa di kemudian hari).&lt;/li&gt;
&lt;li&gt;Jadi mengerti banyak studi kasus/project yang kita belum pernah tahu sebelumnya.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tips&#34;&gt;Tips&lt;/h2&gt;
&lt;p&gt;Bagi penanya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jangan hapus posting pertanyaan jika sudah ketemu solusi, agar diskusi tersebut bisa menjadi manfaat untuk member lain juga.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bagi penjawab/member komunitas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Anggap anda di posisi penanya, kira-kira apa yang akan anda lakukan jika ketemu kasus yang sama?&lt;/li&gt;
&lt;li&gt;Jika bertemu dengan pertanyaan yang dirasa kurang lengkap, ajari penanya bagaimana cara bertanya yang baik.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik teman-teman, itu saja tips cara komunkasi di forum komunitas. Jika ada yang belum dipahami, atau ada tambahan dari teman-teman, silakan tuliskan di kolom komentar. Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Perangkat Kerja Freelance Web Developer</title>
       <link>https://blog.inweeks.com/tool/perangkat-kerja-freelance-web-developer/</link>
       <pubDate>Wed, 30 Jun 2021 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/perangkat-kerja-freelance-web-developer/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel ini, saya ingin bagi informasi perangkat-perangkat yang saat ini saya gunakan untuk bekerja sebagai freelance web developer:&lt;/p&gt;
&lt;h2 id=&#34;perangkat-keras&#34;&gt;Perangkat Keras&lt;/h2&gt;
&lt;h3 id=&#34;laptop&#34;&gt;Laptop&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Lenovo Thinkpad E480-48IA&lt;/p&gt;
&lt;p&gt;Ini laptop kerja utama, baterainya awet, rata-rata 6-7 jam.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prosesor: Core i5-8250U&lt;/li&gt;
&lt;li&gt;Penyipanan: SSD M2 VGEN 512GB + HDD 1TB 5400RPM&lt;/li&gt;
&lt;li&gt;RAM: 2 x 4GB DDR4 2400&lt;/li&gt;
&lt;li&gt;Display: 14&amp;quot; FHD (1920 x 1080) Intel UHD 620&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HP 14R017TX&lt;/p&gt;
&lt;p&gt;Ini laptop cadangan, hanya untuk dirumah, baterainya hanya tahan 10 menit. Kadang dipakai main game, karena kartu grafisnya lebih bagus dari laptop utama.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prosesor: Core i3 4030U&lt;/li&gt;
&lt;li&gt;Penyipanan: SSD Sandisk 240GB + HDD 500TB 5400RPM&lt;/li&gt;
&lt;li&gt;RAM: 2 x 4GB DDR3L&lt;/li&gt;
&lt;li&gt;Display: 14&amp;quot; HD (1366 x 768) NVIDIA GeForce 820M&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;monitor&#34;&gt;Monitor&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;LG 22&amp;quot; 22MK430H&lt;/li&gt;
&lt;li&gt;Samsung 24&amp;quot; C24F390FHE&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;meja&#34;&gt;Meja&lt;/h3&gt;
&lt;p&gt;Saya pakai 2 Meja Kayu, dibuat di tukang kayu, masing-masing&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Panjang: 120cm&lt;/li&gt;
&lt;li&gt;Lebar: 60cm&lt;/li&gt;
&lt;li&gt;Tinggi: 70cm&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;kursi&#34;&gt;Kursi&lt;/h3&gt;
&lt;p&gt;Council Kursi Kantor Sandaran Tinggi beli di Informa&lt;/p&gt;
&lt;h3 id=&#34;audio&#34;&gt;Audio&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Headset Standar bawaan HP Samsung&lt;/p&gt;
&lt;p&gt;Headset enak di-kuping, ringkas, suaranya dan mikrofonnya jernih. Tanpa noise cancel jadi dipakai meeting ngga enak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Logitech Stereo Headset H151 Black&lt;/p&gt;
&lt;p&gt;Ini hanya dipakai saat meeting, karena ada noise cancelnya. Kalau dipakai rekam video atau audio, masih bagusan yang headset Samsung.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;perangkat-lunak&#34;&gt;Perangkat Lunak&lt;/h2&gt;
&lt;h3 id=&#34;sistem-operasi-dan-kelengkapan&#34;&gt;Sistem Operasi dan Kelengkapan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Linux Mint 20 Ulyana XFCE&lt;/p&gt;
&lt;p&gt;Ini dipakai di laptop Lenovo E480. Saya pakai yang versi XFCE karena ringan dan gesit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux Mint 18.3 Sylvia XFCE&lt;/p&gt;
&lt;p&gt;Ini dipakai di laptop HP 14R017TX.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;terminal-emulator&#34;&gt;Terminal Emulator&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;XFCE Terminal&lt;/p&gt;
&lt;p&gt;Saya pakai ini karena bawaan XFCE, dan sangat cukup untuk kebutuhan saya. Ada sedikit &lt;a href=&#34;https://github.com/nafiesl/dotfiles/blob/master/bashrc#L59-L67&#34;&gt;custom di bashrc&lt;/a&gt; untuk menampilkan git branch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;office-suite&#34;&gt;Office Suite&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Libre Office Writer 6.4 (bawaan linux Mint 20)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;launcher&#34;&gt;Launcher&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://launchpad.net/synapse-project&#34;&gt;Synapse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini launcher dengan shortut &lt;code&gt;ctrl+space&lt;/code&gt; agar cepat membuka aplikasi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://launchpad.net/plank&#34;&gt;Plank&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini launcher berupa dock di desktop. Untuk beberapa aplikasi yang dipakai setiap hari serta aplikasi-aplikasi yang sedang aktif dibuka.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;monitor-internet&#34;&gt;Monitor Internet&lt;/h4&gt;
&lt;p&gt;Ini alat bantu biar tahu apakah internet sedang lancar atau gangguan.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.xfce.org/panel-plugins/xfce4-netload-plugin/start&#34;&gt;xfce4-netload-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini internet speed indicator yang tampil di desktop panel XFCE, untuk Linux Mint 20 Ulyana.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/GGleb/indicator-netspeed-unity&#34;&gt;Indicator Netspeed Unity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini internet speed indicator untuk Linux Mint 18.3 Sylvia. Sebenarnya ini lebih enak daripada xfce4-netload-plugin, tapi untuk ubuntu 18.04 ke atas, sudah tidak ada dukunganlagi (tidak bisa diinstall).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;web-development&#34;&gt;Web Development&lt;/h3&gt;
&lt;h4 id=&#34;browser&#34;&gt;Browser&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Firefox&lt;/p&gt;
&lt;p&gt;Ini browser utama, untuk web development dan browsing sehari-hari. Saya pindah dari chromium ke Firefox karena lebih yakin untuk penyimpanan password.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chromium&lt;/p&gt;
&lt;p&gt;Ini browser cadangan kalau butuh simulasi login beberapa user sekaligus untuk uji coba aplikasi web.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;teks-editor&#34;&gt;Teks Editor&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saya pakai sublime text karena gesit. Fitur-fitur default plus beberapa package/pluginnya mempermudah saya lebih produktif menulis kode. Saya pernah menggunakan teks editor lain tapi belum ada ketemu uang settng.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://tarot.freeshell.org/leafpad&#34;&gt;Leafpad&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Leafpad ini adalah teks editor bawaan lubuntu. Sangat ringan seperti aplika sinotepad pada windows. Saya biasanya pakai ini untuk bikin catatan cepat, seperti saat meeting, atau catatan sementara sebelum dimasukkan ke &lt;a href=&#34;https://joplinapp.org&#34;&gt;Joplin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;web-server&#34;&gt;Web Server&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Apache (localhost)&lt;/p&gt;
&lt;p&gt;Saya pakai apache web server di localhost agar bisa mengakses project melalui browser sesuai urutan direktori, tanpa harus konfigurasi server block setiap project baru.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nginx (live server)&lt;/p&gt;
&lt;p&gt;Untuk staging dan production server, saya menggunakan nginx, karena konfigurasi server block tiap deploy aplikasi web cenderung mudah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP 7&lt;/p&gt;
&lt;p&gt;Karena saya banyak bekerja dengan bahasa program PHP sejak awal freelance, maka di localhost saya install PHP mulai versi 7.0 s/d 7.4. Mengikuti spesifikasi project-project lama. Biasaya di localhost saya pindah-pindah versi PHP apache dengan bantuan &lt;a href=&#34;https://github.com/nafiesl/apache-php-switcher&#34;&gt;php switch script&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Baca juga: &lt;a href=&#34;https://blog.inweeks.com/ubuntu/cara-pindah-pindah-versi-php-pada-lamp-stack-di-ubuntu/&#34;&gt;Cara Pindah-Pindah Versi PHP pada LAMP stack di Ubuntu&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;database&#34;&gt;Database&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;MariaDB 10&lt;/p&gt;
&lt;p&gt;Sebagian besar project aplikasi web yang saya buat, menggunakan database MariaDB versi 10.2 dan 10.3.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postgres 9.5&lt;/p&gt;
&lt;p&gt;Beberapa project aplikasi web diminta oleh kliennya secara spesifik menggunakan postgres. Jadi di localhost saya install juga untuk kebutuhan development.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;produktifitas&#34;&gt;Produktifitas&lt;/h3&gt;
&lt;h4 id=&#34;komunikasi&#34;&gt;Komunikasi&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Telegram Desktop&lt;/p&gt;
&lt;p&gt;Saya paling banyak aktif di telegram dengan username: &lt;a href=&#34;https://t.me/nafiesl&#34;&gt;@nafiesL&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slack&lt;/p&gt;
&lt;p&gt;Untuk komunikasi pekerjaan, baik bersama partner maupun klien, menggunakan slack. Slack juga saya gunakan untuk lapor error log di beberapa project yang lumayan penting dipantau.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mint.pkgs.org/20.1/mint-import-amd64/whatsapp-desktop_0.6.1_amd64.deb.html&#34;&gt;Whatsapp Desktop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saya pakai whatsapp desktop dari linux mint software center.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;mengelola-proyek&#34;&gt;Mengelola Proyek&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;Free-PMO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aplikasi web opensource yang saya buat untuk mengelola project freelance, item-item pekerjaan, penagihan, dan langganan customer (hosting dan domain).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;mengelola-aktifitas-kerja&#34;&gt;Mengelola Aktifitas Kerja&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://joplinapp.org&#34;&gt;Joplin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini aplikasi yang saya pakai untuk checklist item yang saya kerjakan setiap hari. Detailnya saya tulis di artikel ini: &lt;a href=&#34;https://blog.inweeks.com/tool/produktifitas-dengan-joplin-untuk-aktifitas-harian/&#34;&gt;Produktifitas dengan Joplin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;mengelola-password&#34;&gt;Mengelola Password&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mozilla.org/en-US/firefox/lockwise&#34;&gt;Firefox Lockwise&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini fitur bawaan firefox untuk simpan kredensial (username/email dan password) login. Aplikasi ini juga ada versi androidnya, jadi bisa dipakai untuk simpan password di handphone juga.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;git-client&#34;&gt;Git Client&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.gnome.org/Apps/Gitg&#34;&gt;GitG&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Untuk penggunaan git dengan GUI, saya pilih aplikasi GitG karena ringan. Tapi versi GitG yang saya gunakan adalah versi 0.2.7. Yap, versi jadul, tapi in ringan sekali dan sangat cukup untuk kebutuhan saya di localhost.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;perangkat-online&#34;&gt;Perangkat Online&lt;/h2&gt;
&lt;h3 id=&#34;internet&#34;&gt;Internet&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Faznet (internet 15Mbps)&lt;/p&gt;
&lt;p&gt;Karena tidak ada jalur internet kabel lain, saya pakai Faznet. Tapi lumayan stabil, jarang gangguan dan lumayan murah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tri (internet cadangan)&lt;/p&gt;
&lt;p&gt;Agar tidak terkedala kalau ada gangguan internet, saya pakai Tri untuk internet cadangan. Di samping paketnya murah, jaringan Tri juga stabil di rumah saya. Jadi sangat cukup untuk kebutuhan backup saja.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;penyedia-serverhosting&#34;&gt;Penyedia Server/Hosting&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Vultr&lt;/p&gt;
&lt;p&gt;Saya pakai vultr mulai tahun 2017 untuk project-project klien. Karena waktu itu paling murah untuk spesifikasi setara di provider lain. Sampai sekarang (tahun 2021) terhitung jarang gangguan sih. Jarang ada komplain dari klien juga. Ada juga klien juga saya buatkan akun vultr.com sendiri jadi tagihan langsung masuk ke kartu kredit beliau.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Digital Ocean&lt;/p&gt;
&lt;p&gt;Waktu itu vultr membatasi hanya 5 VPS per akun pelanggannya, jadi mulai 2019, saya pakai digital ocean, karena waktu itu ada klien baru yang perlu VPS. (Tapi sekarang di vultr sudah bisa lebih dari 5 VPS karena bisa diminta tambah via support ticket).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IDCloudHost&lt;/p&gt;
&lt;p&gt;Untuk klien-klien yang ingin hemat biaya hosting, saya pakai IDCloudHost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rumah Web&lt;/p&gt;
&lt;p&gt;Untuk langganan beberapa domain, saya pakai Rumah Web, karena pilihan ekstensi domainnya banyak dan harga domain relatif lebih murah daripada provider domain lain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle Cloud&lt;/p&gt;
&lt;p&gt;Saya pakai Oracle Cloud untuk server sendiri. Hosting blog ini dan kebutuhan trial aplikasi web klien. Oracle cloud ini menyediakan layanan VPS Always Free. Silakan baca-baca tentang Oracle Cloud di &lt;a href=&#34;https://blog.inweeks.com/cloud-server/#oracle-cloud&#34;&gt;halaman Cloud Server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;code-hosting&#34;&gt;Code Hosting&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Github&lt;/p&gt;
&lt;p&gt;Di github kebanyakan saya pasang project open source. Bisa cek di profil saya (&lt;a href=&#34;https://github.com/nafiesl&#34;&gt;https://github.com/nafiesl&lt;/a&gt;). Ada beberapa private repo punya klien juga, yang kerjanya kolaborasi dengan developer lain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bitbucket&lt;/p&gt;
&lt;p&gt;Saya pakai Bitbuket untuk project-project freelance. Mulai sekitar tahun 2016. Karena waktu itu github belum gratis private repo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, rasanya itu yang bisa saya bagikan ke teman-teman, jika ada hal lain yang kira-kira belum terdaftar, bisa teman-teman sampaikan di komentar. Insya Allah saya tambahkan listnya jika memang ada.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya. Semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Solusi Problem: Akses Github jika Port 22 Diblok oleh Internet Provider</title>
       <link>https://blog.inweeks.com/tips/solusi-problem-akses-github-bitbucket-port-22-diblok-internet-provider/</link>
       <pubDate>Sat, 08 May 2021 21:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/solusi-problem-akses-github-bitbucket-port-22-diblok-internet-provider/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Buat yang punya problem akses ke port 22 diblok oleh internet provider, mungkin akan dapat kesulitan seperti berikut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Akses VPS dengan SSH (port 22: Connection timed out)&lt;/li&gt;
&lt;li&gt;Pull dan push ke Github (port 22: Connection timed out)&lt;/li&gt;
&lt;li&gt;Pull dan push ke Bitbucket (port 22: Connection timed out)&lt;/li&gt;
&lt;li&gt;Hal-hal lain yang berkaitan dengan SSH dan SCP (mungkin Gitlab juga)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Sebagai contoh, kalau port 22 diblok oleh internet provider, waktu kita mau pull changes di github, kita dapat pesan ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git pull origin master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# (loading lama...)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh: connect to host github.com port 22: Connection timed out
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fatal: Could not read from remote repository.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Please make sure you have the correct access rights
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;and the repository exists.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hal serupa ketika kita mau akses VPS via SSH (dengan default port 22):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh username@domain.co.id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# (loading lama...)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh: connect to host domain.co.id port 22: Connection timed out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;solusi&#34;&gt;Solusi&lt;/h2&gt;
&lt;h3 id=&#34;1-untuk-github-dan-bitbucket&#34;&gt;1. Untuk Github dan Bitbucket&lt;/h3&gt;
&lt;p&gt;Untuk source code hosting seperti github dan bitbucket, mereka menyediakan port yang berbeda untuk kebutuhan push dan pull. Berikut referensinya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Di github: &lt;a href=&#34;https://docs.github.com/en/github/authenticating-to-github/using-ssh-over-the-https-port#enabling-ssh-connections-over-https&#34;&gt;Enabling SSH connections over HTTPS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Di bitbucket: &lt;a href=&#34;https://jira.atlassian.com/browse/BCLOUD-9519?focusedCommentId=2232534&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-2232534&#34;&gt;Jira BCLOUD-9519 - port 22: Connection refused&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dari referensi di atas, untuk sistem operasi Ubuntu dan turunannya kita bisa set SSH config dengan cara berikut:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vim ~/.ssh/config &lt;span style=&#34;color:#75715e&#34;&gt;# boleh pakai nano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Tambah config di bawah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host bitbucket.org
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Hostname  altssh.bitbucket.org
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Port  &lt;span style=&#34;color:#ae81ff&#34;&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host github.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Hostname ssh.github.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Port &lt;span style=&#34;color:#ae81ff&#34;&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  User git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Simpan dan exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kita coba push ke Github, akan muncul yang seperti ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git push origin main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The authenticity of host &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;[ssh.github.com]:443 ([18.138.xxx.xxx]:443)&amp;#39;&lt;/span&gt; can&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;t be established.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTx.....
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;Warning: Permanently added &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;ssh.github.com&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:443,&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;18.138.xxx.xxx&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;:443&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;RSA&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; to the list of known hosts.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enumerating objects: 11, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Counting objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;11/11&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Delta compression using up to &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; threads
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compressing objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;6/6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Writing objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;6/6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;599&lt;/span&gt; bytes | 299.00 KiB/s, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;delta 4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, reused &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;delta 0&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Resolving deltas: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;4/4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, completed with &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; local objects.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To github.com:username/nama-repo.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   b21a15f..3b7510e  main -&amp;gt; main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Artinya sudah sukses. Untuk Bitbucket lebih kurang sama.&lt;/p&gt;
&lt;h3 id=&#34;2-untuk-vps&#34;&gt;2. Untuk VPS&lt;/h3&gt;
&lt;p&gt;Di VPS-nya kita mesti ubah default port SSHnya, dari &lt;code&gt;22&lt;/code&gt; menjadi (misal) &lt;code&gt;49152&lt;/code&gt;. Caranya coba cek artikel dari web om Musa Amin:&lt;/p&gt;
&lt;p&gt;Link: &lt;a href=&#34;https://musaamin.web.id/cara-mengubah-nomor-port-ssh-server&#34;&gt;Cara Mengubah Nomor Port SSH Server (musaamin.web.id)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Di artikel itu diajari juga cara akses SSH dengan beda port. Tapi kalau mau ringkas, kita bisa buat ssh config seperti di atas untuk VPS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vim ~/.ssh/config &lt;span style=&#34;color:#75715e&#34;&gt;# boleh pakai nano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Tambah config di bawah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host domain.co.id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  HostName 161.xxx.xxx.31 &lt;span style=&#34;color:#75715e&#34;&gt;# IP address atau nama domain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Port &lt;span style=&#34;color:#ae81ff&#34;&gt;49152&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# Sesuai port baru di VPS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  IdentityFile /home/username/.ssh/id_rsa &lt;span style=&#34;color:#75715e&#34;&gt;# Ini path private key localhost kita&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  IdentitiesOnly yes 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Simpan dan exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dari situ bisa kita coba ssh seperti biasa (tanpa mengisi custom port), mestinya sudah aman.&lt;/p&gt;
&lt;p&gt;Baik teman-teman, itu saja tips untuk yang mengalami problem akses ke port 22 diblok oleh internet provider terkait dengan akses ke VPS atau Github dan Bitbucket. Terima kasih sudah berkenan membaca. Semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Regular Auto Backup MySQL / MariaDB di Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/regular-auto-backup-mysql-mariadb-di-ubuntu/</link>
       <pubDate>Mon, 26 Apr 2021 09:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/regular-auto-backup-mysql-mariadb-di-ubuntu/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Untuk mengamankan data dari potensi kehilangan Saya butuh melakukan backup seluruh database MariaDB di laptop seminggu sekali, ini adalah &lt;strong&gt;hal kedua&lt;/strong&gt; yang saya lakukan untuk menghindari kehilangan data mysql/mariaDB kalau ada apa-apa di OS linux mint laptop (&lt;strong&gt;hal pertama&lt;/strong&gt;, &lt;a href=&#34;https://blog.inweeks.com/ubuntu/cara-mengubah-direktori-data-mariadb-dengan-symlink-di-ubuntu/&#34;&gt;baca Cara Mengubah Direktori Data MariaDB dengan Symlink&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Waktu googling sana sini, saya ketemu artikel yang berisi &lt;em&gt;bash script&lt;/em&gt; untuk membuat backup seluruh database MySQL atau MariaDB menjadi 1 file per database.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://skycube.net/2014/06/13/backup-all-mysql-databases-in-separate-files&#34;&gt;https://skycube.net/2014/06/13/backup-all-mysql-databases-in-separate-files&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini saya buat gist &lt;em&gt;bash script&lt;/em&gt;-nya.&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/nafiesl/22c19e4ef466e1fcf6fdd8fc7c76f9e2.js&#34;&gt;&lt;/script&gt;

&lt;h2 id=&#34;cara-menggunakan-script&#34;&gt;Cara menggunakan script&lt;/h2&gt;
&lt;p&gt;Cara pakainya di localhost/laptop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Buat script dulu &lt;code&gt;backupMySQLDBsinSingleFiles.sh&lt;/code&gt; bebas taruh di direktori mana saja, misal saya di &lt;code&gt;/home/nafies/Documents/Nafies/backups&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pastikan kedua variable di dalam file tersebut sesuai dengan credential MySQL di localhost&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;USER=&amp;#39;root&amp;#39;
PASSWORD=&amp;#39;root_password&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Pastikan MySQL/MariaDB kita sedang aktif.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coba jalankan script (abaikan &lt;code&gt;[Warning] Using a password...&lt;/code&gt;):&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd /home/nafies/Documents/Nafies/backups
$ chmod +x backupMySQLDBsinSingleFiles.sh
$ ./backupMySQLDBsinSingleFiles.sh
Starting MySQL Backup
Mon Apr 26 06:41:40 +08 2021
mysql: [Warning] Using a password on the command line interface can be insecure.
Dumping database: database_1
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Dumping database: database_2
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Dumping database: database_3
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Dumping database: database_4
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Finished MySQL Backup
Mon Apr 26 06:41:51 +08 2021
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;Sampai di sini kita akan mendapatkan direktori/folder baru berupa timestamp &lt;code&gt;20210426_064140&lt;/code&gt;, didalamnya ada file &lt;code&gt;*.sql.gz&lt;/code&gt; sebagai file backup tiap database. Seperti gambar di bawah:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-26-regular-auto-backup-mysql-mariadb-di-ubuntu-01.jpg&#34; alt=&#34;Backup result backupMySQLDBsinSingleFiles.sh&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;setup-cron-untuk-auto-backup-regular&#34;&gt;Setup CRON untuk auto backup regular&lt;/h2&gt;
&lt;p&gt;Sekarang kita lanjutkan membuat CRON sintax agar proses backup jalan otomatis seminggu sekali. Misal tiap hari Sabtu jam 10 pagi. Jalankan perintah di terminal berikut:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ crontab -e
# Taruh paling bawah
0 10 * * 6 cd /home/nafies/Documents/Nafies/backups &amp;amp;&amp;amp; ./backupMySQLDBsinSingleFiles.sh 2&amp;gt;&amp;amp;1 | /usr/bin/logger -t MYSQL_BACKUP
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Persis seperti gambar di bawah, kemudian simpan.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-26-regular-auto-backup-mysql-mariadb-di-ubuntu-02.jpg&#34; alt=&#34;CRON setup for backupMySQLDBsinSingleFiles.sh&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sampai di sini selesai prosesnya.&lt;/p&gt;
&lt;p&gt;Nanti cron akan melakukan backup otomatis seluruh database setiap Sabtu jam 10 pagi dari setting ini:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0 10 * * 6 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Referensi: &lt;a href=&#34;https://crontab.guru&#34;&gt;https://crontab.guru&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Baik teman-teman, itu saja tips cara membuat auto backup database MySQL atau MariaDB secara regular di Ubuntu dan distro turunannya. Jika ada yang belum dipahami, silakan tuliskan dikolom komentar. Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Dompet - Sistem Pencatatan Keuangan Personal</title>
       <link>https://blog.inweeks.com/open-source/dompet-sistem-percatatan-keuangan-personal/</link>
       <pubDate>Sat, 24 Apr 2021 08:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/open-source/dompet-sistem-percatatan-keuangan-personal/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Saya ingin share project aplikasi web yang saya kembangkan untuk mencatat keuangan personal. Namanya &lt;a href=&#34;https://github.com/nafiesl/dompet&#34;&gt;&lt;strong&gt;Dompet&lt;/strong&gt;&lt;/a&gt;. Aplikasi ini membantu saya dalam mencatat pengeluaran dan pemasukan harian, mengkategorikan/jenis transaksi, mencatat hutang piutang, dan melihat ringkasan transaksi per bulan dan per tahun. Project ini awalnya dibangun dengan Laravel 5.5, sekarang sudah upgrade ke Laravel 8.x (sampai artikel ini ditulis).&lt;/p&gt;
&lt;p&gt;Ini link download source code: &lt;a href=&#34;https://github.com/nafiesl/dompet&#34;&gt;&lt;strong&gt;https://github.com/nafiesl/dompet&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-24-dompet-sistem-percatatan-keuangan-personal-01.jpg&#34; alt=&#34;Dompet Transactions&#34;&gt;&lt;/p&gt;
&lt;p&gt;Secara umum fitur-fiturnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;List Transaksi perbulan (dengan pencarian, filter bulan, kategori dan partner)&lt;/li&gt;
&lt;li&gt;List transaksi per hari&lt;/li&gt;
&lt;li&gt;Input pengeluaran dan pemasukan&lt;/li&gt;
&lt;li&gt;Input hutang-piutang&lt;/li&gt;
&lt;li&gt;Pengkategorian transaksi (misal: Iuran, Pulsa, Internet, Cicilan Motor)&lt;/li&gt;
&lt;li&gt;Partner transaksi (misal: PLN, PDAM, FIF, atau nama orang)&lt;/li&gt;
&lt;li&gt;Laporan/summary transaksi per tahun&lt;/li&gt;
&lt;li&gt;Pindah bahasa (en untuk English, id untuk Bahasa Indonesia)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Project ini free and open-source &lt;a href=&#34;https://github.com/nafiesl/dompet/blob/master/LICENSE&#34;&gt;berlisensi MIT&lt;/a&gt;, yang intinya :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Saya persilakan temen-teman untuk menggunakan/memodifikasi/mendistribusikan ulang untuk tujuan pribadi atau komersil, dengan catatan file &lt;strong&gt;LICENSE&lt;/strong&gt; di dalam project &lt;strong&gt;tidak diubah/dihilangkan&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;List fitur lengkap, cara installnya, dan detail lisensinya dijelaskan dalam playlist youtube berikut:&lt;/p&gt;
&lt;div class=&#34;responsive-embed responsive-embed-16by9&#34;&gt;
    &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/videoseries?list=PL9u04c1WqLheUxJ2s5pECjHfDPrBn9I6e&#34; title=&#34;YouTube video plDemo Project Dompet (Open Source)ayer&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;(Link ke youtube: &lt;a href=&#34;https://www.youtube.com/playlist?list=PL9u04c1WqLheUxJ2s5pECjHfDPrBn9I6e&#34;&gt;&lt;strong&gt;Demo Project Dompet&lt;/strong&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Aplikasi ini dibangun dengan metode Test-driven Development, yang sudah kita ulas di banyak artikel pada blog ini pada topik: &lt;a href=&#34;https://blog.inweeks.com/tdd-laravel/&#34;&gt;&lt;strong&gt;TDD Laravel&lt;/strong&gt;&lt;/a&gt;. Jadi sudah ada feature dan unit test setiap action usernya. Bagi yang ingin belajar automated testing Laravel, mungkin bisa jadi referensi. Silakan jika teman-teman yang ingin berkontribusi dalam mengembangkan project ini.&lt;/p&gt;
&lt;p&gt;Semoga manfaat yang saya dapatkan dari project ini juga bermanfaat untuk orang banyak. Terima kasih teman-teman.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Membuat Sponsor Button pada Github Repository</title>
       <link>https://blog.inweeks.com/tips/cara-membuat-sponsor-button-github-repository/</link>
       <pubDate>Wed, 07 Apr 2021 22:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/cara-membuat-sponsor-button-github-repository/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Github sponsor adalah satu fitur di github untuk memfasilitasi para inisator project open-source menggalang dukungan dana dari pengguna atau suporter project open-source-nya.&lt;/p&gt;
&lt;p&gt;Cara membuatnya sebenarnya ada di &lt;a href=&#34;https://docs.github.com/en/github/administering-a-repository/displaying-a-sponsor-button-in-your-repository&#34;&gt;dokumentasi github ini&lt;/a&gt;, tapi di sini saya buatkan panduan Bahasa Indonesianya.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Login ke github: &lt;a href=&#34;https://github.com/login&#34;&gt;https://github.com/login&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buka project repository yang ingin kita tambah tombol sponsor, misal di saya: &lt;a href=&#34;https://github.com/nafiesl/dompet&#34;&gt;https://github.com/nafiesl/dompet&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik tab &amp;ldquo;&lt;strong&gt;Settings&lt;/strong&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-07-cara-membuat-sponsor-button-github-repository-01.jpg&#34; alt=&#34;Github Sponsor Button&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Centang checklist &amp;ldquo;&lt;strong&gt;Sponsorships&lt;/strong&gt;&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &amp;ldquo;&lt;strong&gt;Set up sponsor button&lt;/strong&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-07-cara-membuat-sponsor-button-github-repository-02.jpg&#34; alt=&#34;Github Sponsor Button&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kita akan masuk halaman text editor untuk buat file baru &lt;code&gt;.github/FUNDING.yml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada bagian &lt;code&gt;custom:&lt;/code&gt; isi link ke layanan dukungan dana dalam bentuk array, contoh:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;custom: [&amp;#39;https://trakteer.id/nafiesl&amp;#39;, &amp;#39;https://...&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(Baris lainnya boleh dihapus.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Isikan pesan commit, misal &amp;ldquo;Add Sponsorship&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik tombol &amp;ldquo;&lt;strong&gt;Commit new file&lt;/strong&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-07-cara-membuat-sponsor-button-github-repository-03.jpg&#34; alt=&#34;Github Sponsor Button&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refresh halaman repository, mestinya sudah muncul tombol &amp;ldquo;&lt;strong&gt;Sponsor&lt;/strong&gt;&amp;rdquo;, kalau di-klik muncul informasi link dukungannya.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Link dukungan juga akan muncul di sisi kanan halaman repository github.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-07-cara-membuat-sponsor-button-github-repository-04.jpg&#34; alt=&#34;Github Sponsor Button&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sip, semoga tips ini bermanfaat.&lt;/p&gt;
&lt;p&gt;BTW saya aktif membuat beberapa project open-source juga (&lt;a href=&#34;https://blog.inweeks.com/about/#open-source-projects&#34;&gt;cek di sini&lt;/a&gt;). Kalau temen-temen ingin memberikan dukungan dana, bisa cek tombol Sponsor tiap repository githubnya, atau lihat halaman &amp;ldquo;&lt;a href=&#34;https://blog.inweeks.com/donate/&#34;&gt;&lt;strong&gt;donate&lt;/strong&gt;&lt;/a&gt;&amp;rdquo; ini.&lt;/p&gt;
&lt;p&gt;Terima kasih temen-temen untuk waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Menghubungi Customer Support GCP (Google Cloud Platform)</title>
       <link>https://blog.inweeks.com/web-server/cara-menghubungi-customer-support-gcp-google-cloud-platform/</link>
       <pubDate>Sat, 03 Apr 2021 21:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/cara-menghubungi-customer-support-gcp-google-cloud-platform/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Beberapa bulan terakhir, ada beberapa pembaca yang menghubungi saya melalui telegram dan email, berdiskusi tentang problem akun GCP mereka. Kebanyakan diskusi tentang &lt;a href=&#34;https://blog.inweeks.com/web-server/ketika-gcp-free-account-habis-12-bulan/&#34;&gt;saat masa trial GCP habis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Beberapa topik diantaranya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ada yang tidak sengaja mendaftar GCP tapi tidak tahu fungsinya buat apa, bagaimana cara menghapus akunnya.&lt;/li&gt;
&lt;li&gt;Ada yang sudah mendaftar, lalu bertanya bagaimana cara stop layanan GCP agar tidak kena charge.&lt;/li&gt;
&lt;li&gt;Ada juga yang kena charge kartu kreditnya karena ada pemakaian layanan GCP tanpa dia tahu penyebabnya.&lt;/li&gt;
&lt;li&gt;Ada juga yang masa free-trial habis, tetapi ingin melakukan migrasi data ke tempat (provider) lain.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah untuk kasus yang bermasalah teknis atau billing/tagihan, berikut cara menghubungi Customer Support Google Cloud Platform:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sebelum mulai, pastikan kita sudah login dengan akun google yang dipakai untuk mendaftar GPC nya ya.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-04-03-cara-menghubungi-customer-support-gcp-google-cloud-platform-01.jpg&#34; alt=&#34;Customer Support Google Cloud Platform&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kunjungi link ini: &lt;a href=&#34;https://console.cloud.google.com/support/chat&#34;&gt;https://console.cloud.google.com/support/chat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Klik Get GCP billing Support&lt;/li&gt;
&lt;li&gt;Klik Contact Billing Support&lt;/li&gt;
&lt;li&gt;Pilih akun kartu kredit nya (walaupun sudah non aktif)&lt;/li&gt;
&lt;li&gt;Klik continue.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dari situ kita sampaikan problem yang kita hadapi di akun Google Cloud Platform, baik problem teknis ataupun tagihan/billing (pakai bahasa Inggris).&lt;/p&gt;
&lt;p&gt;Ya tahu sih, ini channel customer support untuk &lt;strong&gt;billing/tagihan&lt;/strong&gt;, tapi kalau kita tanya teknikal, minta bantu sambungkan ke tim yang berwenang, gitu aja.&lt;/p&gt;
&lt;p&gt;Kemudian nanti ada 2 kemungkinan saluran response dari customer supportnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dibalas dengan Chat (di situ juga).&lt;/li&gt;
&lt;li&gt;Dibalas dengan email.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kemungkinan mereka ngga balas segera, butuh waktu beberapa jam, karena perbedaan zona waktu antara kita dengan mereka. Tapi dari beberapa orang yang sudah menghubungi customer support, pemasalahannya selesai. Alhamdulillah.&lt;/p&gt;
&lt;p&gt;Sip, semoga tips ini bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Produktifitas dengan Joplin untuk Aktifitas Harian</title>
       <link>https://blog.inweeks.com/tool/produktifitas-dengan-joplin-untuk-aktifitas-harian/</link>
       <pubDate>Sun, 07 Mar 2021 12:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/produktifitas-dengan-joplin-untuk-aktifitas-harian/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Diantara banyak note-taking dan to-do list app yang pernah saya gunakan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Google Keep (sync desktop dan android)&lt;/li&gt;
&lt;li&gt;Standard Notes (sync desktop dan android),&lt;/li&gt;
&lt;li&gt;xfce4-notes-plugin (desktop XFCE),&lt;/li&gt;
&lt;li&gt;Indicator sticy notes (desktop ubuntu),&lt;/li&gt;
&lt;li&gt;Color Notes (android),&lt;/li&gt;
&lt;li&gt;Trello (sync desktop dan android), dan&lt;/li&gt;
&lt;li&gt;Joplin (sync desktop dan android)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Saat ini saya memilih Joplin karena sangat cukup untuk produktifitas kerja dan kehidupan personal. Saya pakai Joplin sejak sekitar Oktober 2019.&lt;/p&gt;
&lt;h2 id=&#34;pengenalan-joplin&#34;&gt;Pengenalan Joplin&lt;/h2&gt;
&lt;p&gt;Joplin adalah sebuah aplikasi open-source untuk note-taking dan to-do list yang bisa sinkronisasi antar Aplikasi Desktop, Android dan IOSnya.&lt;/p&gt;
&lt;p&gt;Link Download: &lt;a href=&#34;https://joplinapp.org&#34;&gt;https://joplinapp.org&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;privasi-penting&#34;&gt;Privasi (penting)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Joplin tidak punya server untuk nyimpan data kita, dia menyediakan fitur sinkronisasi antar perangkat dengan media online dari pihak ketiga (one drive, dropbox, nextcloud).&lt;/li&gt;
&lt;li&gt;Kita bisa aktifkan sinkrodinasi dengan end-to-end encription. Jadi data yang tersimpan di media online tidak bisa dibaca orang, selain perangkat-perangkat yang terhubung.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;pemanfaatan&#34;&gt;Pemanfaatan&lt;/h2&gt;
&lt;p&gt;Joplin saya gunakan tiap hari untuk produktifitas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menulis rencana dan aktual aktifitas harian&lt;/li&gt;
&lt;li&gt;Notulen meeting dengan klien atau partner&lt;/li&gt;
&lt;li&gt;Mencatat ide yang terlintas pikiran&lt;/li&gt;
&lt;li&gt;Code snippet&lt;/li&gt;
&lt;li&gt;Link-link penting.&lt;/li&gt;
&lt;li&gt;Panduan singkat ketika ketemu solusi dari suatu masalah.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;fitur&#34;&gt;Fitur&lt;/h2&gt;
&lt;p&gt;Ini fitur diantara Joplin yang saya sering gunakan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;End to end sync via dropbox ke joplin Laptop dan joplin Ponsel (tanpa ada batasan jumlah perangkat)&lt;/li&gt;
&lt;li&gt;Buat konten (todo list dan note) dengan markdown&lt;/li&gt;
&lt;li&gt;Struktur notebook/folder dapat diatur sesuai kebutuhan&lt;/li&gt;
&lt;li&gt;Dark mode (biar ngga silaw)&lt;/li&gt;
&lt;li&gt;Pencarian konten&lt;/li&gt;
&lt;li&gt;Tag konten&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;tips-penggunaan-untuk-aktiftas-harian&#34;&gt;Tips Penggunaan untuk Aktiftas Harian&lt;/h2&gt;
&lt;p&gt;Berikut tips yang bisa saya share untuk teman-teman yang ingin memberdayakan Joplin untuk aktifitas harian:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Notebook/folder diatur sesuai kebutuhan.&lt;/li&gt;
&lt;li&gt;Untuk aktifitas harian, note list dalam notebook/folder berjudul tanggal.&lt;/li&gt;
&lt;li&gt;Dalam satu note (harian) dibuat struktur planning dan aktual aktifitas
&lt;ul&gt;
&lt;li&gt;Plan hari ini (berupa checklist)&lt;/li&gt;
&lt;li&gt;Aktual aktifitas pagi, siang, sore dan malam (berupa bullet list)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tiap mau stop kerja setiap hari, bikin plan aktifitas besok.&lt;/li&gt;
&lt;li&gt;Besok harinya, sebelum mulai aktifitas, cek plan yang sudah ditulis hari sebelumnya.&lt;/li&gt;
&lt;li&gt;Selama tidak ada distraksi, fokus menyelesaikan plan hari ini.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-03-07-produktifitas-dengan-joplin-untuk-aktifitas-harian-01.jpg&#34; alt=&#34;Joplin for Productivity&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sejak awal tahun 2021, saya berusaha selalu mengisi plan dan aktifitas aktual setiap hari, agar penggunaan waktu lebih efisien, sehingga waktu untuk keluarga bisa lebih banyak.&lt;/p&gt;
&lt;p&gt;Demikian sharing kali ini tentang produktifitas dengan joplin, siapa tau ada yang cari-cari software todo list dan note-taking yang simple, privat dan open-source.&lt;/p&gt;
&lt;p&gt;Mudah-mudahan bermanfaat buat teman-teman pembaca. Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Manfaat Project Open-Source dan Github bagi Programmer</title>
       <link>https://blog.inweeks.com/freelancing/manfaat-project-open-source-dan-github-bagi-programmer/</link>
       <pubDate>Sat, 06 Mar 2021 23:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/manfaat-project-open-source-dan-github-bagi-programmer/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;h2 id=&#34;tentang-project-open-source&#34;&gt;Tentang Project Open-Source&lt;/h2&gt;
&lt;p&gt;Dari yang saya pahami, project open-source adalah sebuah project yang dibuat atas inisiatif sendiri kemudian dipublikasikan secara publik, sehingga menjadi manfaat juga untuk orang lain. Jika project tersebut menarik, maka banyak orang yang menggunakan dan berkontribusi untuk pengembangannya. Contohnya: Bahasa pemrograman, framework, library/package, atau software jadi yang bisa digunakan orang lain.&lt;/p&gt;
&lt;p&gt;Secara umum, biasanya programmer yang membuat project open source untuk kebutuhan sendiri, kemudian dipublikasikan untuk mengenalkan dirinya/produknya/jasanya kepada komunitas, mendapatkan side project/penghasilan tambahan, dan menolong orang lain. Teman-teman bisa belajar tentang project open-source di website &lt;a href=&#34;https://opensource.guide/id&#34;&gt;https://opensource.guide/id&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;tentang-github&#34;&gt;Tentang Github&lt;/h2&gt;
&lt;p&gt;Di dunia programming hampir semua orang tahu tentang &lt;a href=&#34;https://github.com&#34;&gt;github&lt;/a&gt;, sebuah media untuk menyimpan source code berupa repository, banyak digunakan oleh para programmer maupun perusahaan. Selain menyimpan kode, di github kita juga dapat berinteraksi dengan para pengguna dan kontributor, misal berdiskusi tentang improvement fitur dan bug melalui fitur issue. Di github sudah ada tool &lt;a href=&#34;https://blog.inweeks.com/tool/testing-laravel-tentang-continuous-integration/&#34;&gt;continuous integration&lt;/a&gt; melalui github actions.&lt;/p&gt;
&lt;p&gt;Nah, untuk menyimpan source code, di github itu ada 2 pilihan privasi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Public&lt;/strong&gt;, source code kita dibuka untuk umum, semua orang bisa lihat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private&lt;/strong&gt;, source code tidak dibuka untuk umum, hanya kita dan orang-orang yang kita ijinkan yang bisa melihat.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-03-06-manfaat-project-open-source-dan-github-bagi-programmer-01.jpg&#34; alt=&#34;Github Repository Privacy&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pada artikel ini, kita hanya membahas privasi repository yang &lt;strong&gt;public&lt;/strong&gt; (open-source) serta manfaatnya bagi programmer.&lt;/p&gt;
&lt;h2 id=&#34;yang-bisa-dilihat-orang-lain&#34;&gt;Yang Bisa Dilihat Orang Lain&lt;/h2&gt;
&lt;p&gt;Ketika kita mempublikasikan project open-source ke github, orang lain akan melihat:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Problem apa yang kita hadapi dan apa solusinya&lt;/li&gt;
&lt;li&gt;Programming stack apa saja yang kita bisa, skill apa yang kita punya, seberapa ahli kita di situ.&lt;/li&gt;
&lt;li&gt;Seberapa baik susunan kode yang kita buat, apakah mudah dipahami atau asal-asalan.&lt;/li&gt;
&lt;li&gt;Bagaimana kita menyelesaikan sesuatu, implementasi fitur dan implementasi solusi dari suatu masalah.&lt;/li&gt;
&lt;li&gt;Seberapa cepat kita mengerjakan sesuatu, dilihat dari history commit yang kita push.&lt;/li&gt;
&lt;li&gt;Seberapa informatif pesan commit yang kita buat (ini penting untuk kerja kolaborasi).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ketika kita menangani &lt;strong&gt;issue di github&lt;/strong&gt;, orang lain akan melihat:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Seberapa komunikatif kita terhadap orang lain.&lt;/li&gt;
&lt;li&gt;Seberapa sopan kita berpendapat.&lt;/li&gt;
&lt;li&gt;Seberapa cepat kita respons terhadap suatu masalah.&lt;/li&gt;
&lt;li&gt;Seberapa baik kita menanggapi usul/ide orang lain.&lt;/li&gt;
&lt;li&gt;Seberapa cepat kita mendapatkan solusi atas permasalahan yang dilaporkan.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;yang-bisa-disimpulkan-orang-lain&#34;&gt;Yang Bisa Disimpulkan Orang Lain&lt;/h2&gt;
&lt;p&gt;Orang lain jadi mudah mengenal skill dan personalitas kita. Akan lebih mudah memutuskan apakah kita cocok diajak kerjasama atau tidak.&lt;/p&gt;
&lt;h2 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Ini beberapa manfaat yang bisa kita dapatkan jika memiliki project Open-Source di Github:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mudah menolong orang lain yang memerlukan contoh project atau contoh potongan kode.&lt;/li&gt;
&lt;li&gt;Menjadi sarana marketing gratis untuk menunjukkan skill.&lt;/li&gt;
&lt;li&gt;Mempermudah orang lain utk mempertimbangkan jika ingin bekerjasama (atau meng-hire kita).&lt;/li&gt;
&lt;li&gt;Mudah menjawab jika ada yang bertanya: &amp;ldquo;Anda punya skill apa saja?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Menjadi nilai plus saat melamar pekerjaan.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;saran-dari-saya&#34;&gt;Saran dari saya:&lt;/h3&gt;
&lt;p&gt;Untuk mendapatkan manfaat di atas, buatlah minimal 1 project open-source yang kira-kira jadi manfaat untuk orang banyak, buatlah dengan serius, lalu upload ke github dan publikasikan ke forum, komunitas, dan grup-grup facebook yang cocok.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik temen-teman itu sedikit share pengalaman saya tentang project open-source dan github. Mudah-mudahan bermanfaat. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Pindah-Pindah Versi PHP pada LAMP stack di Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/cara-pindah-pindah-versi-php-pada-lamp-stack-di-ubuntu/</link>
       <pubDate>Sun, 14 Feb 2021 14:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/cara-pindah-pindah-versi-php-pada-lamp-stack-di-ubuntu/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;h2 id=&#34;latar-belakang&#34;&gt;Latar Belakang&lt;/h2&gt;
&lt;p&gt;Untuk kebutuhan web development dengan PHP dan Laravel, di laptop saya menggunakan LAMP Stack, dan saya install beberapa versi PHP, mulai versi 7.0 s/d 8.0, karena saya masih maintain project untuk klien dari Laravel versi 5.2 s/d Laravel versi baru untuk kebutuhan project baru dan project riset. Dari situ saya butuh pindah-pindah versi PHP sesuai project yang sedang dihandle.&lt;/p&gt;
&lt;h2 id=&#34;script-php-swither&#34;&gt;Script PHP Swither&lt;/h2&gt;
&lt;p&gt;Cari-cari di github, saya ketemu repository ini:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rapidwebltd/php-switch-scripts&#34;&gt;https://github.com/rapidwebltd/php-switch-scripts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pada project tersebut tersedia :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;File &lt;code&gt;setup.sh&lt;/code&gt; untuk install beberapa versi PHP sekaligus dari &lt;code&gt;ppa:ondrej/php&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;File &lt;code&gt;switch-to-php-x.x.sh&lt;/code&gt; untuk pindah ke versi &lt;code&gt;x.x&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dan karena saya butuh beberapa modifikasi &lt;em&gt;script&lt;/em&gt; untuk install extension PHP-nya, saya fork repository tersebut dan modifikasi sesuai kebutuhan:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nafiesl/apache-php-switcher&#34;&gt;https://github.com/nafiesl/apache-php-switcher&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;cara-menggunakan-script&#34;&gt;Cara Menggunakan Script&lt;/h2&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;sebelum-mulai&#34;&gt;Sebelum Mulai&lt;/h3&gt;
&lt;p&gt;Pastikan di localhost kita sudah terinstall LAMP stack atau minimal apache2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sekarang kita clone project di atas, bebas saja mau pilih antara kedua repositori di atas. Misal mau pakai yang punya saya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Clone projectnya ke localhost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd ~/projects/scripts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/nafiesl/apache-php-switcher.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Masuk direktorinya&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd apache-php-switcher
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# (optional) Install semua versi PHP yang tersedia&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./setup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Gunakan script switch untuk pindah-pindah versi PHP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./switch-to-php-7.2.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./switch-to-php-7.3.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./switch-to-php-7.0.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cek versi PHP aktif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php -v
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PHP 7.0.33-40+ubuntu20.04.1+deb.sury.org+1 ......
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ok sampai di sini mestinya kita sudah bisa pindah-pindah versi PHP dengan cara:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd ~/projects/scripts/apache-php-switcher
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./switch-to-php-7.3.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./switch-to-php-7.2.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;permudah-dengan-bash-alias&#34;&gt;Permudah dengan Bash Alias&lt;/h2&gt;
&lt;p&gt;Kalau cara di atas terkesan repot (harus &lt;code&gt;cd&lt;/code&gt; ke direktori lalu jalankan &lt;em&gt;script&lt;/em&gt;), kita bisa permudah lagi dengan bash alias. Caranya seperti berikut:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vim ~/.bash_aliases &lt;span style=&#34;color:#75715e&#34;&gt;# Bisa juga pakai nano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Masukkan tambahkan script ini&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias setphp56&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~/projects/scripts/apache-php-switcher/switch-to-php-5.6.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias setphp70&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~/projects/scripts/apache-php-switcher/switch-to-php-7.0.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias setphp72&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~/projects/scripts/apache-php-switcher/switch-to-php-7.2.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias setphp73&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~/projects/scripts/apache-php-switcher/switch-to-php-7.3.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias setphp74&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~/projects/scripts/apache-php-switcher/switch-to-php-7.4.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias setphp80&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;~/projects/scripts/apache-php-switcher/switch-to-php-8.0.sh&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Simpan dan keluar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Terapkan alias terbaru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ source ~/.bash_aliases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Pindah-pindah versi PHP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ setphp73
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ setphp74
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ setphp72
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sip, dari sini satu urusan hidup kita terasa lebih mudah. Mudah-mudahan bermanfaat. Terima kasih teman-teman.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Mengubah Direktori Data MariaDB dengan Symlink di Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/cara-mengubah-direktori-data-mariadb-dengan-symlink-di-ubuntu/</link>
       <pubDate>Sat, 13 Feb 2021 23:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/cara-mengubah-direktori-data-mariadb-dengan-symlink-di-ubuntu/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;h2 id=&#34;latar-belakang&#34;&gt;Latar Belakang&lt;/h2&gt;
&lt;p&gt;Sedikit cerita, saya pernah kehilangan data MySQL/MariaDB di localhost karena install ulang Sistem Operasi di laptop. Di localhost laptop, saya mengunakan aplikasi &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;Free PMO&lt;/a&gt; untuk mengelola proyek freelance. Jadi data software tersebut hilang sekitar 3 bulan, akhirnya saya harus input ulang berdasarkan dokumen-dokumen kerja yang saya simpan. Tapi tidak bisa kembali semua. :(&lt;/p&gt;
&lt;p&gt;Dari situ saya memikirkan gimana caranya agar setiap install ulang sistem operasi, data MySQL/MariaDB saya tetap aman. Akhirnya ketemu &lt;a href=&#34;https://www.digitalocean.com/community/tutorials/how-to-change-a-mysql-data-directory-to-a-new-location-using-a-symlink&#34;&gt;artikel di Digital Ocean&lt;/a&gt; untuk mengubah direktori data MySQL. Saya praktekkan dengan database MariaDB ke disk drive/partisi harddisk lain di laptop, alhamdulillah berhasil.&lt;/p&gt;
&lt;h2 id=&#34;mengubah-direktori-data-mariadbmysql&#34;&gt;Mengubah Direktori Data MariaDB/MySQL&lt;/h2&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;sebelum-mulai&#34;&gt;Sebelum Mulai&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Di sini kita akan praktek memindahkan direktori data MariaDB ke partisi atau disk drive lain pada laptop/PC, pertama kita perlu &lt;strong&gt;konfigurasi auto-mount&lt;/strong&gt; untuk disk drive yang akan digunakan, caranya bisa cek di &lt;a href=&#34;https://blog.inweeks.com/ubuntu/cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu/&#34;&gt;artikel ini&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada contoh ini, saya punya absolute path untuk direktori di partisi lain seperti ini: &lt;code&gt;/mnt/ND/DB/mysql&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lakukan &lt;strong&gt;backup database&lt;/strong&gt; seluruh terlebih dahulu, untuk menghindari resiko data hilang. Saya biasa pakai &lt;em&gt;script&lt;/em&gt; dari &lt;a href=&#34;https://skycube.net/2014/06/13/backup-all-mysql-databases-in-separate-files&#34;&gt;artikel ini&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lanjut, buka terminal, berikut perintahnya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Stop MySQL (MariaDB) service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl stop mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl status mysql &lt;span style=&#34;color:#75715e&#34;&gt;# Pastikan service mysql sudah stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Backup dulu direktori datanya&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo cp -a /var/lib/mysql /var/lib/mysql_bak
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Pindahkan direktori data MySQL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mv /var/lib/mysql /mnt/ND/DB/mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Buat symlink&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo ln -s /mnt/ND/DB/mysql /var/lib/mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Update apparmor tunables alias&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/apparmor.d/tunables/alias &lt;span style=&#34;color:#75715e&#34;&gt;# Bisa pakai nano juga&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias /var/lib/mysql/ -&amp;gt; /mnt/ND/DB/mysql/, &lt;span style=&#34;color:#75715e&#34;&gt;# Tambahkan paling bawah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl restart apparmor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Start MySQL (MariaDB) service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl start mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl status mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK sampai di situ pastikan MySQL (MariaDB) service aktif kembali, lalu coba akses datanya melalui MySQL client biasa yang kita gunakan (PHPMyAdmin / Adminer / MySQL Workbench). Mestinya isi database sama seperti sebelumnya.&lt;/p&gt;
&lt;h2 id=&#34;restore-database-setelah-install-ulang-sistem-operasi&#34;&gt;Restore Database (Setelah Install Ulang Sistem Operasi)&lt;/h2&gt;
&lt;p&gt;Nah saat install ulang sistem operasi, kita coba restore database menggunakan direktori data yang sudah kita ubah di atas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;sebelum-mulai-1&#34;&gt;Sebelum Mulai&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Lakukan &lt;strong&gt;konfigurasi auto-mount&lt;/strong&gt; untuk disk drive yang akan digunakan, cek di &lt;a href=&#34;https://blog.inweeks.com/ubuntu/cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu/&#34;&gt;artikel ini&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pastikan MariaDB sudah terinstall di sistem operasi yang baru.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik kita lanjut, buka terminal, jalankan perintah berikut:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Stop MySQL (MariaDB) service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl stop mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl status mysql &lt;span style=&#34;color:#75715e&#34;&gt;# Pastikan service mysql sudah stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Backup direktori data default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mv /var/lib/mysql /var/lib/mysql_bak
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Buat symlink&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo ln -s /mnt/ND/DB/mysql /var/lib/mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Update apparmor tunables alias&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/apparmor.d/tunables/alias &lt;span style=&#34;color:#75715e&#34;&gt;# Atau pakai nano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias /var/lib/mysql/ -&amp;gt; /mnt/ND/DB/mysql/, &lt;span style=&#34;color:#75715e&#34;&gt;# Tambahkan paling bawah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl restart apparmor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Start MySQL (MariaDB) service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl start mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl status mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sampai di sini, mestinya MySQL (MariaDB) service kembali normal, bisa kita cek melalui MySQL client, data lama mestinya sudah kembali.&lt;/p&gt;
&lt;h2 id=&#34;mengembalikan-data-direktori-default&#34;&gt;Mengembalikan Data Direktori Default&lt;/h2&gt;
&lt;p&gt;OK sekarang gimana kalau kita mengalami kendala saat melakukan langkah di atas? Kita mesti &lt;em&gt;revert&lt;/em&gt; atau mengembalikan pengaturan direktori data default seperti semula. Caranya seperti ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Stop MySQL (MariaDB) service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl stop mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl status mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Hapus direktori data hasil symlink&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo rm /var/lib/mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Kembalikan direktori hasil backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mv /var/lib/mysql_bak /var/lib/mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Update apparmor tunables alias&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/apparmor.d/tunables/alias
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias /var/lib/mysql/ -&amp;gt; /mnt/ND/DB/mysql/, &lt;span style=&#34;color:#75715e&#34;&gt;# Hapus baris ini&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl restart apparmor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Start MySQL (MariaDB) service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl start mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo systemctl status mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sip, seharusnya setelah dikembalikan, data MySQL (MariaDB) sudah kembali seperti data default saat baru install MariaDB.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Cara ini cukup cepat dan efektif untuk mengembalikan data jika kita sering install ulang sistem operasi. Sebelumnya saya melakukan backup dan restore database secara manual, tetapi prosesnya lama dan jadi masalah jika kelupaan.&lt;/li&gt;
&lt;li&gt;Backup database juga tetap perlu dilakukan sebelum install ulang sistem operasi, untuk jaga-jaga jika proses pengembalian data dari disk drive lain gagal dilakukan. Saya biasa pakai &lt;em&gt;script&lt;/em&gt; dari &lt;a href=&#34;https://skycube.net/2014/06/13/backup-all-mysql-databases-in-separate-files&#34;&gt;artikel ini&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Saya pernah gagal saat restore direktori data (MySQL service tidak bisa start), akhirnya membuat symlink lagi ke disk drive lain, kemudian restore hasil backup (summary nomor 2). Setelah dicek harddisknya, ternyata penyebabnya ada &lt;em&gt;bad sector&lt;/em&gt; pada harddisk. Jadi perlu diwaspadai juga.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, demikian teman-teman, mudah-mudahan bermanfaat. Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Auto-Mount Disk Drive dengan Gnome Disk Utility di Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu/</link>
       <pubDate>Thu, 11 Feb 2021 08:48:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Pada posting ini, Saya ingin share cara seting &lt;em&gt;auto-mount&lt;/em&gt; &lt;em&gt;disk drive&lt;/em&gt; di Ubuntu dan distro-distro turunannya. Pengaturan &lt;em&gt;Auto-mount&lt;/em&gt; disk ini tujuannya agar &lt;em&gt;harddisk&lt;/em&gt; atau partisi &lt;em&gt;harddisk&lt;/em&gt; bisa langsung digunakan tanpa harus mount secara manual (meng-klik disk nya di file manager).&lt;/p&gt;
&lt;p&gt;Manfaatnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jika ada aplikasi/software yang kita pakai sehari-hari yang disimpan pada disk tersebut, bisa dijalankan langsung tanpa mount disknya.&lt;/li&gt;
&lt;li&gt;Jika kita buat &lt;em&gt;symlink&lt;/em&gt; suatu direktori pada disk tersebut di Home directory, &lt;em&gt;symlink&lt;/em&gt;-nya langsung bisa digunakan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, untuk mengatur &lt;em&gt;auto-mount disk drive&lt;/em&gt;, kita menggunakan software &amp;ldquo;gnome-disk-utility&amp;rdquo;. Biasanya sudah include di Ubuntu dan distro-distro turunannya, di sini Saya menggunakan Linux Mint 20).&lt;/p&gt;
&lt;p&gt;Langkah pengaturannya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Buka software &amp;ldquo;gnome-disk-utility&amp;rdquo; atau &amp;ldquo;Disks&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-02-11-cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu-01.jpg&#34; alt=&#34;Run Gnome Disk Utility&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pilih &lt;em&gt;harddisk&lt;/em&gt; yang berisi partisi atau drive yang ingin di &lt;em&gt;auto-mount&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-02-11-cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu-02.jpg&#34; alt=&#34;Setting Auto-mount Gnome Disk Utility&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik pada &lt;strong&gt;partisi atau drive&lt;/strong&gt; yang ingin di &lt;em&gt;auto-mount&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;Partition Options&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;Edit Mount Options&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika kotak dialog Mount Options terbuka, klik &lt;strong&gt;switch&lt;/strong&gt; &amp;ldquo;User Session Defaults&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-02-11-cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu-03.jpg&#34; alt=&#34;Auto-mount on Startup Gnome Disk Utility&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pastikan &lt;strong&gt;Mount at system startup&lt;/strong&gt; tercentang.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada &lt;strong&gt;Identify As&lt;/strong&gt;, pilih &amp;ldquo;LABEL=xxxx&amp;rdquo;, di mana xxxx adalah label &lt;em&gt;disk drive&lt;/em&gt; ketika kita membuat partisinya.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;OK&lt;/strong&gt; (isi password user jika diminta).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ketika kembali ke tampilan utama, kita akan melihat partisi atau &lt;em&gt;disk drive&lt;/em&gt; nya akan &lt;strong&gt;ditandai bintang&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-02-11-cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu-04.jpg&#34; alt=&#34;Auto-mount Disk Drive Gnome Disk Utility&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart laptop/PC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setelah restart, kita buka terminal dan jalankan &lt;code&gt;$ ll /mnt&lt;/code&gt;, maka &lt;em&gt;disk drive&lt;/em&gt; yang &lt;em&gt;auto-mount&lt;/em&gt; tadi akan muncul di sana.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-02-11-cara-auto-mount-disk-drive-dengan-gnome-disk-utility-di-ubuntu-05.jpg&#34; alt=&#34;Disk Drive on mnt directory&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dari sini kita bisa mengunakan &lt;code&gt;/mnt/xxxx&lt;/code&gt; sebagai &lt;em&gt;absolute path&lt;/em&gt; untuk partisi atau &lt;em&gt;disk drive&lt;/em&gt; tersebut.&lt;/p&gt;
&lt;p&gt;Demikian teman-teman, semoga bermanfaat. Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Monitor Error Laravel: Sentry</title>
       <link>https://blog.inweeks.com/laravel/monitor-error-laravel-dengan-sentry/</link>
       <pubDate>Sat, 30 Jan 2021 23:10:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/monitor-error-laravel-dengan-sentry/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Beberapa waktu yang lalu, saya pernah posting tentang cara &lt;a href=&#34;https://blog.inweeks.com/laravel/laravel-log-viewer/&#34;&gt;membuat laravel log viewer&lt;/a&gt; untuk mengecek error log yang terjadi saat laravel sudah dideploy ke &lt;em&gt;production server&lt;/em&gt;. Cara ini lumayan mempermudah sih, tapi ada yang lebih canggih lagi dari itu.&lt;/p&gt;
&lt;p&gt;Kali ini kita membahas cara yang lebih modern untuk monitor error laravel di production. Yaitu menggunakan layanan &lt;a href=&#34;https://sentry.io&#34;&gt;Sentry.io&lt;/a&gt;. Yaitu sebuah layanan monitoring aplikasi online yang membantu developer untuk men-diagosis error, memperbaiki error dan optimasi performa sistem. Layanan paket gratisnya sangat cukup untuk kebutuhan freelancer, kita bisa cek di &lt;a href=&#34;https://sentry.io/pricing&#34;&gt;halaman pricingnya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Berikut beberapa tampilan sentry.io ketika ada error yang ditangkapnya dari project laravel kita:&lt;/p&gt;
&lt;h2 id=&#34;daftar-event-error&#34;&gt;Daftar Event Error&lt;/h2&gt;
&lt;p&gt;Ini tampilan sentry ketika kita membuka list error yang terjadi pada sebuah project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-01.jpg&#34; alt=&#34;Daftar Event Error&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-daftar-project&#34;&gt;1. Daftar Project&lt;/h3&gt;
&lt;p&gt;Berisi pilihan project yang kita pasangi sentry.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-02.jpg&#34; alt=&#34;Daftar Project Sentry&#34;&gt;&lt;/p&gt;
&lt;p&gt;Saya belum tahu apakah ada batasan jumlah project untuk tipe akun free. Saat ini baru saya coba untuk 6 project laravel.&lt;/p&gt;
&lt;h3 id=&#34;2-pilihan-environment&#34;&gt;2. Pilihan Environment&lt;/h3&gt;
&lt;p&gt;Di sini kita dapat memilih environment mana yang ingin kita lihat list errornya. Ini sangat berguna jika kita memiliki beberapa server deployment untuk aplikasi yang sama, misal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Staging (deployment untuk pengujian)&lt;/li&gt;
&lt;li&gt;Production (deployment untuk live sistem).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi kita bisa tahu, error ini berasal dari environment yang mana.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-03.jpg&#34; alt=&#34;Daftar Environment Sentry&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kalau untuk project temen-temen, mungkin ada env &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;qa&lt;/code&gt;, &lt;code&gt;uat&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;. Sesuai dengan deployment setup masing-masing.&lt;/p&gt;
&lt;h3 id=&#34;3-umur-error&#34;&gt;3. Umur Error&lt;/h3&gt;
&lt;p&gt;Informasi ini untuk mengetahui, sudah berapa lama/sejak kapan error ini pertama terjadi (tanda &lt;strong&gt;nomor 3&lt;/strong&gt; pada screenshot di atas).&lt;/p&gt;
&lt;h3 id=&#34;4-terakhir-terjadi-error&#34;&gt;4. Terakhir terjadi error&lt;/h3&gt;
&lt;p&gt;Informasi ini untuk mengetahui, kapan terakhir error terjadi (tanda &lt;strong&gt;nomor 4&lt;/strong&gt; pada screenshot di atas). Misal sebelumnya terjadi 3 jam yang lalu, setelah kita lakukan perbaikan (&lt;em&gt;bugfix&lt;/em&gt;) seharusnya error tidak terjadi lagi setelahnya.&lt;/p&gt;
&lt;h3 id=&#34;5-berapa-kali-error-terjadi&#34;&gt;5. Berapa kali error terjadi&lt;/h3&gt;
&lt;p&gt;Informasi ini untuk mengetahui berapa kali error sudah terjadi sejak awal hingga saat ini (tanda &lt;strong&gt;nomor 5&lt;/strong&gt; pada screenshot di atas).&lt;/p&gt;
&lt;h3 id=&#34;6-assignee-penugasan-cocok-untuk-team&#34;&gt;6. Assignee (penugasan, cocok untuk team)&lt;/h3&gt;
&lt;p&gt;Fitur ini dapat kita manfaatkan jika kita mendaftar dengan paket sentry &amp;ldquo;team&amp;rdquo; atau di atasnya. Fitur ini untuk menugasi developer siapa yang akan meng-handle error tersebut, agar lebih mudah mem-follow-up nya (tanda &lt;strong&gt;nomor 6&lt;/strong&gt; pada screenshot di atas).&lt;/p&gt;
&lt;h2 id=&#34;detail-event-error&#34;&gt;Detail Event Error&lt;/h2&gt;
&lt;p&gt;Ini tampilan detail ketika kita klik salah satu error dari list error di atas.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-04.jpg&#34; alt=&#34;Detail Event Error&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-pesan-error&#34;&gt;1. Pesan error&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-05.jpg&#34; alt=&#34;Detail Event Error&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kita bisa lihat pesan error yang terjadi pada section &lt;strong&gt;EXCEPTION&lt;/strong&gt; (tanda &lt;strong&gt;nomor 1&lt;/strong&gt; pada screenshot di atas). Ini yang biasa muncul di file log laravel.&lt;/p&gt;
&lt;h3 id=&#34;2-informasi-client-browser-dan-sistem-operasi&#34;&gt;2. Informasi Client (Browser dan Sistem Operasi)&lt;/h3&gt;
&lt;p&gt;Di halaman ini kita bisa melihat ketika terjadi error, client/user menggunakan sistem operasi apa dan browser apa (tanda &lt;strong&gt;nomor 2&lt;/strong&gt; pada screenshot di atas).&lt;/p&gt;
&lt;h3 id=&#34;3-grafik-kejadian-per-hari&#34;&gt;3. Grafik kejadian per hari&lt;/h3&gt;
&lt;p&gt;Pada grafik ini (tanda &lt;strong&gt;nomor 3&lt;/strong&gt; pada screenshot di atas), kita bisa lihat intensitas kejadian error (seberapa sering terjadi perharinya).&lt;/p&gt;
&lt;h3 id=&#34;4-waktu-kejadian-pertama-dan-terbaruterakhir&#34;&gt;4. Waktu kejadian pertama dan terbaru/terakhir&lt;/h3&gt;
&lt;p&gt;Di bawah grafik kejadian error per hari, kita bisa melihat informasi, kapan error terjadi pertama kali, dan kapan terakhir atau kejadian terbaru untuk error tersebut (tanda &lt;strong&gt;nomor 4&lt;/strong&gt; pada screenshot di atas).&lt;/p&gt;
&lt;h3 id=&#34;5-stacktrace-yang-informatif&#34;&gt;5. Stacktrace yang informatif&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-06.jpg&#34; alt=&#34;Stacktrace Event Error&#34;&gt;&lt;/p&gt;
&lt;p&gt;Biasanya ketika membaca error log di laravel log, ada stacktrace (file-file yang dilewati sebelum error/exception terjadi). Nah di sentry ini, kita dapat informasi stacktrace yang lumayan lengkap, sampai isi variabel yang masuk pada method/function juga bisa dilihat. Ini sangat mempermudah kita untuk proses &lt;em&gt;debugging&lt;/em&gt; dan &lt;em&gt;bugfix&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;6-query-database&#34;&gt;6. Query Database&lt;/h3&gt;
&lt;p&gt;Pada bagian &lt;strong&gt;BREADCRUMBS&lt;/strong&gt;, kita bisa melihat &lt;em&gt;query-query database&lt;/em&gt; yang dijalankan oleh laravel sebelum error terjadi. Ini juga akan mempermudah kita untuk proses &lt;em&gt;debugging&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-07.jpg&#34; alt=&#34;Stacktrace Event Error&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;7-curl-sample&#34;&gt;7. cURL Sample&lt;/h3&gt;
&lt;p&gt;Pada detail event error kita juga bisa dapat informasi cURL (request ke web) yang menjadi trigger/pemicu error pada project laravel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-30-monitor-error-laravel-dengan-sentry-08.jpg&#34; alt=&#34;Curl Sample Event Error&#34;&gt;&lt;/p&gt;
&lt;p&gt;Pada cURL sample ini, kita bisa mengetahui form data atau form input yang dikirimkan oleh user ke sistem. Informasi ini bisa kita gunakan untuk simulasi/reproduce error saat proses &lt;em&gt;debugging&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Sentry adalah layanan yang sangat bermanfaat untuk melakukan monitoring error di project kita untuk mempermudah proses &lt;em&gt;debugging&lt;/em&gt; dan &lt;em&gt;bugfix&lt;/em&gt; developer.&lt;/li&gt;
&lt;li&gt;Tidak hanya sebatas PHP/Laravel, Sentry ini support banyak bahasa pemrograman, kita bisa lihat di halaman ini &lt;a href=&#34;https://sentry.io/platforms&#34;&gt;https://sentry.io/platforms&lt;/a&gt;. Taglinenya: &lt;em&gt;&amp;ldquo;Track errors in every language, framework, and library.&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Untuk setup sentry di project laravel cukup mudah, bisa ikuti tutorial dari webnya (&lt;a href=&#34;https://sentry.io/for/laravel&#34;&gt;https://sentry.io/for/laravel&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Sentry support laravel versi lama juga, ada 1 project saya yang laravel versi 5.2, masih bisa setup sentry untuk monitor errornya.&lt;/li&gt;
&lt;li&gt;Akun sentry yang free sangat cukup untuk kebutuhan freelance project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demikian ulasan singkat tentang monitor error pada project laravel dengan sentry. Mudah-mudahan dengan informasi ini dapat mempermudah temen-temen developer/freelance dalam memberikan layanan yang lebih baik untuk user dan kliennya.&lt;/p&gt;
&lt;p&gt;Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Internet Speed Indicator untuk Android</title>
       <link>https://blog.inweeks.com/tips/aplikasi-internet-speed-indicator-android/</link>
       <pubDate>Mon, 04 Jan 2021 08:15:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/aplikasi-internet-speed-indicator-android/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Mungkin ada teman-teman suka monitor kecepatan internet di hape, seperti saya. Untuk melihat seberapa cepat internet saat ini, atau ingin lihat apakah internet sedang lancar atau gangguan. Nah saya ketemu aplikasi &lt;a href=&#34;https://play.google.com/store/apps/details?id=com.internet.speed.meter.lite&#34;&gt;Internet Speed Meter Lite&lt;/a&gt; yang rasanya cocok untuk kebutuhan di atas.&lt;/p&gt;
&lt;p&gt;Di antara fiturnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Indicator kecepatan internet di status bar&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-04-aplikasi-internet-speed-indicator-android-01.jpg&#34; alt=&#34;Internet speed meter lite status bar&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Indicator kecepatan internet di notification&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-04-aplikasi-internet-speed-indicator-android-02.jpg&#34; alt=&#34;Internet speed meter lite notification&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pemakaian kuota harian dari internet SIM card vs Wifi&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2021-01-04-aplikasi-internet-speed-indicator-android-03.jpg&#34; alt=&#34;Internet speed meter lite data usages&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ada juga fitur lainnya untuk versi berbayar, tapi untuk kebutuhan saya pribadi, yang versi lite ini sudah sangat cukup.&lt;/p&gt;
&lt;p&gt;Demikian teman-teman mudah-mudahan bermanfaat. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Menggunakan Fitur Data Provider PHPUnit</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-menggunakan-data-provider-di-phpunit/</link>
       <pubDate>Fri, 07 Jun 2019 09:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-menggunakan-data-provider-di-phpunit/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Dari artikel sebelumnya yang membahas tentang testing laravel, kita membuat beberapa test method untuk &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-refactor-register-feature-test/&#34;&gt;menguji validasi form register user&lt;/a&gt;. Ini kita lakukan karena ingin menguji apakah nilai yang kita berikan sudah sesuai dengan validasi form yang kita tentukan.&lt;/p&gt;
&lt;p&gt;Nah, ternyata untuk melakukan hal seperti ini, kita bisa menggunakan fitur Data Provider dari PHPUnit. Saya bisa mencoba fitur Data Provider ini setelah membaca artikel ini: &lt;a href=&#34;https://tighten.co/blog/tidying-up-your-phpunit-tests-with-data-providers&#34;&gt;Tidying Up Your PHPUnit Tests with Data Providers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dengan menggunakan Data Provider, kita cukup membuat &lt;strong&gt;dua method&lt;/strong&gt;, yaitu:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Satu test method,&lt;/li&gt;
&lt;li&gt;Satu method untuk menyediakan data yang diujikan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kedua method ini membuat phpunit menjalankan satu method test beberapa kali dengan nilai yang berbeda.&lt;/p&gt;
&lt;h2 id=&#34;persiapan-praktek&#34;&gt;Persiapan Praktek&lt;/h2&gt;
&lt;p&gt;Baik, seperti artikel-artikel testing laravel sebelumnya, kita sambung project yang sudah ada di repo ini : &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;Laravel TDD&lt;/a&gt;, tepatnya di &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/e37a615a8662585d5f03dbc7a64e8e9860efa527&#34;&gt;commit ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bagi teman-teman yang ingin ikut praktek silakan clone repository tersebut, install dan jalankan &lt;code&gt;vendor/bin/phpunit&lt;/code&gt;. Pastikan teman-teman dapat hijau dulu pada testingnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2019-06-07-testing-laravel-menggunakan-data-provider-di-phpunit-01.jpg&#34; alt=&#34;Before Data Provider&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hasilnya: &lt;code class=&#34;test-green&#34;&gt;OK (21 tests, 86 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;langsung-praktek&#34;&gt;Langsung Praktek&lt;/h2&gt;
&lt;p&gt;Baik, sekarang kita buka file &lt;code&gt;tests/Feature/Auth/RegisterTest.php&lt;/code&gt; kita tambahkan dua method ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ... getRegisterFields()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_register()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; * @test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; * @dataProvider registrationDataProvider
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;validate_user_register_form&lt;/span&gt;($errorField, $formFields)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;($formFields));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([$errorField]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;registrationDataProvider&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field name, jika name kosong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field name, jika name panjang 260 karakter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor &amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;)]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field email, jika email kosong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field email, jika mengisi email yang tidak valid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username.example.net&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field email, jika mengisi email yang terlalu panjang
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;)]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field password, jika password kosong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field password, jika password kurang dari 6 karakter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ecret&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// error pada field password, jika konfirmasi password tidak sama
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;escret&amp;#39;&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ... user_email_must_be_unique_on_users_table()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nah kedua method tersebut dapat &lt;strong&gt;menggantikan&lt;/strong&gt; delapan test method lainnya:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. user_name_is_required
2. user_name_maximum_is_255_characters
3. user_email_is_required
4. user_email_must_be_a_valid_email
5. user_email_maximum_is_255_characters
6. user_password_is_required
7. user_password_minimum_is_6_characters
8. user_password_must_be_same_with_password_confirmation_field
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sekarang kedelapan method di atas &lt;strong&gt;bisa dihapus&lt;/strong&gt;. Lalu kita jalankan &lt;code&gt;vendor/bin/phpunit&lt;/code&gt; lagi:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2019-06-07-testing-laravel-menggunakan-data-provider-di-phpunit-02.jpg&#34; alt=&#34;After Data Provider&#34;&gt;&lt;/p&gt;
&lt;p&gt;Seharusnya hasilnya tetap sama &lt;code class=&#34;test-green&#34;&gt;OK (21 tests, 86 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;penjelasan-penggunaan-data-provider&#34;&gt;Penjelasan Penggunaan Data Provider&lt;/h2&gt;
&lt;p&gt;Data Provider adalah fitur PHPUnit yang memungkinkan kita menjalankan beberapa test dengan hanya menggunakan satu test method.&lt;/p&gt;
&lt;p&gt;Pada method yang dijadikan Data Provider, seperti &lt;code&gt;registrationDataProvider()&lt;/code&gt;, di sana kita me-return numeric array yang terdiri dari 8 value. Analoginya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;dataProviderMethod&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [$var1, $var2], &lt;span style=&#34;color:#75715e&#34;&gt;// value loop 1,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [$var3, $var4], &lt;span style=&#34;color:#75715e&#34;&gt;// value loop 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        [$var5, $var6], &lt;span style=&#34;color:#75715e&#34;&gt;// value loop 3,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ketika phpunit dijalankan pada test method yang memiliki &lt;code&gt;@dataProvider dataProviderMethod&lt;/code&gt;, maka phpunit akan menjalankan test berulang-ulang (loop) sebanyak jumlah value yang berasal dari &lt;code&gt;dataProviderMethod&lt;/code&gt;. Jika ada 3 value, maka test method tersebut diulang 3 kali.&lt;/p&gt;
&lt;p&gt;Setiap perulangan test method, phpunit menggunakan value dari masing-masing loop tadi pada test method yang bersangkutan. Jadi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$var1&lt;/code&gt; dan &lt;code&gt;$var2&lt;/code&gt; digunakan pada loop pertama.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$var3&lt;/code&gt; dan &lt;code&gt;$var4&lt;/code&gt; digunakan pada loop kedua.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$var5&lt;/code&gt; dan &lt;code&gt;$var6&lt;/code&gt; digunakan pada loop ketiga.&lt;/li&gt;
&lt;li&gt;Dan seterusnya &amp;hellip;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Seperti yang sudah kita kerjakan di atas, satu test method yang mendapatkan bantuan dari data provider berisi 8 value, maka test method akan diulang 8 kali, sehingga dapat menggantikan 8 test method lainnya.&lt;/p&gt;
&lt;h2 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Fitur data provider dapat mempermudah kita dalam:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menguji satu &lt;em&gt;helper function&lt;/em&gt; dengan beberapa kondisi nilai (parameter dan nilai return nya).&lt;/li&gt;
&lt;li&gt;Menguji fitur validasi form dalam framework laravel.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, sampai di situ contoh penggunaan data provider pada phpunit. Penjelasan detailnya dapat teman-teman lihat di &lt;a href=&#34;https://phpunit.readthedocs.io/en/7.4/writing-tests-for-phpunit.html#data-providers&#34;&gt;dokumentasi PHPUnit-nya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Perubahan script yang dikerjakan pada artikel ini, dapat teman-teman lihat di &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/d59d94fa2754530aa32dac56d88030efe0496ce6&#34;&gt;commit ini&lt;/a&gt;. Terima kasih atas waktunya. Semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Tips Saat Freelance Project Berjalan (Bagian 2)</title>
       <link>https://blog.inweeks.com/freelancing/tips-saat-freelance-project-berjalan-bagian-2/</link>
       <pubDate>Thu, 06 Jun 2019 09:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/tips-saat-freelance-project-berjalan-bagian-2/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Menyambung &lt;a href=&#34;https://blog.inweeks.com/freelancing/tips-saat-freelance-project-berjalan-bagian-1/&#34;&gt;artikel sebelumnya&lt;/a&gt;, berikut 5 tips lagi pada saat project sedang dikerjakan.&lt;/p&gt;
&lt;h2 id=&#34;6-catat-semua-hasil-diskusi-dengan-klien&#34;&gt;6. Catat semua hasil diskusi dengan klien&lt;/h2&gt;
&lt;p&gt;Ketika pekerjaan kita sedang di review klien, biasanya ada berbagai masukan atau &lt;em&gt;feedback&lt;/em&gt; terkait point-point yang mendetailkan item-item pekerjaan, atau ada bagian tertentu yang harus diperbaiki, ditambahkan, atau dikurangi.&lt;/p&gt;
&lt;p&gt;Tips berikutnya, usahakan agar &lt;strong&gt;selalu mencatat&lt;/strong&gt; jika ada feedback yang pointnya &lt;strong&gt;belum ada/tercatat pada dokumen konsep/item pekerjaan&lt;/strong&gt;. Misal berupa dokumen.txt. Catatan ini sebagai bantuan untuk kita mengingat detail instruksi dari klien, dan akan menjadi eviden atau bukti feedback dari klien yang harus diperbaiki. Biasanya pada sebuah file catatan itu saya menambahkan informasi ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tanggal dan jam, nama personel klien (tulis jika ada beberapa orang)&lt;/li&gt;
&lt;li&gt;Item pekerjaan
&lt;ul&gt;
&lt;li&gt;catatan 1&lt;/li&gt;
&lt;li&gt;catatan 2&lt;/li&gt;
&lt;li&gt;catatan 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keudian catatan disimpan dengan nama file, misal: Meeting 2019-04-04.13.30.21.txt (ada tanggal dan jamnya). Catatan-catatan ini akan menjadi acuan kita dalam melanjutkan pekerjaan dan minimalisir kata &amp;ldquo;lupa&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;7-sampaikan-kepada-klien-jika-ada-permintaan-yang-diluar-kesepakatan-awal&#34;&gt;7. Sampaikan kepada klien jika ada permintaan yang diluar kesepakatan awal&lt;/h2&gt;
&lt;p&gt;Setiap feedback dari klien, &lt;strong&gt;sangat dimungkinkan&lt;/strong&gt; (bahkan selalu) muncul permintaan diluar dari item pekerjaan yang sudah disepakati. Karena secara wajar memang setelah beberapa waktu point tambahan tersebut baru terpikirkan, atau bisa jadi memang ada perubahan kebijakan.&lt;/p&gt;
&lt;p&gt;Ada beberapa opsi dalam menanggapi item pekerjaan yang diluar kesepakatan awal:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kerjakan sebagai layanan gratis (jika tidak dianggap berat)&lt;/li&gt;
&lt;li&gt;Kerjakan dengan minta tambahan waktu&lt;/li&gt;
&lt;li&gt;Kerjakan dengan usulan biaya tambahan&lt;/li&gt;
&lt;li&gt;Pending ke fase project berikutnya&lt;/li&gt;
&lt;li&gt;Sampaikan tidak sanggup.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pilihan ini tergantung kebijakan kita sebagai freelancer, mau pilih opsi yang mana, karena ikatan kerja kita dengan klien sudah kita batasi sesuai dengan &lt;strong&gt;kesepakatan tertulis&lt;/strong&gt; di awal. Kalau saya pribadi, kalau pekerjaan tambahan tidak terlalu rumit, saya pilih opsi 1.&lt;/p&gt;
&lt;h2 id=&#34;8-laporkan-kesulitan&#34;&gt;8. Laporkan kesulitan&lt;/h2&gt;
&lt;p&gt;Jika kita menemui kesulitan saat mengerjakan project klien, terutama yang akan berdampak pada &lt;strong&gt;keterlambatan target waktu&lt;/strong&gt;, sebaiknya disampaikan kepada klien. Tujuannya &lt;strong&gt;agar klien mengetahui&lt;/strong&gt; dan bisa antisipasi bahwa akan ada keterlambatan dari target yang disepakati.&lt;/p&gt;
&lt;p&gt;Dari pengalaman saya, biasanya klien mau memahami kondisi kesulitan yang kita sampaikan selama kita memberikan argumen yang masuk akal, walaupun dengan alasan pribadi. Terutama jika sejak awal kita sudah membangun komunikasi yang baik dengan klien.&lt;/p&gt;
&lt;p&gt;Walaupun yang kita sampaikan merupakan hal negatif (keterlambatan progress), ini bisa menjadi kabar baik bagi klien. Artinya dengan kondisi itu, klien mengetahui bahwa project akan terlambat, sehingga dapat menyesuaikan agenda lauching atau menjalankan kebijakan lain.&lt;/p&gt;
&lt;h2 id=&#34;9-berikan-opsipilihan-yang-jelas-jika-perlu-keputusan-klien&#34;&gt;9. Berikan opsi/pilihan yang jelas jika perlu keputusan klien&lt;/h2&gt;
&lt;p&gt;Tidak jarang kita menemui &amp;ldquo;persimpangan jalan&amp;rdquo; saat sedang mengerjakan project klien. Di situ kita memiliki beberapa opsi yang memerlukan keputusan dari klien. Apakah pekerjaan dilanjutkan dengan metode A, atau dengan metode B, atau dengan metode C.&lt;/p&gt;
&lt;p&gt;Jika keputusan ini berhubungan dengan proses bisnis klien, maka konsultasikanlah dengan klien, agar beliau memutuskan metode mana yang dipilih. Sebisa mungkin kita &lt;strong&gt;tidak memutuskan sendiri&lt;/strong&gt;, karena jika keputusan kita keliru, pekerjaan harus diulang lagi.&lt;/p&gt;
&lt;p&gt;Ingat, ketika menemui &amp;ldquo;persimpangan&amp;rdquo; seperti ini, sebisa mungkin berikan &lt;strong&gt;dua pilihan terbaik&lt;/strong&gt;, atau maksimal 3 pilihan untuk klien. Jika lebih dari 3 pilihan, klien membutuhkan waktu lama untuk memutuskan. Menunggu keputusan itu bisa &lt;strong&gt;memperlambat&lt;/strong&gt; progress pekerjaan kita.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Untuk mempermudah klien mengambil keputusan, pastikan &lt;strong&gt;sebelum memberikan pilihan&lt;/strong&gt;, kita sudah menyiapkan informasi kelebihan dan kekurangan atau plus minus dari masing-masing metode tadi, dari sisi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kerumitan mengerjakan&lt;/li&gt;
&lt;li&gt;Kemudahan user saat menggunakan&lt;/li&gt;
&lt;li&gt;Perkiraan waktu yang dibutuhkan&lt;/li&gt;
&lt;li&gt;Perkiraan ada biaya tambahan&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;10-konsisten-sekaligus-kesimpulan&#34;&gt;10. Konsisten (sekaligus kesimpulan)&lt;/h2&gt;
&lt;p&gt;Tips terakhir, &lt;strong&gt;KONSISTEN&lt;/strong&gt;. Yap, kapital dan tebal. Ini sekaligus kesimpulannya.&lt;/p&gt;
&lt;p&gt;Konsisten adalah tekad dan semangat mengerjakan sesuatu secara terus menerus. Agar 9 tips di atas yang dapat membantu mengamankan pekerjaan kita dan membuat hubungan dengan klien selalu baik, maka kita harus melakukannya &lt;strong&gt;secara konsisten&lt;/strong&gt; (terus-menerus), tidak hanya di awal-awal saja.&lt;/p&gt;
&lt;p&gt;Beberapa klien cerita kepada saya, mereka menemui freelancer yang hanya berkomunikasi dan kerja baik di awal-awal saja, tetapi setelah beberapa minggu, progress pekerjaan dan komunikasi dengan klien mulai berkurang dan sering konflik.&lt;/p&gt;
&lt;p&gt;Ketika kita:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Konsisten datang &amp;ldquo;on-time&amp;rdquo; setiap meeting&lt;/li&gt;
&lt;li&gt;Konsisten memulai pekerjaan segera&lt;/li&gt;
&lt;li&gt;Konsisten &amp;ldquo;fast response&amp;rdquo; dan komunikasi dengan baik&lt;/li&gt;
&lt;li&gt;Konsisten melaporkan progress&lt;/li&gt;
&lt;li&gt;Konsisten mencatat hasil diskusi&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Insya Allah hubungan dengan klien akan selalu baik dan menjadi lebih baik.&lt;/p&gt;
&lt;h2 id=&#34;penutup&#34;&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Baik teman-teman itu 10 tips bagi freelancer saat project sedang berjalan, yang sudah kita bahas di &lt;a href=&#34;https://blog.inweeks.com/freelancing/tips-saat-freelance-project-berjalan-bagian-1/&#34;&gt;artikel sebelumnya&lt;/a&gt; dan artikel ini. Hal-hal di atas adalah aturan yang saya terapkan selama bekerja sebagai freelancer selama 5 tahun terakhir (sampai artikel ini ditulis).&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat menjadi tips yang bermanfaat. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Tips Saat Freelance Project Berjalan (Bagian 1)</title>
       <link>https://blog.inweeks.com/freelancing/tips-saat-freelance-project-berjalan-bagian-1/</link>
       <pubDate>Sun, 31 Mar 2019 16:50:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/tips-saat-freelance-project-berjalan-bagian-1/</guid>
       <description>&lt;p&gt;Bismillahirrahmaanirrahiim.&lt;/p&gt;
&lt;p&gt;Pada artikel sebelumnya, kita sudah membahas bagaimana cara:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.inweeks.com/freelancing/contoh-penulisan-konsep-project-sistem-untuk-klien/&#34;&gt;Membuat konsep untuk project klien&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.inweeks.com/freelancing/cara-membuat-budget-untuk-project-klien/&#34;&gt;Membuat budgeting dan penawaran untuk klien&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sekarang hal-hal apa yang harus diperhatikan ketika sebuah project berjalan? Misalkan setelah proses di atas terjadi kesepakatan, dan kita di-&lt;em&gt;hire&lt;/em&gt; oleh klien untuk mengerjakan projectnya. Alhamdulillah artinya klien &lt;strong&gt;mempercayakan pekerjaan kepada kita&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Setiap freelancer memiliki cara, metode, strategi atau aturan tersendiri yang diterapkan dalam menjalankan project. Pada artikel ini saya akan share &lt;strong&gt;5 dari 10 tips&lt;/strong&gt; yang biasa saya terapkan ketika saya mengerjakan sebuah project web development.&lt;/p&gt;
&lt;h2 id=&#34;1-segera-mulai&#34;&gt;1. Segera mulai&lt;/h2&gt;
&lt;p&gt;Yap, &lt;strong&gt;segera mulai&lt;/strong&gt;. Penyakit yang sering menyerang freelancer adalah &lt;em&gt;&amp;ldquo;entar dulu&amp;rdquo;&lt;/em&gt;. Karena merasa project ini baru disetujui, kita terkadang &lt;strong&gt;menganggap enteng waktu mulai project&lt;/strong&gt;. Apakah karena masih ada project (sebelumnya) yang belum rampung, atau memang maunya &lt;em&gt;entar dulu&lt;/em&gt;, yang jelas suka menunda mulai kerja.&lt;/p&gt;
&lt;p&gt;Nah, biasanya &lt;strong&gt;ekspektasi klien&lt;/strong&gt;, setelah DP (pembayaran tahap pertama), setidaknya seminggu kemudian kita sudah ada laporan progress. Kalau kita lambat mulainya, pasti lapor progress juga lambat. Ekspektasi (klien) ini akan meleset, &lt;strong&gt;satu poin minus&lt;/strong&gt; untuk kita.&lt;/p&gt;
&lt;p&gt;Jadi sekali lagi, &lt;strong&gt;segera mulai&lt;/strong&gt;. Jangan sampai dapat point minus pertama.&lt;/p&gt;
&lt;h2 id=&#34;2-fast-respons&#34;&gt;2. Fast respons&lt;/h2&gt;
&lt;p&gt;Misal kita menghubungi seseorang, kemudian orang itu segera merespons. Kita pasti senang. Apa lagi kalau yang dihubungi itu adalah orang yang kita titipi uang untuk mengerjakan sesuatu.&lt;/p&gt;
&lt;p&gt;Kalau kita tanya sesuatu, &lt;strong&gt;kita pasti berharap&lt;/strong&gt; orang itu respons cepat, &lt;em&gt;kan&lt;/em&gt;? Kalau orang itu tidak merespons, apalagi sampai berhari-hari? Bagaimana perasaan kita? Silakan jawab sendiri.&lt;/p&gt;
&lt;p&gt;Nah klien seperti itu juga. Ketika sudah bayar uang DP kepada freelancer, klien berharap: &lt;strong&gt;kalau ditanya progress&lt;/strong&gt;, kita bisa &lt;strong&gt;merespons dengan cepat&lt;/strong&gt;. Terlepas apakah sudah ada progress atau belum, progress banyak atau sedikit, selama kita cepat respons, klien akan lebih tenang.&lt;/p&gt;
&lt;p&gt;Sebaliknya, jika freelancer slow respons (atau bahkan tidak merespons) ketika dihubungi, akan jadi point minus dan kepercayaan klien bisa menurun.&lt;/p&gt;
&lt;p&gt;Insya Allah dengan sikap &lt;strong&gt;fast respons&lt;/strong&gt;, hubungan dengan klien akan selalu baik (dan menjadi lebih baik). Walaupun ada keterlambatan progress, &lt;strong&gt;kepercayaan klien&lt;/strong&gt; terhadap kita tidak akan berkurang selama kita fast respons.&lt;/p&gt;
&lt;h2 id=&#34;3-konsisten-melaporkan-progress&#34;&gt;3. Konsisten melaporkan progress&lt;/h2&gt;
&lt;p&gt;Kalau dari contoh penawaran yang saya share di artikel &lt;a href=&#34;https://blog.inweeks.com/freelancing/cara-membuat-budget-untuk-project-klien/#contoh-proposal-pengajuan-budget&#34;&gt;menyusun budgeting project&lt;/a&gt;, di akhir bagian &lt;strong&gt;Tahap Pembangunan Website&lt;/strong&gt;, ada saya sebutkan &lt;strong&gt;laporan progress per minggu&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Itu bentuk janji saya kepada klien, untuk melaporkan progress secara periodik per minggu.&lt;/p&gt;
&lt;p&gt;Nah &lt;strong&gt;ekspektasi klien&lt;/strong&gt;, saya berjanji akan &lt;strong&gt;rutin&lt;/strong&gt; melakukan laporan &lt;strong&gt;progress per minggu&lt;/strong&gt;. Bisa dibayangkan jika saya tidak ada kabar progress selama 2 atau 3 minggu, bagaimana perasaan klien?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bisa jadi klien bertanya-tanya: &amp;ldquo;Kira-kira bener dikerjakan atau tidak ya?&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika ingin jadi freelancer yang mendapat testimoni yang baik (reputasi bagus), kita harus selalu mengusahakan laporan progress sesuai dengan yang dijanjikan itu.&lt;/p&gt;
&lt;p&gt;Selain itu, dengan konsisten melakukan laporan progress perminggu, kita menjadi &lt;strong&gt;dipaksa harus ada progress&lt;/strong&gt;. Jadi seolah-olah seperti ada tekanan bahwa kita benar-benar harus mengerjakan project dan melaporkan seminggu sekali.&lt;/p&gt;
&lt;p&gt;Jika kita bisa &lt;strong&gt;disiplin&lt;/strong&gt; melaporkan per minggu, Insya Allah kita bisa menyelesaikan project sesuai target. Itu intinya: &lt;strong&gt;Disiplin = progress on target&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;4-segerakan-meminta-feedback-dari-klien&#34;&gt;4. Segerakan meminta feedback dari klien&lt;/h2&gt;
&lt;p&gt;Pernah kah mengalami ketika sudah 50% project berjalan, klien baru melihat pekerjaan kita dan mengatakan: yang ini keliru, itu salah, harusnya begini, yang saya maksud begitu, lalu yang ini juga salah perhitungannya, atau sejenisnya.&lt;/p&gt;
&lt;p&gt;Pernah kah? Sering kah?&lt;/p&gt;
&lt;p&gt;Nah hal-hal seperti ini dulu sering saya alami. Ketika laporan minggu pertama, kedua dan ketiga tidak ada feedback dari klien, pada minggu ke 4 baru ketahuan ada yang salah, harus diperbaiki. Akhirnya membuat saya mengulang kerja beberapa bagian. Sudah 50% diulang lagi dari 30%.&lt;/p&gt;
&lt;p&gt;Ini lumayan makan waktu, menguras pikiran, dan bisa jadi potensi konflik dengan klien. Untuk mengantisipasi kejadian ini, &lt;strong&gt;sesegera mungkin&lt;/strong&gt; freelancer harus &lt;strong&gt;mendapatkan feedback&lt;/strong&gt; dari klien. Agar pekerjaan yang keliru dapat diminimalisir.&lt;/p&gt;
&lt;p&gt;Misalnya jika laporan progress 1 dan 2 tidak dapat feedback, pada progress 3 usahakan bertemu dengan klien.  Tunjukkan progress yang sudah diselesaikan sampai tahap tersebut, dan minta feedback (apakah sampai disini sudah benar atau ada yang perlu diperbaiki).&lt;/p&gt;
&lt;p&gt;Dengan pola seperti ini, jika ada kesalahan dalam proses yang kita kerjakan, maka kita dapat segera memperbaikinya. Mendapatkan &lt;strong&gt;feedback sesegera mungkin&lt;/strong&gt; akan mendatangkan &lt;strong&gt;keuntungan bagi kedua pihak&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bagi freelancer: minimalisir pekerjaan keliru dan kesalahpahaman konsep dengan klien.&lt;/li&gt;
&lt;li&gt;Bagi klien: melihat progress nyata dalam pengerjaan projectnya.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;5-bertanya-kepada-klien&#34;&gt;5. Bertanya kepada klien&lt;/h2&gt;
&lt;p&gt;Walaupun kita sudah membuat konsep dan membuat list item pekerjaan sebelum mulai project, akan sangat mungkin kita menemukan hal-hal baru yang belum sempat dibahas dengan klien.&lt;/p&gt;
&lt;p&gt;Jika hal itu terjadi, jangan sungkan untuk bertanya kepada klien.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pak/ibu kalau kondisi begini bagaimana? Sepertinya belum sempat kita diskusikan. Bagaimana solusi yang diterapkan saat ini di perusahaan?&lt;/li&gt;
&lt;li&gt;Pak/ibu kemarin sempat kita bahas proses bla..bla..bla.., tetapi ada kondisi yang seperti ini. Sebaiknya bagaimana?&lt;/li&gt;
&lt;li&gt;Pak/ibu kemarin kita sepakat dibuat begini, tetapi sepertinya lebih efektif begini, jadi nanti bla..bla..bla&amp;hellip; Bagaimana menurut bapak/ibu?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kita (freelancer) adalah orang luar, bukan bagian dari perusahaan klien, sangat wajar jika kita &lt;strong&gt;tidak memahami seutuhnya&lt;/strong&gt; seluk beluk dan aturan yang diberlakukan.&lt;/p&gt;
&lt;p&gt;Jadi jika ada hal yang belum dimengerti &lt;strong&gt;terkait proses bisnis&lt;/strong&gt; klien, sebaiknya kita (freelancer) tidak mengambil asumsi/solusi sendiri. Asumsi kita bisa salah dan solusi terbaik adalah bertanya.&lt;/p&gt;
&lt;h2 id=&#34;penutup&#34;&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Baik teman-teman itu dulu 5 tips yang kita bahas. Insya Allah selanjutnya akan ada 5 tips lagi yang akan saya tulis pada artikel selanjutnya.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat bagi teman-teman semua. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Membuat Budget untuk Project Klien</title>
       <link>https://blog.inweeks.com/freelancing/cara-membuat-budget-untuk-project-klien/</link>
       <pubDate>Fri, 15 Mar 2019 10:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/cara-membuat-budget-untuk-project-klien/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Seperti yang saya sampaikan pada artikel sebelumnya, bahwa saat ini saya bekerja sebagai &lt;a href=&#34;https://blog.inweeks.com/freelancing/apakah-fulltime-freelancer-itu/#apa-itu-freelancing--freelance-dan-freelancer&#34;&gt;freelance web developer&lt;/a&gt;. Artinya bekerja dari satu project ke project lainnya, baik dari klien yang sama maupun klien yang baru.&lt;/p&gt;
&lt;p&gt;Beberapa teman menanyakan kepada saya, bagaimana cara menentukan budget sebuah project untuk dijadikan penawaran kepada klien. Jawabannya, tiap freelancer atau agensi berbeda-beda cara menentukan budget projectnya.&lt;/p&gt;
&lt;h2 id=&#34;pertimbangan-penentuan-budget&#34;&gt;Pertimbangan Penentuan Budget&lt;/h2&gt;
&lt;p&gt;Menentukan budget/anggaran/nilai project memang memerlukan banyak pertimbangan agar nilainya menjadi cocok untuk kita (freelancer) dan cocok untuk klien. Berikut beberapa pertimbangan yang saya rangkum. Mempertimbangkan dari:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Perkiraan lama pengerjaan project.&lt;/li&gt;
&lt;li&gt;Jumlah/banyaknya fitur yang dikerjakan.&lt;/li&gt;
&lt;li&gt;Seberapa rumit fitur yang dikerjakan.&lt;/li&gt;
&lt;li&gt;Seberapa banyak user yang akan menggunakannya.&lt;/li&gt;
&lt;li&gt;Seberapa rumit tampilan user-interface sistem.&lt;/li&gt;
&lt;li&gt;Seberapa besar nama perusahaan klien.&lt;/li&gt;
&lt;li&gt;Seberapa besar usaha/omzet klien.&lt;/li&gt;
&lt;li&gt;Bahkan ada yang menentukan dari &lt;strong&gt;seberapa besar penghematan klien&lt;/strong&gt; jika sistem yang kita buat sudah berjalan. Misal setelah adanya sistem yang kita buat nanti:
&lt;ul&gt;
&lt;li&gt;Klien akan menghemat budget pulsa dan rekening telepon.&lt;/li&gt;
&lt;li&gt;Klien akan hemat kertas.&lt;/li&gt;
&lt;li&gt;Klien akan hemat budget pembelian dan maintenance infrastruktur.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah, kira-kira 8 point di atas itu yang bisa dijadikan acuan untuk menghitung nilai project. Ini berdasarkan pengalaman saya selama freelance, dan cerita teman-teman yang pernah saya temui.&lt;/p&gt;
&lt;p&gt;Kalau saya pribadi bagaimana? Apakah 8 point itu dipertimbangkan semua? Hmm&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;pertimbangan-yang-saya-terapkan&#34;&gt;Pertimbangan yang Saya Terapkan&lt;/h2&gt;
&lt;p&gt;Kalau yang saya terapkan selama ini (dan saya pikir cukup efektif), adalah mempertimbangkan point 1 s/d 3.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pertimbangan lama pengerjaan&lt;br&gt;
Misal dihitung perkiraan berapa minggu atau berapa bulan proses pengerjaanya. Kalau saya biasanya dihitung per minggu (berapa minggu target saya menyelesaikannya).&lt;/li&gt;
&lt;li&gt;Pertimbangan Jumlah Fitur&lt;br&gt;
Semakin banyak fitur, otomatis kan waktu dan pikiran kita juga semakin banyak terfokus disitu. Semakin banyak yang dikerjakan, semakin panjang waktu yang diperlukan, harusnya semakin banyak kita dapat bayaran. Jadi waktu dan pikiran kita itu yang nanti akan dibayar oleh klien.&lt;/li&gt;
&lt;li&gt;Pertimbangan Kerumitan Fitur&lt;br&gt;
Diantara sekian banyak fitur yang diminta oleh klien, pasti ada beberapa fitur yang pengerjaannya rumit, karena akan ada banyak rule/peraturan perusahaan yang diterapkan pada fitur-fitur itu. Biasanya ini fitur utama sistem.
&lt;strong&gt;Fitur-fitur inilah yang akan menjadi solusi dari kesulitan klien&lt;/strong&gt; saat ini (sesuai konsep yang sudah kita buat sebelumnya).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;pertimbangan-opsional&#34;&gt;Pertimbangan Opsional&lt;/h2&gt;
&lt;p&gt;Pertimbangan nomor 4 s/d 8 adalah pertimbangan opsional bagi saya, bisa digunakan bisa juga tidak.&lt;/p&gt;
&lt;p&gt;Pertimbangan point ke 4, yaitu potensi jumlah pengguna sistem/web, ini bisa menjadi pertimbangan jika sistem digunakan oleh user umum. Sistem yang digunakan untuk internal perusaahaan tentu berbeda penanganannya dengan sistem/web yang akan digunakan untuk khayalak ramai.&lt;/p&gt;
&lt;p&gt;Berhubungan dengan point pertimbangan ke 4, biasanya disusul dengan pertimbangan ke 5, yaitu tampilan user interface. Jika sistem/web akan digunakan oleh khalayak ramai, tentu tampilan depan (front-end) tentunya klien ingin tampilan yang cantik dan menarik, karena tampilan depan itu akan menjadi citra dari perusahaan. Semakin bagus kan jadinya semakin keren, semakin rumit juga developer membuatnya.&lt;/p&gt;
&lt;h2 id=&#34;cara-menentukan-budget&#34;&gt;Cara Menentukan Budget&lt;/h2&gt;
&lt;p&gt;Atas pertimbangan-pertimbangan di atas, saya menyusun beberapa tahap dalam menghitung budget project.&lt;/p&gt;
&lt;h3 id=&#34;1-membuat-daftar-fitur&#34;&gt;1. Membuat Daftar Fitur&lt;/h3&gt;
&lt;p&gt;Dari &lt;a href=&#34;https://blog.inweeks.com/freelancing/contoh-penulisan-konsep-project-sistem-untuk-klien/&#34;&gt;konsep yang sudah kita tulis&lt;/a&gt;, seharusnya kita sudah bisa perkirakan, apa saja fitur yang akan dikerjakan untuk sistem ini. Kita &lt;strong&gt;buat daftar fitur yang akan dikerjakan&lt;/strong&gt;. Untuk memulai, bisa list fitur utama dulu.&lt;/p&gt;
&lt;h4 id=&#34;membuat-daftar-fitur-utama&#34;&gt;Membuat Daftar Fitur Utama&lt;/h4&gt;
&lt;p&gt;Misal kita ambil contoh Konsep Sistem Sewa Barang pada artikel sebelumnya, pada sistem web tersebut harus ada:&lt;/p&gt;
&lt;p&gt;Bagian depan (untuk pelanggan):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Katalog produk&lt;/li&gt;
&lt;li&gt;Proses pemesanan&lt;/li&gt;
&lt;li&gt;Proses Checkout&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bagian belakang (untuk admin/karyawan):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pengelolaan order&lt;/li&gt;
&lt;li&gt;Laporan&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;menambah-daftar-fitur-pelengkap&#34;&gt;Menambah Daftar Fitur Pelengkap&lt;/h4&gt;
&lt;p&gt;Setelah fitur utama kita dapatkan, sekarang kita daftarkan fitur-fitur pelengkapnya.&lt;/p&gt;
&lt;p&gt;Bagian depan (untuk pelanggan)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Registrasi member&lt;/li&gt;
&lt;li&gt;Detail dan foto produk&lt;/li&gt;
&lt;li&gt;Konfimasi pembayaran&lt;/li&gt;
&lt;li&gt;Email transaksi untuk member&lt;/li&gt;
&lt;li&gt;Halaman profil member&lt;/li&gt;
&lt;li&gt;Header dan footer website&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bagian belakang (untuk admin/karyawan):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pengelolaan produk&lt;/li&gt;
&lt;li&gt;Pengelolaan member&lt;/li&gt;
&lt;li&gt;Pengelolaan data pembayaran&lt;/li&gt;
&lt;li&gt;Pengaturan sistem&lt;/li&gt;
&lt;li&gt;Pengelolaan backup dan restore database&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sampai di sini, kita bisa melengkapi list fitur di atas dengan sub-sub fiturnya, sesuai kebutuhan. Nanti di paling bawah, saya share contoh list fitur lengkap dengan deskripsi masing-masing.&lt;/p&gt;
&lt;h3 id=&#34;2-memperkirakan-lama-pengerjaan&#34;&gt;2. Memperkirakan Lama Pengerjaan&lt;/h3&gt;
&lt;p&gt;Nah setelah kita menentukan fitur-fitur yang akan dibuat, saatnya kita &lt;strong&gt;perkiraan waktu&lt;/strong&gt; pengerjaannya. Dari sekian banyak fitur yang akan dibuat tadi:&lt;/p&gt;
&lt;p&gt;Q: Apakah cukup waktu mengerjakan 1 bulan?&lt;br&gt;
A: Tidak!&lt;br&gt;
Q: Apakah cukup waktu mengerjakan 1,5 bulan?&lt;br&gt;
A: Cukup, tapi mepet.&lt;br&gt;
Q: Apakah cukup 2 bulan?&lt;br&gt;
A: Cukup!&lt;/p&gt;
&lt;p&gt;Oke sekarang kita &lt;strong&gt;mau dibayar berapa&lt;/strong&gt; untuk mengerjakan itu selama 2 bulan?&lt;/p&gt;
&lt;p&gt;Q: Dibayar Rp. 3 juta cukup?&lt;br&gt;
A: Tidak!&lt;br&gt;
Q: Dibayar Rp. 6 juta cukup?&lt;br&gt;
A: Tidak!&lt;br&gt;
Q: Dibayar Rp. 10 juta cukup?&lt;br&gt;
A: Ya, cukup! (kalau belum cukup, bisa diteruskan lagi.)&lt;/p&gt;
&lt;p&gt;Oke, kita perkirakan &lt;strong&gt;waktu pengerjaan 1,5 - 2 bulan&lt;/strong&gt;, dengan &lt;strong&gt;budget Rp. 10 juta&lt;/strong&gt;. Ini hanya permisalan, ya. Kita bisa mengira-ngira sendiri, nilai jasa kita kira-kira cocoknya berapa.&lt;/p&gt;
&lt;h3 id=&#34;3-menentukan-harga-setiap-fitur&#34;&gt;3. Menentukan Harga Setiap Fitur&lt;/h3&gt;
&lt;p&gt;Lanjut, sekarang kita tentukan &lt;strong&gt;harga per fitur&lt;/strong&gt; dengan patokan total Rp. 10 juta yang kita tentukan tadi. Kita bisa membuatnya dengan format tabel seperti ini.&lt;/p&gt;
&lt;p&gt;Bagian depan (untuk pelanggan) :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;No.&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Item Pekerjan&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Biaya&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;1.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Katalog produk&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;2.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Proses pemesanan&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;3.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Proses Checkout&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;4.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Registrasi member&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Detail dan foto produk&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;6.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Konfimasi pembayaran&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;7.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Email transaksi untuk member&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;8.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Halaman profil member&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;9.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Header dan footer website&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Total&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Bagian belakang (untuk admin/karyawan) :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;No.&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Item Pekerjan&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Biaya&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;1.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengelolaan order&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;2.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Laporan&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;3.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengelolaan produk dan stok&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;4.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengelolaan member&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;5.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengelolaan data pembayaran&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;6.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengaturan sistem&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;7.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengelolaan backup dan restore database&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Total&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Di sini kita menentukan &lt;strong&gt;harga per fitur&lt;/strong&gt; ini, &lt;strong&gt;sesuai dengan tingkat kerumitan&lt;/strong&gt; fitur yang bersangkutan. Misal dari rincian item pekerjaan di atas, kita bisa mengira pengerjaan fitur pengelolaan data order akan &lt;strong&gt;lebih rumit&lt;/strong&gt; daripada pengelolaan data member. Berarti harga item pekerjaan pengelolaan order akan &lt;strong&gt;lebih tinggi&lt;/strong&gt; dari pada harga item pekerjaan pengelolaan member.&lt;/p&gt;
&lt;p&gt;Begitu.&lt;/p&gt;
&lt;h3 id=&#34;4-total-harga-fitur--budget&#34;&gt;4. Total Harga Fitur = Budget&lt;/h3&gt;
&lt;p&gt;Baik sampai di situ kita tinggal jumlahkan total harga di atas, sehingga mendapatkan atau mendekati nilai budget kita yang Rp. 10 juta tadi.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;No.&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Item Pekerjan&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Biaya&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;1.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengerjaan bagian depan&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;2.&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pengerjaan bagian belakang&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Total&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Rp. &amp;hellip;&amp;hellip;&amp;hellip;.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Baik, setelah penjelasan di atas, semoga teman-teman pembaca bisa memahami alur proses menghitung budget sebuah project. Setidaknya itu yang saya terapkan saat ini.&lt;/p&gt;
&lt;h2 id=&#34;informasi-ketentuan-kerjasama&#34;&gt;Informasi Ketentuan Kerjasama&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Ini opsional, tetapi bagi saya ini penting sekali.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setelah menulis rincian di atas, pada pengajuan budget (proposal) itu kita bisa informasikan ketentuan-ketentuan untuk menggunakan layanan kita, atau ketentuan-ketentuan untuk bekerjasama dengan kita. Misalnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Informasi bahwa biaya pada pengajuan ini disesuaikan dengan tingkat kesulitan pengerjaan fitur sistem.&lt;/li&gt;
&lt;li&gt;Informasi bahwa jika ada perubahan kebijakan perusahaan yang berpengaruh ke fitur yang dikerjakan, maka biaya akan dikalkukasikan lagi menyesuaikan dengan kebijakan baru (biasanya ini terkait fitur baru yang belum didiskusikan di awal).&lt;/li&gt;
&lt;li&gt;Rencana pengerjaan mulai kapan, dan target selesai berapa lama.&lt;/li&gt;
&lt;li&gt;Cara/tahapan pembayaran.&lt;/li&gt;
&lt;li&gt;Masa Garansi untuk bugfix dan maintenance.&lt;/li&gt;
&lt;li&gt;Dan seterusnya sesuai kebutuhan &amp;hellip;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;contoh-proposal-pengajuan-budget&#34;&gt;Contoh Proposal Pengajuan Budget&lt;/h2&gt;
&lt;p&gt;Sekarang saya share satu contoh proposal pengajuan budget project untuk klien.&lt;/p&gt;
&lt;p&gt;Download PDF : &lt;a href=&#34;https://blog.inweeks.com/images/blogs/2019-07-15-contoh-penawaran-pengajuan-budget-project-untuk-klien.pdf&#34;&gt;&lt;strong&gt;Contoh Pengajuan Budget Project.pdf&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;
Ini format ODT : &lt;a href=&#34;https://blog.inweeks.com/images/blogs/2019-07-15-contoh-penawaran-pengajuan-budget-project-untuk-klien.odt&#34;&gt;&lt;strong&gt;Contoh Pengajuan Budget Project.odt&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Kalau kita lihat contoh pengajuan budget project di atas, apa manfaat yang kita dapatkan? Kalau dari pengalaman saya, dengan pengajuan yang rinci di atas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cara kita mempersiapkan project seperti ini akan menjadi &lt;strong&gt;point besar untuk pertimbangan klien&lt;/strong&gt;. Di sini klien akan melihat keseriusan kita terhadap projectnya.&lt;/li&gt;
&lt;li&gt;List item pekerjaan ini menjadi semacam perjanjian kerja, bahwa item-item pekerjaan itulah yang &lt;strong&gt;menjadi patokan&lt;/strong&gt; kita dalam mengerjakan project.&lt;/li&gt;
&lt;li&gt;Kita sebagai developer akan &lt;strong&gt;tahu tanggung jawab&lt;/strong&gt; kita sampai dimana.&lt;/li&gt;
&lt;li&gt;Klien akan tahu sampai di mana kewajiban developer yang menjadi haknya (fitur-fitur yang akan didapatkan).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nilai project&lt;/strong&gt; yang kita ajukan lengkap dengan rincian item pekerjaan akan mendapat penilaian yang berbeda (dari klien) dibandingkan nilai project yang diajukan tanpa rincian yang jelas.&lt;/li&gt;
&lt;li&gt;Jika terjadi kesepakatan, maka item-item pekerjaan di atas akam &lt;strong&gt;menjadi pegangan&lt;/strong&gt; masing-masing pihak untuk &lt;strong&gt;bahan evaluasi&lt;/strong&gt; di akhir project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah seperti itu teman-teman cara saya mempersiapkan sebuah project yang akan dikerjakan untuk klien. Lumayan panjang dan melelahkan kah? Di awal-awal mungkin iya, tapi kalau sudah terbiasa, sudah tidak melelahkan lagi.&lt;/p&gt;
&lt;p&gt;Secara tidak langsung kita belajar &lt;strong&gt;menjadi system analyst&lt;/strong&gt;, dan akan semakin terasah jika sering dikerjakan. Insyaallah usaha tidak akan mengkhianati  hasil. Usaha maksimal hasilnya juga akan maksimal.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat bagi teman-teman semua. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Contoh Penulisan Konsep Project untuk Klien</title>
       <link>https://blog.inweeks.com/freelancing/contoh-penulisan-konsep-project-sistem-untuk-klien/</link>
       <pubDate>Sun, 10 Mar 2019 12:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/contoh-penulisan-konsep-project-sistem-untuk-klien/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada beberapa artikel sebelumnya, kita membahas tentang &lt;a href=&#34;https://blog.inweeks.com/freelancing/mempersiapkan-calon-project-untuk-calon-klien-baru/&#34;&gt;mempersiapkan calon project&lt;/a&gt; untuk develop sistem calon klien. Di situ saya cerita tentang &lt;strong&gt;konsep tertulis&lt;/strong&gt;, terkait proses bisnis sesuai cerita dari klien. Pada artikel ini, saya share contoh konsep sebuah sistem web pemesanan dan pengelolaan sewa produk elektronik yang pernah saya buat.&lt;/p&gt;
&lt;p&gt;Silakan download PDF : &lt;strong&gt;&lt;a href=&#34;https://blog.inweeks.com/images/blogs/2019-07-10-contoh-rangkuman-diskusi-interview-project.pdf&#34;&gt;Contoh Rangkuman Diskusi (Interview Project).pdf&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;kerangka-konsep&#34;&gt;Kerangka Konsep&lt;/h2&gt;
&lt;p&gt;Baik, sedikit kita bahas point-point utama dari konsep tersebut:&lt;/p&gt;
&lt;h4 id=&#34;1-tujuan-sistem&#34;&gt;1. Tujuan Sistem&lt;/h4&gt;
&lt;p&gt;Di bagian awal ini biasanya saya menulis alasan-lasan kenapa sistem ini dibuat, apa manfaatnya untuk perusahaan klien (sbg sistem owner), manfaat untuk user (misal utk karyawan). Bagian ini ditulis untuk memastikan kita sudah satu visi dengan klien perihal tujuan dan manfaat sistem nantinya.&lt;/p&gt;
&lt;h4 id=&#34;2-kamus-istilah&#34;&gt;2. Kamus Istilah&lt;/h4&gt;
&lt;p&gt;Namanya kita feeelancer &lt;em&gt;kan&lt;/em&gt; orang luar, dan istilah-istilah dan singkatan-singkatan tertentu dalam perusahaan ada yang tidak umum. Kadang ada istilah dari klien yang belum kita pahami, ada juga istilah-istilah dari kita yang belum dipahami oleh klien. Kamus istilah ini untuk minimalisir kesalahpahaman saat komunikasi dengan klien saat project berjalan.&lt;/p&gt;
&lt;p&gt;Kenapa kamus istilah diletakkan di bagian awal konsep? Karena istilah-istilah tersebut akan kita gunakan pada konten dokumen konsep ini. Jika ada istilah yang salah, kemungkinan besar konsep akan salah.&lt;/p&gt;
&lt;h4 id=&#34;3-jenis-pengguna-tipe-user&#34;&gt;3. Jenis Pengguna (Tipe User)&lt;/h4&gt;
&lt;p&gt;Bagian ini kita menuliskan daftar tipe-tipe pengguna yang akan berinteraksi dengan sistem. Ini penting sekali, jika tidak dibahas atau diketahui sejak awal, akan lumayan merepotkan kita sebagai developer. Karena modifikasi untuk penambahan jenis user baru biasanya tidak mudah, apalagi jika sistem lumayan kompleks, bisa memakan waktu yang panjang.&lt;/p&gt;
&lt;p&gt;Saran saya, urusan jenis pengguna atau tipe user ini harus fixed dulu di awal.&lt;/p&gt;
&lt;h4 id=&#34;4-kondisi-saat-ini-optional&#34;&gt;4. Kondisi Saat Ini (optional)&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Di contoh konsep itu tidak ada, tapi jika perlu, bagian ini bisa ditambahkan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Di sini kita tulis seperti apa kondisi klien saat ini (sesuai dengan cerita dari klien). Bagian ini bisa berisi, misal:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Alat bantu/software apa yang digunakan klien saat ini.&lt;/li&gt;
&lt;li&gt;Bagaimana proses bisnis atau alur kerja klien saat ini, terutama &lt;strong&gt;bagian yang akan dikomputerisasi&lt;/strong&gt; menjadi sistem. (Misal proses dari A ke C, C ke F, F ke J dan seterusnya).&lt;/li&gt;
&lt;li&gt;Kesulitan apa saja yang didapatkan dari kondisi itu, sehingga klien memutuskan untuk membuat sistem baru.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ini tujuannya sama, agar kita satu visi dengan klien pada project ini, klien akan melihat bahwa &lt;strong&gt;kita mengerti&lt;/strong&gt; kesulitannya, dan kita akan membantu memberi solusi atas kesulitan itu.&lt;/p&gt;
&lt;p&gt;Ada contoh kasus yang baru saja saya temui, klien menggunakan &lt;strong&gt;file dan rumus-rumus excel&lt;/strong&gt; untuk membantu mengelola pekerjaan di perusahaannya. Tetapi karena karyawan silih berganti, kebutuhan semakin kompleks, dan file excel tidak menjamin keakuratan data yang banyak. Beliau memutuskan untuk membuat sistem baru berbasis web.&lt;/p&gt;
&lt;p&gt;Ini perlu kita catat juga sebagai referensi. Agar memastikan sistem yang kita buat nanti tidak akan mengulang kesalahan yang sama seperti kasus di atas.&lt;/p&gt;
&lt;h4 id=&#34;5-konsep-sistem-atau-bisnis-proses-sistem&#34;&gt;5. Konsep Sistem atau Bisnis Proses Sistem&lt;/h4&gt;
&lt;p&gt;Di bagian ini kita membahas apa saja fitur atau proses bisnis yang diharapkan oleh klien, sebagai solusi dari kesulitan kondisi saat ini. Bagian ini bisa berupa:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Langkah kerja proses A ke C (dengan aturan-aturanya, harus ini, tidak boleh begini)&lt;/li&gt;
&lt;li&gt;Langkah kerja C ke F (dengan aturan-aturannya juga)&lt;/li&gt;
&lt;li&gt;Langkah kerja F ke J (dengan aturan-aturannya juga)&lt;/li&gt;
&lt;li&gt;Jenis-jenis status yang disepakati (misal contoh file konsep di atas, ada status-status order, status barang sewa, dan status-status user)&lt;/li&gt;
&lt;li&gt;Jika ada pertanyaan (misal ada hal yang belum dihahas waktu bertemu), bisa langsung kita tuliskan di setiap item yang kita jabarkan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Biasanya di bagian ini saya menulis paling panjang. Sama seperti yang bagian sebelumnya, bagian ini memastikan bisnis proses yang diceritakan oleh klien pada saat interview sudah kita pahami dengan baik. Kalau ternyata ada pemahaman yang keliru, tinggal diperbaiki agar cocok dengan harapan klien.&lt;/p&gt;
&lt;h4 id=&#34;6-rencana-implementasi-sistem&#34;&gt;6. Rencana Implementasi Sistem&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Di contoh konsep itu tidak ada, tapi jika perlu, bagian ini bisa ditambahkan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jika kita mengembangkan sistem berbasis web, kita perlu menuliskan bahwa sistem yang dibuat akan berbentuk web (bukan aplikasi desktop). Tujuannya agar dapat diakses dengan PC/laptop, handphone, dan atau tablet melalui internet, sistem akan ditempatkan di server online.&lt;/p&gt;
&lt;p&gt;Kadang ada klien yang belum bisa membedakan antara aplikasi web dengan desktop.&lt;/p&gt;
&lt;h2 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Nah, dengan adanya konsep tertulis seperti ini, bisa dibayangkan nanti pada saat kita mengerjakan projectnya, kita sebagai developer akan lebih terarah dalam bekerja.&lt;/p&gt;
&lt;p&gt;Di sisi klien juga akan sangat terbantu karena isi pikirannya telah tertuang dalam bentuk tertulis. Ketika ada ide baru yang belum ada pada konsep tersebut, klien tahu bahwa ide itu belum didiskusikan dengan developer.&lt;/p&gt;
&lt;p&gt;Bagi yang ingin mendapatkan sumber asli konsep itu, silakan download format ODT-nya. File dapat dibuka dengan software &lt;a href=&#34;https://www.libreoffice.org/download/download&#34;&gt;LibreOffice Writer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download ODT : &lt;a href=&#34;https://blog.inweeks.com/images/blogs/2019-07-10-contoh-rangkuman-diskusi-interview-project.odt&#34;&gt;Contoh Rangkuman Diskusi (Interview Project).odt&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Baik teman-teman, seperti itu kira-kira cara saya membuat konsep untuk mempersiapkan project klien. Semoga dapat menjadi referensi dan manfaat untuk teman-teman yang membutuhkan.&lt;/p&gt;
&lt;p&gt;Mohon diingat bahwa ini adalah &lt;strong&gt;preferensi saya&lt;/strong&gt; pribadi, &lt;strong&gt;bukan best practice&lt;/strong&gt; dari sebuah siklus project software development. Ide ini saya dapatkan sesuai dengan pengalaman saya freelance sekitar hampir 5 tahun (sampai artikel ini ditulis).&lt;/p&gt;
&lt;p&gt;Setidaknya ini adalah usaha saya untuk &lt;strong&gt;minimalisir konflik&lt;/strong&gt; dan berusaha untuk &lt;strong&gt;menjadi freelancer yang profesional&lt;/strong&gt; di mata klien. (ciyee, profesional&amp;hellip; :D)&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Project Existing Ditawar Miring? Coba Pertimbangkan 3 Hal Ini</title>
       <link>https://blog.inweeks.com/freelancing/project-existing-ditawar-miring-coba-pertimbangkan-3-hal-ini/</link>
       <pubDate>Sun, 03 Feb 2019 14:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/project-existing-ditawar-miring-coba-pertimbangkan-3-hal-ini/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Jika bekerja sebagai freelance progammer, biasanya kita memajang portfolio kita, baik di blog pribadi maupun website profil usaha kita (misal seperti &lt;a href=&#34;https://blog.inweeks.com/projects&#34;&gt;porfolio saya&lt;/a&gt; ini). Akan sangat mungkin ada calon klien datang/menghubungi kita kemudian tertarik dengan project/sistem yang sudah kita buat (project untuk klien lama). Beliau ingin membeli sistem tersebut dimodifikasi dan disesuaikan dengan kebutuhan beliau.&lt;/p&gt;
&lt;h2 id=&#34;penawaran-harga-dari-klien&#34;&gt;Penawaran Harga dari Klien&lt;/h2&gt;
&lt;p&gt;Biasanya, pada tahap negosiasi harga, calon klien &lt;strong&gt;menawar harga dengan miring&lt;/strong&gt; (baca: lebih murah) dari biaya development di awal, dengan pertimbangan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Project/sistem lama tinggal diduplikat.&lt;/li&gt;
&lt;li&gt;Hanya sedikit modifikasi sesuai kebutuhan perusahaan beliau.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sehingga menurut beliau, developer (kita) tidak banyak yang dikerjakan lagi, jadi biaya development &amp;ldquo;bisa ditekan&amp;rdquo; seminim mungkin.&lt;/p&gt;
&lt;p&gt;Kadang kita sebagai developer meng-amin-i pertimbangan tersebut (apalagi jika &lt;em&gt;&amp;ldquo;sedang mendesak&amp;rdquo;&lt;/em&gt;) sehingga akhirnya terjadi kesepakatan dengan harga (miring) sesuai tawaran calon klien.&lt;/p&gt;
&lt;h2 id=&#34;pertimbangan-mempertahankan-harga&#34;&gt;Pertimbangan Mempertahankan Harga&lt;/h2&gt;
&lt;p&gt;Kali ini saya ingin share beberapa pertimbangan agar kita (developer) dapat mempertahankan harga sesuai dengan harga yang lama, &lt;strong&gt;bahkan lebih tinggi&lt;/strong&gt; dari harga yang lama.&lt;/p&gt;
&lt;h4 id=&#34;1-klien-baru-jauh-lebih-hemat-waktu&#34;&gt;1. Klien baru (jauh) lebih hemat waktu&lt;/h4&gt;
&lt;p&gt;Sistem sudah jadi, klien baru tidak perlu menunggu lama. Klien baru cukup menunggu kita untuk menduplikat dan modifikasi sistem yang sudah ada untuk beliau. Mungkin &lt;strong&gt;hanya&lt;/strong&gt; perlu waktu 1-2 minggu, sistem sudah bisa diuji coba.&lt;/p&gt;
&lt;p&gt;Bisa dibayangkan jika project lama belum ada, otomatis kita harus develop dulu sistemnya dari awal, berapa minggu/bulan waktu klien akan menunggu sampai sistem siap diuji coba? 1 bulan? 2 bulan? 3 bulan?&lt;/p&gt;
&lt;h4 id=&#34;2-sistem-minim-bug&#34;&gt;2. Sistem &amp;ldquo;minim Bug&amp;rdquo;&lt;/h4&gt;
&lt;p&gt;Jika sistem tersebut sudah digunakan oleh klien (lama), misal  selama 6 bulan atau 1 tahun, pasti sudah ada tau banyak laporan kendala-kendala dan &lt;em&gt;error-error&lt;/em&gt; yang terjadi pada sistem selama penggunaan. Otomatis sejak awal hingga sekarang, sistem tersebut sudah banyak dilakukan &lt;em&gt;bugfix&lt;/em&gt; dan &lt;em&gt;improvement&lt;/em&gt; di sana-sini, sehingga sistem tersebut semakin handal dan nyaman digunakan oleh user.&lt;/p&gt;
&lt;p&gt;Pada kondisi ini klien baru tidak akan mendapatkan problem yang sama dengan klien lama. Tinggal &lt;strong&gt;menikmati sistem yang sudah handal&lt;/strong&gt; dan &amp;ldquo;minim bug&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Tidak ada sistem yang bug-less, kalaupun ada, pasti akan sangat sedikit dibandingkan saat sistem baru selesai dibuat.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;3-yakin-modifikasi-hanya-sedikit&#34;&gt;3. Yakin modifikasi hanya sedikit?&lt;/h4&gt;
&lt;p&gt;Nah ini yang kadang terabaikan oleh kita (sebagai developer). Pada awalnya, memang point-point/bagian-bagian yang akan dimodifikasi (untuk menyesuaikan kebutuhan) hanya sedikit. Tetapi (nanti) kita akan lihat beberapa waktu sistem tersebut jika digunakan oleh klien baru, (pasti) akan bermunculan permintaan-permintaan modifikasi diluar dari kesepakatan awal.&lt;/p&gt;
&lt;p&gt;Hal ini memang lumrah sekali, karena setiap perusahaan memiliki bisnis proses dan strategi yang berbeda-beda, walaupun bidang usahanya sama. Misal sama-sama kampus, sama-sama perusahaan ekspedisi/kurir, atau sama-sama perusahaan dealer otomotif, pasti ada perbedaan peraturan dan kebijakan yang diadopsi ke dalam sistem. Ini yang harus kita antisipasi sebagai developer sistem.&lt;/p&gt;
&lt;p&gt;Sekali lagi, awalnya memang &amp;ldquo;rencana modifikasi&amp;rdquo; sedikit, tetapi seiring berjalannya waktu biasanya akan banyak penyesuaian lagi diluar dugaaan kita. Dan sekali lagi ini sangat lumrah/wajar.&lt;/p&gt;
&lt;h2 id=&#34;keuntungan-para-pihak&#34;&gt;Keuntungan Para Pihak&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Ingat ini masih tahap negosiasi, belum tentu deal ya.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik kita coba simpulkan dari beberapa pertimbangan di atas.&lt;/p&gt;
&lt;h4 id=&#34;keuntungan-yang-akan-didapatkan-developer&#34;&gt;Keuntungan yang akan didapatkan developer&lt;/h4&gt;
&lt;p&gt;Dengan mempertahankan harga, ini keuntungan yang akan didapatkan freelance programmer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bisa mempertahankan harga (jasa) agar tetap bagus.&lt;/li&gt;
&lt;li&gt;Experience/pengalaman bertambah setelah diskusi calon klien baru (terutama di sisi bisnis proses perusahaan yang bidangnya sama).&lt;/li&gt;
&lt;li&gt;Jika deal, tidak perlu (lelah) develop sistem dari awal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;keuntungan-yang-akan-didapatkan-klien-baru&#34;&gt;Keuntungan yang akan didapatkan klien baru&lt;/h4&gt;
&lt;p&gt;Dengan harga yang disepakati (walaupun dianggap tinggi), ini keuntungan yang akan didapatkan oleh klien:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hemat waktu, tanpa menunggu lama sistem bisa langsung diuji coba/digunakan.&lt;/li&gt;
&lt;li&gt;Sistem sudah &amp;ldquo;minim bug&amp;rdquo;, karena sudah dilakukan &lt;em&gt;bugfix&lt;/em&gt; dan &lt;em&gt;improvement&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Jika perlu fitur tambahan, tinggal improve dari fitur yang sudah ada.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Jadi masing-masing pihak akan mendapatkan keuntungan yang sepadan (bahasa kerennya: &amp;ldquo;&lt;em&gt;worth it&lt;/em&gt;&amp;rdquo;). Bagi teman-teman yang berprofesi freelance programmer, seperti saya, silakan gunakan pertimbangan-pertimbangan di atas untuk diskusi/negosiasi dengan calon klien baru. Insyaallah akan terjadi win-win solution antar kita dengan calon klien baru. Aamiin..&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ini adalah pendapat pribadi saya menurut pengalaman selama bekerja freelance.&lt;/li&gt;
&lt;li&gt;Pertimbangan-pertimbangan di atas tidak mutlak cocok bagi semua freelance programmer, jadi boleh dipakai, boleh tidak.&lt;/li&gt;
&lt;li&gt;Pertimbangan di atas berlaku untuk project/sistem yang khusus dibuat untuk klien dengan bidang usaha tertentu, mungkin kurang cocok untuk produk software yang dijual retail.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih atas waktu teman-teman sudah membaca artikel ini.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Install plugin wordpress diminta login FTP?</title>
       <link>https://blog.inweeks.com/tool/mengatasi-permintaan-login-ftp-install-plugin-theme-wordpress-ubuntu-linux-mint/</link>
       <pubDate>Thu, 31 Jan 2019 08:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/mengatasi-permintaan-login-ftp-install-plugin-theme-wordpress-ubuntu-linux-mint/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Jika kita menginstall dan develop wordpress menggunakan ubuntu dan OS turunannya seperti linux mint, ketika ingin memasang plugin atau theme kita diminta login FTP.&lt;/p&gt;
&lt;p&gt;Misal kita kunjungi URL &lt;code&gt;/wp-admin/plugins.php&lt;/code&gt;, kita klik &lt;strong&gt;Install Now&lt;/strong&gt; pada salah satu plugin, akan muncul dialog seperti gambar ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2019-01-31-mengatasi-permintaan-login-ftp-install-plugin-theme-wordpress-ubuntu-linux-mint-01.jpg&#34; alt=&#34;FTP Login Request&#34;&gt;&lt;/p&gt;
&lt;p&gt;Siapa yang pernah mengalami? Saya sendiri (dan teman-teman yang bertanya) :D&lt;/p&gt;
&lt;p&gt;Sebagai informasi, ini spesifikasi yang saya gunakan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Linux Mint 18.3 (Ubuntu 16.04 LTS)&lt;/li&gt;
&lt;li&gt;LAMP Stack (Apache 2.4, PHP 7.2)&lt;/li&gt;
&lt;li&gt;Wordpress versi 4.* dan 5.*&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h2&gt;
&lt;p&gt;Problem ini terjadi karena masalah permission pada direktori project wordpress. User ubuntu yang digunakan oleh web server adalah &lt;code&gt;www-data&lt;/code&gt;, sedangkan owner dari direktori project wordpress adalah user yang sedang login (selanjutnya kita sebut &lt;code&gt;username&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;cara-mengatasi&#34;&gt;Cara Mengatasi&lt;/h2&gt;
&lt;p&gt;Untuk mengatasinya, kita ubah permission direktori project wordpress seperti ini.&lt;/p&gt;
&lt;p&gt;Pertama kita cek dulu username ubuntu kita:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cek username yang sedang login&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/username/www/wp-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Di sini kita temukan, username kita adalah &lt;code&gt;username&lt;/code&gt;. Kita lanjutkan dengan mengubah permissionnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Ubah permission (sesuaikan dengan username teman-teman)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo chown www-data:username -R .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;775&lt;/span&gt; -R .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita &lt;strong&gt;refresh&lt;/strong&gt; halaman &lt;code&gt;/wp-admin/plugins.php&lt;/code&gt; tadi, lalu klik &lt;strong&gt;Install Now&lt;/strong&gt;. Seharusnya proses install langsung berjalan seperti gambar di bawah (tanpa ada permintaan login FTP lagi).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2019-01-31-mengatasi-permintaan-login-ftp-install-plugin-theme-wordpress-ubuntu-linux-mint-02.jpg&#34; alt=&#34;Install Plugin&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;penjelasan&#34;&gt;Penjelasan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pada perintah &lt;code&gt;chown www-data:username&lt;/code&gt; di atas, kita mengubah owner dari seluruh file dan direktori/folder dalam project ini (secara recursive) menjadi &lt;code&gt;www-data&lt;/code&gt; (sesuai username web server) dan grup &lt;code&gt;username&lt;/code&gt; sesuai dengan username ubuntu/linux mint kita.&lt;/li&gt;
&lt;li&gt;Pada perintah &lt;code&gt;chmod 775&lt;/code&gt; di atas, kita mengubah permission seluruh file dan direktori di dalam project ini agar dapat &lt;strong&gt;dibaca dan ditulis&lt;/strong&gt; oleh user &lt;code&gt;www-data&lt;/code&gt; dan grup &lt;code&gt;username&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik teman-teman, itu saja tips singkat cara mengatasi problem login FTP pada saat install plugin dan theme wordpress pada OS Ubuntu dan linux mint. Jika teman-teman ada solusi lain yang lebih ringkas/best practice, mohon teman-teman tuliskan di komentar, agar saya bisa coba riset juga. :D&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih atas waktu teman-teman.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Kontribusi ke Pull Request Github sebagai Pemilik Repo</title>
       <link>https://blog.inweeks.com/tips/kontribusi-ke-pull-request-github-sebagai-pemilik-repo/</link>
       <pubDate>Sun, 27 Jan 2019 20:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/kontribusi-ke-pull-request-github-sebagai-pemilik-repo/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Ketika ada pull request dari teman di github, mungkin ada beberapa bagian yang belum sesuai dengan convention atau best practice yang kita ikuti. Bagian tersebut harus/ingin kita perbaiki, bagaimana caranya?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cara pertama:&lt;/strong&gt; Merge dulu baru perbaiki.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cara kedua:&lt;/strong&gt; Perbaiki langsung di pull request, setelah fixed baru di merge.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Antara dua cara itu, sepertinya lebih nyaman menggunakan cara kedua, jadi history branchnya tetap jadi satu.&lt;/p&gt;
&lt;p&gt;Cara kedua adalah seperti ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git checkout -b new-branch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git pull git@github.com:username/repo-name.git pr-branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Commit beberapa perubahan di &amp;ldquo;new-branch&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git remote add pr-repo git@github.com:username/repo-name.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git push pr-repo new-branch:pr-branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian lanjutkan merge pull request seperti biasa. Selesai.&lt;/p&gt;
&lt;p&gt;Jadi nanti commit historynya jadi seperti ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2019-01-27-kontribusi-ke-pull-request-github-sebagai-pemilik-repo-01.jpg&#34; alt=&#34;Pull Request Commit History&#34;&gt;&lt;/p&gt;
&lt;p&gt;Baik teman-teman, itu saja tips singkat agar project owner/maintainer dapat berkontribusi ke sebuah Pull Request dari kontributor dengan tetap menjaga &lt;em&gt;timeline history&lt;/em&gt; commitnya. Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Search dan Replace String di Terminal Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/search-replace-string-ubuntu-terminal/</link>
       <pubDate>Mon, 31 Dec 2018 22:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/search-replace-string-ubuntu-terminal/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Misal kita memutuskan ingin mengganti sebuah (atau frase) kata yang ada di beberapa file di dalam satu folder secara bersamaan, biasanya kita menggunakan fitur &lt;strong&gt;search and replace di teks editor&lt;/strong&gt;. Yap, fitur ini sangat membantu sekali untuk keperluan itu. Kalau di dunia &lt;em&gt;programming&lt;/em&gt; biasanya fitur ini kita gunakan untuk mengganti nama-nama variabel, function, (atau apapun) secara bersamaan.&lt;/p&gt;
&lt;p&gt;Nah saya pribadi menggunakan fitur &lt;strong&gt;Find in Files dari Sublime Text&lt;/strong&gt; untuk melakukannya. Tetapi rasanya masih belum optimal (baca: kurang cepat), karena setelah replace, kita harus simpan satu-persatu file-filenya.&lt;/p&gt;
&lt;p&gt;Karena perlu yang ringkas, saya googling dengan kata kunci &lt;strong&gt;&amp;ldquo;search replace string ubuntu terminal&amp;rdquo;&lt;/strong&gt;, dan ketemu jawaban di halaman &lt;a href=&#34;https://stackoverflow.com/questions/2113111/how-can-i-search-and-replace-recursively-in-a-directory-in-vim#answer-2113224&#34;&gt;stackoverflow ini&lt;/a&gt;. Jadi di terminal di Ubuntu, kita bisa menggunakan perintah ini untuk melakukan &lt;strong&gt;search and replace&lt;/strong&gt; dengan cepat:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Perintah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ find nama_folder -type f -exec sed -i -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/kata_diganti/kata_pengganti/g&amp;#39;&lt;/span&gt; -- &lt;span style=&#34;color:#f92672&#34;&gt;{}&lt;/span&gt; +
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Misal kita berikan perintah pada terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Contoh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ find resources -type f -exec sed -i -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/formatDecimal/format_decimal/g&amp;#39;&lt;/span&gt; -- &lt;span style=&#34;color:#f92672&#34;&gt;{}&lt;/span&gt; +
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maka semua kata &lt;code&gt;formatDecimal&lt;/code&gt; pada file-file dalam folder &lt;code&gt;resources&lt;/code&gt; akan berubah menjadi &lt;code&gt;format_decimal&lt;/code&gt;. Perubahan yang terjadi bisa kita lihat di sample git &lt;a href=&#34;https://github.com/nafiesl/free-pmo/commit/1380bc523cef0e250914e0821da211f276104e1e&#34;&gt;&lt;strong&gt;commit ini&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sangat disarankan&lt;/strong&gt; agar teman-teman menggunakan version control (seperti git) sebelum menggunakan perintah ini. Just in case ada perubahan yang tidak diinginkan, maka kita tinggal melakukan git reset untuk mengembalikan semua perubahan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik teman-teman, itu saja tips cara singkat dan cepat untuk mengubah kata di beberapa file text dalam folder melalui terminal Ubuntu. Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Solusi Problem: 413 Request Entity Too Large</title>
       <link>https://blog.inweeks.com/web-server/solusi-problem-413-request-entity-too-large-nginx-php/</link>
       <pubDate>Thu, 27 Dec 2018 17:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/solusi-problem-413-request-entity-too-large-nginx-php/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Secara default, Nginx itu membatasi ukuran file upload maksimal 1 MB. Jika kita mengupload file ke server lebih dari itu, maka kita akan mendapat pesan error &lt;strong&gt;413 Request Entity Too Large&lt;/strong&gt;. PHP juga membatasi file upload maksimal 8 MB.&lt;/p&gt;
&lt;p&gt;Misal kita ingin menaikkan batas maksimal file uploadnya pada web server LEMP stack. Caranya seperti ini, setelah kita ssh ke VPS, jalankan perintah ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Edit file nginx.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/nginx/nginx.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pada server block &lt;code&gt;http&lt;/code&gt;, tambahkan:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http {
    server_tokens off;
    client_max_body_size 10M;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simpan dan exit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Reload nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo nginx -s reload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Edit file php.ini&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/php/7.2/fpm/php.ini
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pada ubah nilai berikut:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;upload_max_filesize = 10M
post_max_size = 10M
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simpan dan exit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo service php7.2-fpm reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Selesai. Sekarang kita sudah bisa upload file maksimal 10MB. Jika limit 10MB ini masih kurang, teman-teman bisa memasukkan nilai maksimal upload sesuai kebutuhan.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Membuat Database Baru dengan Perintah Terminal di Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/membuat-database-baru-dengan-perintah-terminal/</link>
       <pubDate>Mon, 24 Dec 2018 04:45:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/membuat-database-baru-dengan-perintah-terminal/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Misal kita menemukan satu project/aplikasi yang menarik di repository github, kemudian kita ingin mencobanya di PC/laptop kita. Saat kita ikuti langkah-langkah installasinya, lalu di satu langkah kita disuruh membuat database baru di MySQL. Dari situ kita buka Adminer, PHPMyAdmin, HeidiSQL, atau MySQL client apapun yang kita gunakan, lalu membuat database disitu.&lt;/p&gt;
&lt;p&gt;Jika kita menggunakan Ubuntu/distro apapun turunannya, ada satu baris perintah terminal/bash yang membuat proses membuat database menjadi lebih cepat.&lt;/p&gt;
&lt;p&gt;Berikut perintah satu baris perintah untuk &lt;strong&gt;membuat database MySQL&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mysqladmin -uroot -p create database_name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Masukkan password untuk user root MySQL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sedangkan untuk &lt;strong&gt;membuat database Postgres&lt;/strong&gt; perintahnya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo -u user_postgres createdb database_name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Masukkan password untuk user ubuntu (karena pakai sudo)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Masukkan password untuk user user_postgres Postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dengan kemudahan perintah-perintah ini, kita tidak perlu lagi membuka aplikasi MySQL client hanya untuk keperluan membuat sebuah database di MySQL.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Membuat Shortcut Teks Timestamp di Ubuntu</title>
       <link>https://blog.inweeks.com/ubuntu/membuat-timestamp-cepat-di-ubuntu/</link>
       <pubDate>Sat, 22 Dec 2018 08:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/ubuntu/membuat-timestamp-cepat-di-ubuntu/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Jika membuat sebuah file, saya itu suka menambahkan &lt;em&gt;timestamp&lt;/em&gt; (tanggal dan waktu) pada nama filenya. Tujuannya agar saya mudah ingat, kapan saya membuat file/dokumen itu. Misalnya file &lt;code&gt;Meeting 2018-11-05.14.59.txt&lt;/code&gt; untuk mencatat point-point diskusi dengan klien pada tanggal 5 November 2018 jam 15.00.&lt;/p&gt;
&lt;p&gt;Kalau untuk menambahkan timestamp kita mesti mengetik satu persatu: tahun, bulan, tanggal, jam dan menit, lumayan makan waktu, belum lagi harus mengingat/melihat kalender dan jam tangan dulu. Hmm.. kurang produktif rasanya.&lt;/p&gt;
&lt;p&gt;Bagaimana kalau untuk menggenerate &lt;em&gt;timestamp text&lt;/em&gt; itu kita &lt;strong&gt;cukup menggunakan shortcut&lt;/strong&gt; dari operating system? Jadi kita bisa menggenerate timestamp di mana saja. Nah untuk kali ini, kita akan membuat teks timestamp otomatis dengan shortcut di Ubuntu, kemudian untuk menuliskan timestamp itu kita &lt;strong&gt;tinggal &lt;em&gt;paste&lt;/em&gt; saja&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;perintah-bash-date&#34;&gt;Perintah Bash: date&lt;/h2&gt;
&lt;p&gt;Untuk menggenerate teks timestamp, kita bisa menulis perintah &lt;code&gt;date&lt;/code&gt; di terminal ubuntu:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ date
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sat Dec &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt; 06:56:21 +08 &lt;span style=&#34;color:#ae81ff&#34;&gt;2018&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Atau jika ingin format tertentu:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ date +%Y-%m-%d.%H.%M
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-12-22.06.58
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Btw, format itu saya dapatkan dari hasil &lt;em&gt;googling &amp;ldquo;bash date with format&amp;rdquo;&lt;/em&gt;, kemudian ketemu jawaban di &lt;a href=&#34;https://stackoverflow.com/questions/1401482/yyyy-mm-dd-format-date-in-shell-script#answer-1401495&#34;&gt;stackoverflow ini&lt;/a&gt;. Kalau mau format lain, bisa lihat dengan perintah &lt;code&gt;$ man date&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;masukkan-teks-ke-clipboard&#34;&gt;Masukkan teks ke clipboard&lt;/h2&gt;
&lt;p&gt;Nah selanjutnya bagaimana agar text dari perihtan &lt;code&gt;date&lt;/code&gt; itu bisa kita gunakan? Idenya, bagaimana caranya agar teks timestamp itu bisa &lt;strong&gt;masuk clipboard&lt;/strong&gt;, agar &lt;strong&gt;tinggal kita paste&lt;/strong&gt; di mana-mana. Nah untuk itu kita akan menggunkan &lt;code&gt;xclip&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pertama kita install &lt;code&gt;xclip&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt install xclip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lalu kita coba perintah &lt;code&gt;date&lt;/code&gt; kemudian disambung dengan perintah &lt;code&gt;xclip&lt;/code&gt;, agar teksnya masuk clipboard.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ date +%Y-%m-%d.%H.%M | xclip -selection clipboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ketika perintah di atas dijalakan, maka teks tanggal dan jam sesuai format itu bisa kita &lt;em&gt;paste&lt;/em&gt; di manapun (di Libre Office, Text Editor, atau di nama file). Jadinya seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2018-12-22.07.12
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;membuat-shortcut-untuk-perintah-bash&#34;&gt;Membuat shortcut untuk perintah bash&lt;/h2&gt;
&lt;p&gt;Baik, sekarang bagian terpenting (untuk produktifitas), membuat shortcut agar perintah diatas tidak perlu kita jalankan di terminal. Di ubuntu kita membuatnya di pengaturan keyboard:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-12-22-membuat-timestamp-cepat-di-ubuntu-01.jpg&#34; alt=&#34;Keyboard Settings&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;Keyboard Settings&lt;/strong&gt;, tab &lt;strong&gt;Application Shortcuts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Masukkan perintah:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bash -c &amp;#39;date +%Y-%m-%d.%H.%M | xclip -selection clipboard&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Klik &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Masukkan shortcut sesuai keingingan, contoh kombinasi : &lt;code&gt;Shift+Ctrl+Alt+T&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Selesai.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sekarang silakan coba menggunakan shortcut itu dari keyboard, kemudian pada text editor apapun, silakan &lt;em&gt;paste&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;penutup&#34;&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Cara ini mungkin belum tentu bisa dilakukan di operating sistem lain. Cara ini saya dapatkan setelah beberapa lama mencari artikel untuk membuat teks tanggal dan waktu otomatis di ubuntu, tetapi tidak ketemu. Akhirnya cara diatas saya susun sendiri, untuk kebutuhan produktifitas sehari-hari.&lt;/p&gt;
&lt;p&gt;Kalau teman-teman pembaca, menemukan cara yang lebih ringkas lagi, mohon dituliskan infonya atau link artikel di komentar.&lt;/p&gt;
&lt;p&gt;Bagi teman-teman yang memerlukan fitur yang sama tetapi belum menemukan, selamat mencoba cara ini. Terima kasih atas waktunya. :)&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Refactor Register Feature Test</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-refactor-register-feature-test/</link>
       <pubDate>Wed, 12 Dec 2018 08:50:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-refactor-register-feature-test/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel sebelumnya kita membuat &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-register-feature-test/&#34;&gt;feature test untuk fitur register&lt;/a&gt;, tetapi pada artikel itu, kita lumayan mengulang banyak kode yang sama saat membuat testing validasi form. Sekarang kita akan coba membahas cara melakukan &lt;em&gt;refactor&lt;/em&gt;, menerapkan DRY Code (Don&amp;rsquo;t Repeat Your Code) untuk mengefisienkan penulisan testing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pada praktek ini, kita menggunakan repository github &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;Laravel-TDD&lt;/a&gt;, yaitu pada commit &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/fd58467032aac247078fd8a465b3a7962a0b8667&#34;&gt;fd58467&lt;/a&gt;. Jika ingin mengikuti sama persis, silakan teman-teman clone repo itu ke localhost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik kita mulai. Ini adalah source keseluruhan dari file &lt;code&gt;tests\Feature\Auth\RegisterTest.php&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature\Auth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\User&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan use model App\User
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RegisterTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Trait refresh database agar migration dijalankan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_register&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/register&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form register dengan nama, email dan password 2 kali
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;submitForm&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman ter-redirect ke url &amp;#39;/home&amp;#39; (register sukses).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita melihat halaman tulisan &amp;#34;Dashboard&amp;#34; pada halaman itu.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeText&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Dashboard&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat di database, tabel users, data user yang register sudah masuk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;users&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek hash password yang tersimpan cocok dengan password yang diinput
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hash&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;check&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_name_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;name&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;name&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_name_maximum_is_255_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;name&amp;#39; 260 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor &amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;name&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_must_be_a_valid_email&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; tidak valid.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username.example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_maximum_is_255_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; 260 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_must_be_unique_on_users_table&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Buat satu user baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emailsama@example.net&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;email&amp;#39; yang sudah ada di tabel users.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emailsama@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_minimum_is_6_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39; 5 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ecret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ecret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_must_be_same_with_password_confirmation_field&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// beda dengan &amp;#39;password_confirmation&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;escret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kalau kita lihat is file di atas, script yang paling banyak berulang adalah isian form register: &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, dan &lt;code&gt;password_confirmation&lt;/code&gt;. Berarti kita perlu membuat DRY Code untuk itu.&lt;/p&gt;
&lt;h3 id=&#34;jalankan-testing-sebelum-mulai&#34;&gt;Jalankan Testing Sebelum Mulai&lt;/h3&gt;
&lt;p&gt;Seperti biasa, kita mulai kerja dengan menjalankan testing dulu.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (21 tests, 86 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;membuat-private-helper-method&#34;&gt;Membuat Private Helper Method&lt;/h3&gt;
&lt;p&gt;Caranya adalah dengan membuat sebuah private helper method &lt;code&gt;getRegisterFields&lt;/code&gt; yang berisi array attribute/isian yang lolos validasi form, seperti ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;menggunakan-helper-method&#34;&gt;Menggunakan Helper Method&lt;/h3&gt;
&lt;p&gt;Sekarang kita gunakan helper method tersebut pada test method &lt;code&gt;user_can_register&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_register&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/register&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form register dengan name, email dan password 2 kali
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;submitForm&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman ter-redirect ke url &amp;#39;/home&amp;#39; (register sukses).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita melihat halaman tulisan &amp;#34;Dashboard&amp;#34; pada halaman itu.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeText&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Dashboard&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat di database, tabel users, data user yang register sudah masuk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;users&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek hash password yang tersimpan cocok dengan password yang diinput
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hash&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;check&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (21 tests, 86 assertions)&lt;/code&gt;. Refactor pertama berhasil. Sekarang, untuk menggunakan helper method yang sama untuk test method yang lain, kita harus memodifikasinya sedikit.&lt;/p&gt;
&lt;p&gt;Kalau kita lihat di test method yang lain, bagian attribute/isiannya juga &lt;strong&gt;array&lt;/strong&gt; yang memiliki &lt;strong&gt;key&lt;/strong&gt; yang sama, tetapi &lt;strong&gt;value&lt;/strong&gt; nya yang berbeda-beda. Maka kita perlu menggunakan function &lt;a href=&#34;https://secure.php.net/manual/en/function.array-merge.php&#34;&gt;array_merge()&lt;/a&gt; pada helper method kita.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;($overrides &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;array_merge&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ], $overrides);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pada method ini, kita memberikan variable &lt;code&gt;$overrides&lt;/code&gt; sebagai parameter yang akan mengganti isi dari array yang di-&lt;em&gt;return&lt;/em&gt; oleh method.&lt;/p&gt;
&lt;p&gt;Baik sekarang coba kita gunakan method &lt;code&gt;getRegisterFields&lt;/code&gt; ke test method validasi untuk name dulu, untuk memastikan modifikasi kita sudah benar.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... getRegisterFields()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_register()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_name_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;name&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;name&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_name_maximum_is_255_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;name&amp;#39; 260 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor &amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;name&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oke, sekarang kita jalankan PHPUnit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed-1&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (21 tests, 86 assertions)&lt;/code&gt;. Sip seharusnya memang kita tetap dapat hijau. Jika sampai di sini teman-teman dapat test failure, silakan lihat kembali 2 potongan kode di atas.&lt;/p&gt;
&lt;p&gt;Sudah? Sekarang kita gunakan method helper kita pada test method validasi form yang lain.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... getRegisterFields()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_register()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_name_is_required()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_name_maximum_is_255_characters()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_must_be_a_valid_email&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; tidak valid.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username.example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_maximum_is_255_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; 260 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_must_be_unique_on_users_table&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Buat satu user baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emailsama@example.net&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;email&amp;#39; yang sudah ada di tabel users.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emailsama@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_minimum_is_6_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39; 5 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ecret&amp;#39;&lt;/span&gt;]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_must_be_same_with_password_confirmation_field&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// beda dengan &amp;#39;password_confirmation&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getRegisterFields&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;escret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nah seluruh test method sudah menggunakan private helper method kita, sekarang kita jalankan PHPUnit lagi:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed-2&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (21 tests, 86 assertions)&lt;/code&gt;. Sip seharusnya kita tetap dapat hijau. Jika sampai di sini teman-teman dapat test &lt;code class=&#34;test-red&#34;&gt;failure&lt;/code&gt;, silakan lihat kembali script di atas, bandingkan dengan yang teman-teman punya.&lt;/p&gt;
&lt;p&gt;Selesai proses &lt;em&gt;refactoring&lt;/em&gt; kita sampai di sini.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Sekarang kalau kita lihat, proses yang ada di artikel ini agak panjang, tetapi aktualnya, yang dikerjakan tidak banyak. Teman-teman bisa membandingkan &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/fd58467032aac247078fd8a465b3a7962a0b8667/tests/Feature/Auth/RegisterTest.php&#34;&gt;&lt;strong&gt;before&lt;/strong&gt;&lt;/a&gt; dan &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/e37a615a8662585d5f03dbc7a64e8e9860efa527/tests/Feature/Auth/RegisterTest.php&#34;&gt;&lt;strong&gt;after&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;refactor&lt;/em&gt;-nya. Dari sebelumnya 183 baris, menjadi 154 baris (lumayan dipangkas 29 baris kode). Perbedaan baris yang ditambah (hijau) dan dihapus (merah) bisa teman-teman cek di &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/e37a615a8662585d5f03dbc7a64e8e9860efa527&#34;&gt;commit ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sekarang apa yang kita pelajari dari proses &lt;em&gt;refactor&lt;/em&gt; ini? Kira-kira begini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DRY code bertujuan kita tidak menulis kode yang sama berulang-ulang (seperti contoh atribute/isian form register ini).&lt;/li&gt;
&lt;li&gt;Dengan DRY Code, ketika ada perubahan pada source code, kita hanya cukup mengubah kode satu kali.
Misal kita diminta untuk menambah field &lt;code&gt;phone_number&lt;/code&gt; pada form register, dengan testing &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/fd58467032aac247078fd8a465b3a7962a0b8667/tests/Feature/Auth/RegisterTest.php&#34;&gt;seperti sebelumnya&lt;/a&gt; kita &lt;strong&gt;harus menambah field baru di setiap test method&lt;/strong&gt; yang ada.&lt;br&gt;
Tetapi dengan testing &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/fd58467032aac247078fd8a465b3a7962a0b8667/tests/Feature/Auth/RegisterTest.php&#34;&gt;yang sudah direfactor&lt;/a&gt; barusan, kita &lt;strong&gt;cukup menambah field baru di method&lt;/strong&gt; &lt;code&gt;getRegisterFields&lt;/code&gt; &lt;strong&gt;saja&lt;/strong&gt;, maka semua test otomatis menggunakan field baru tersebut.&lt;/li&gt;
&lt;li&gt;Metode &lt;em&gt;refactor&lt;/em&gt; ini dapat kita terapkan pada (hampir) semua feature test yang berurusan dengan CRUD.&lt;/li&gt;
&lt;li&gt;Jika sudah mengetahui metode &lt;em&gt;refactor&lt;/em&gt; ini, maka teman-teman bisa langsung menerapkan teknik ini, tanpa harus mengerjakan &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/fd58467032aac247078fd8a465b3a7962a0b8667/tests/Feature/Auth/RegisterTest.php&#34;&gt;before&lt;/a&gt; dan &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/e37a615a8662585d5f03dbc7a64e8e9860efa527/tests/Feature/Auth/RegisterTest.php&#34;&gt;after&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Jadi pada artikel sebelumnya dan artikel ini, saya ingin menunjukkan kepada teman-teman cara melakukan &lt;em&gt;refactor&lt;/em&gt; saja. Aktualnya, silakan langsung terapkan DRY code jika kita memang sudah memahaminya :D&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Saya mohon bantuan teman-teman untuk review proses dan hasil refactor ini, jika masih ada yang perlu di-&lt;em&gt;refactor&lt;/em&gt;, mohon berikan komentar di bawah, agar kita diskusikan sama-sama. :)&lt;/p&gt;
&lt;p&gt;Semoga &lt;strong&gt;belajar TDD di Laravel&lt;/strong&gt; tetap menyenangkan. Demikian dan terima kasih atas waktu teman-teman, semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Register Feature Test</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-register-feature-test/</link>
       <pubDate>Fri, 07 Dec 2018 19:43:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-register-feature-test/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Jika pada artikel sebelumnya kita membuat &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-login-feature-test/&#34;&gt;feature test untuk fitur login&lt;/a&gt; bawaan Laravel, kali ini kita membuat feature test untuk fitur registrasi usernya. Sedikit mengulang, fitur register ini dihasilkan melalui perintah:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:auth
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Pada praktek ini, kita menggunakan repository github &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;Laravel-TDD&lt;/a&gt;, yaitu pada commit &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/eb202bf09ce4d2dd7074c5b7cf4c5b555024efcc&#34;&gt;eb202bf&lt;/a&gt;. Jika ingin mengikuti sama persis, silakan teman-teman clone repo itu ke localhost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Karena konten artikel ini agak panjang, sedikit saya sampaikan sub-sub judulnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#jalakan-testing-sebelum-mulai&#34;&gt;Jalankan Testing Sebelum Mulai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#membuat-feature-test-register&#34;&gt;Membuat Feature Test Register&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#testing-validasi-form-register&#34;&gt;Testing Validasi Form Register&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#lihat-validation-rules&#34;&gt;Lihat Validation Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#test-method-untuk-validation-rules&#34;&gt;Test Method untuk Validation Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#testing-script-untuk-validation-rules&#34;&gt;Testing Script untuk Validation Rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#kesimpulan&#34;&gt;Kesimpulan&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik kita mulai.&lt;/p&gt;
&lt;h3 id=&#34;jalankan-testing-sebelum-mulai&#34;&gt;Jalankan Testing Sebelum Mulai&lt;/h3&gt;
&lt;p&gt;Seperti biasa, kita mulai kerja dengan menjalankan testing dulu.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (11 tests, 60 assertions)&lt;/code&gt; Sudah hijau, kita lanjutkan.&lt;/p&gt;
&lt;h3 id=&#34;membuat-feature-test-register&#34;&gt;Membuat Feature Test Register&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:test Auth/RegisterTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kita akan mendapatkan testcase class baru di : &lt;code&gt;tests/Feature/Auth/RegisterTest.php&lt;/code&gt;. Sekarang edit filenya dan buat test method baru &lt;code&gt;user_can_register&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature\Auth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\User&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan use model App\User
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RegisterTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Trait refresh database agar migration dijalankan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_register&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/register&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form register dengan name, email dan password 2 kali
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;submitForm&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman ter-redirect ke url &amp;#39;/home&amp;#39; (register sukses).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita melihat halaman tulisan &amp;#34;Dashboard&amp;#34; pada halaman itu.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeText&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Dashboard&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat di database, tabel users, data user yang register sudah masuk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;users&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek hash password yang tersimpan cocok dengan password yang diinput
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hash&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;check&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita jalankan PHPUnitnya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-12-07-testing-laravel-register-feature-test-01.jpg&#34; alt=&#34;Register Test Passed&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Okey, mantap. Sekali lagi, karena fiturnya sudah ada, ketika script testing dibuat sesuai fitur yang ada, maka hasilnya harus langsung &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;testing-validasi-form-register&#34;&gt;Testing Validasi Form Register&lt;/h3&gt;
&lt;p&gt;Karena kita sudah dapat hasil &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt; untuk inputan yang valid, sekarang kita buat testing untuk validasi form register ini.&lt;/p&gt;
&lt;h5 id=&#34;lihat-validation-rules&#34;&gt;Lihat Validation Rules&lt;/h5&gt;
&lt;p&gt;Karena fiturnya sudah ada, maka kita perlu melihat apa saja &lt;em&gt;validation rules&lt;/em&gt; yang digunakan pada formulir register ini. Bisa dilihat di controller: &lt;code&gt;app\Http\Controllers\Auth\RegisterController.php&lt;/code&gt;, kemudian lihat method &lt;code&gt;validator()&lt;/code&gt;. Script pada method itu isinya seperti ini:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterController.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     * Get a validator for an incoming registration request.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     * @param  array  $data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     * @return \Illuminate\Contracts\Validation\Validator
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;validator&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;array&lt;/span&gt; $data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Validator&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;make&lt;/span&gt;($data, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|string|max:255&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|string|email|max:255|unique:users&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|string|min:6|confirmed&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Di lihat dari &lt;em&gt;validation rules&lt;/em&gt;-nya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;: wajib diisi, berbentuk string, dan maksimal 255 karakter.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;email&lt;/code&gt;: wajib diisi, berbentuk string, berupa format email, maksimal 255 karakter, dan email harus unik pada tabel users.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;: wajib diisi, berbentuk string, minimal 6 karakter, dan harus sama dengan field &lt;code&gt;password_confirmation&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Sedikit refresher saja, &lt;strong&gt;validation rules&lt;/strong&gt; adalah aturan-aturan yang diberlakukan terhadap data-data yang diinput ke sistem melalui submit form. Jika aturan-aturannya dilanggar (data yang diinput tidak valid), maka Laravel akan membatalkan proses data dan meminta agar formulir diisi kembali dengan benar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;test-method-untuk-validation-rules&#34;&gt;Test Method untuk Validation Rules&lt;/h5&gt;
&lt;p&gt;Dari &lt;em&gt;validation rules&lt;/em&gt; di atas, kita akan membuat beberapa test method :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;user_name_is_required&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_name_maximum_is_255_characters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_email_is_required&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_email_must_be_a_valid_email&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_email_maximum_is_255_characters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_email_must_be_unique_on_users_table&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_password_is_required&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_password_minimum_is_6_characters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_password_must_be_same_with_password_confirmation_field&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Wah, kok banyak? Ga apa-apa sekalian latihan, biar terbiasa nulis test :D&lt;/em&gt;&lt;/p&gt;
&lt;h5 id=&#34;testing-script-untuk-validation-rules&#34;&gt;Testing Script untuk Validation Rules&lt;/h5&gt;
&lt;p&gt;Nah untuk script testingnya, kita boleh mencontoh script testing yang pernah kita buat pada artikel ini: &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-testing-validasi-form/&#34;&gt;Testing Validasi Form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Baik sekarang kita buat test method dan script sesuai dengan method-method di atas ya &amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Class RegisterTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_register()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_name_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;name&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;name&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_name_maximum_is_255_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;name&amp;#39; 260 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor &amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;name&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_must_be_a_valid_email&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; tidak valid.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username.example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_maximum_is_255_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;email&amp;#39; 260 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_repeat&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_email_must_be_unique_on_users_table&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Buat satu user baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emailsama@example.net&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;email&amp;#39; yang sudah ada di tabel users.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;emailsama@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;email&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_is_required&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39; kosong.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_minimum_is_6_characters&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39; 5 karakter.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ecret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ecret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_password_must_be_same_with_password_confirmation_field&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk register dengan field &amp;#39;password&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// beda dengan &amp;#39;password_confirmation&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/register&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;                  &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;John Thor&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;                 &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;escret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field &amp;#39;password&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cukup panjang, tapi ga apa-apa, cuman &lt;em&gt;copy-paste&lt;/em&gt; ini. Sekarang kita jalankan PHPUnitnya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed-1&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-12-07-testing-laravel-register-feature-test-02.jpg&#34; alt=&#34;Register Validation Test Passed&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Langsung &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt; juga ya? Ya harus, kalau dapat &lt;code class=&#34;test-red&#34;&gt;merah&lt;/code&gt;, berarti &lt;em&gt;copy-paste&lt;/em&gt;-nya ada salah.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Seperti manfaat dari feature test login kemarin, feature test register user ini akan sangat membantu jika ada perubahan kebijakan terhadap formulir yang harus diisi oleh user baru. Misalnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Formulir isian register ditambahkan nomor telepon, alamat, kota dan Kodepos.&lt;/li&gt;
&lt;li&gt;Pada formulir register, user harus setuju dengan syarat dan ketentuan sistem dengan cara centang &lt;em&gt;checkbox&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Dan berbagai kemungkinan perubahan fitur register di kemudian hari.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Semua kode yang telah kita kerjakan pada artikel ini, bisa teman-teman lihat di pada file &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/fd58467032aac247078fd8a465b3a7962a0b8667/tests/Feature/Auth/RegisterTest.php&#34;&gt;RegisterTest.php&lt;/a&gt; ini.&lt;/p&gt;
&lt;p&gt;Semoga &lt;strong&gt;belajar automated testing di Laravel&lt;/strong&gt; semakin menyenangkan. Demikian dan terima kasih atas waktu teman-teman, semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Login Feature Test</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-login-feature-test/</link>
       <pubDate>Wed, 28 Nov 2018 09:26:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-login-feature-test/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Sekian lama kita tidak membahas testing laravel di blog ini (terakhir &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tips-untuk-workflow-tdd/&#34;&gt;tips TDD Laravel&lt;/a&gt;), sekarang kita coba bahas tentang testing fitur Login di laravel.&lt;/p&gt;
&lt;p&gt;Login di framework laravel sudah disediakan &lt;em&gt;&amp;ldquo;out of the box&amp;rdquo;&lt;/em&gt; melalui satu perintah artisan. Artinya sebenarnya sudah tidak perlu dibuatkan test lagi (karena sudah fitur resmi laravel), tetapi ada kalanya kita &lt;strong&gt;perlu memodifikasi fitur login&lt;/strong&gt; ini, sesuai dengan kebutuhan sistem kita di masa datang. Jadi akan lebih baik jika kita memiliki feature test untuk ini.&lt;/p&gt;
&lt;p&gt;Di artikel kita menggunakan repository github &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;Laravel-TDD&lt;/a&gt; yang awal ya, yaitu pada commit &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/c2feb569db040090e2d2307790e939349328f1c1&#34;&gt;c2feb56&lt;/a&gt;. Jika ingin mengikuti sama persis, silakan teman-teman clone repo itu ke localhost.&lt;/p&gt;
&lt;p&gt;Pada project itu kita sudah memiliki fitur login, yang kita generate dengan perintah &lt;code&gt;php artisan make:auth&lt;/code&gt; pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mempercantik-tampilan-web/#edit-view-tasksindex&#34;&gt;artikel ini&lt;/a&gt;. Jadi kita tinggal buat feature testnya saja.&lt;/p&gt;
&lt;h3 id=&#34;jalakan-testing-sebelum-mulai&#34;&gt;Jalakan Testing Sebelum Mulai&lt;/h3&gt;
&lt;p&gt;Baik, seperti biasa, kita mulai kerja dengan menjalankan testing dulu.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (9 tests, 49 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;membuat-feature-test-login&#34;&gt;Membuat Feature Test Login&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:test Auth/LoginTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kita akan mendapatkan testcase class baru di : &lt;code&gt;tests/Feature/Auth/LoginTest.php&lt;/code&gt;. Sekarang edit untuk menyesuaikan fitur login kita. Buat test method baru &lt;code&gt;registered_user_can_login&lt;/code&gt;, kemudian kita buat PHP &lt;em&gt;comment line&lt;/em&gt; yang menjadi panduan kita.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature\Auth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LoginTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;registered_user_can_login&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita memiliki 1 user terdaftar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/login&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form login dengan email dan password yang tepat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman ter-redirect ke url &amp;#39;/home&amp;#39; (login sukses).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita melihat halaman tulisan &amp;#34;Dashboard&amp;#34; pada halaman itu.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Btw, langkah ini hanya sebagai panduan, jika teman-teman sudah fasih dengan testing, maka tidak perlu lagi membuat &lt;em&gt;comment line&lt;/em&gt; seperti ini, boleh langsung testing scriptnya.&lt;/p&gt;
&lt;p&gt;Baik, sekarang kita terjemahkan ke dalam bentuk script testing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature\Auth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\User&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan use model App\User
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LoginTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Trait refresh database agar migration dijalankan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;registered_user_can_login&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita memiliki 1 user terdaftar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bcrypt&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/login&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/login&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form login dengan email dan password yang tepat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;submitForm&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Login&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman ter-redirect ke url &amp;#39;/home&amp;#39; (login sukses).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita melihat halaman tulisan &amp;#34;Dashboard&amp;#34; pada halaman itu.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeText&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Dashboard&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Kita tambahkan penggunaan trait &lt;code&gt;RefreshDatabase&lt;/code&gt; agar testing menjalankan &lt;code&gt;artisan migrate&lt;/code&gt;, seperti yang pernah kita lakukan waktu &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#solusi-11&#34;&gt;mendapatan passed test pertama&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sekarang kita jalankan PHPUnitnya:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-28-testing-laravel-login-feature-test-01.jpg&#34; alt=&#34;Login Test Passed&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Langsung &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt;? Betul, fitur loginnya sudah ada, kita hanya membuat testingnya saja.&lt;/p&gt;
&lt;h3 id=&#34;membuat-test-method-logout&#34;&gt;Membuat Test Method Logout&lt;/h3&gt;
&lt;p&gt;Sekarang kita buat testing fitur logout. Kita edit lagi file &lt;code&gt;tests/Feature/Auth/LoginTest.php&lt;/code&gt; tambahkan test method baru: &lt;code&gt;logged_in_user_can_logout&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LoginTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... registered_user_can_login()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;logged_in_user_can_logout&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita memiliki 1 user terdaftar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Login sebagai user tersebut
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/home&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Buat post request ke url &amp;#39;/logout&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi (lagi) halaman &amp;#39;/home&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User ter-redirect ke halaman &amp;#39;/login&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lanjut, kita buat testing scriptnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LoginTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... registered_user_can_login()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;logged_in_user_can_logout&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kita memiliki 1 user terdaftar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username@example.net&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;bcrypt&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Login sebagai user tersebut
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;actingAs&lt;/span&gt;($user);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi halaman &amp;#39;/home&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Buat post request ke url &amp;#39;/logout&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/logout&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi (lagi) halaman &amp;#39;/home&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User ter-redirect ke halaman &amp;#39;/login&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/login&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, kemudian jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed-1&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-28-testing-laravel-login-feature-test-02.jpg&#34; alt=&#34;Logout Test Passed&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Selesai sampai di sini misi kita.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Mungkin ada yang bertanya, mengapa testing untuk fitur login dan logout ini perlu dilakukan? Bukankah fitur login bawaan laravel ini sudah handal dan teruji? &lt;em&gt;Well&lt;/em&gt;, testing ini lebih bertujuan sebagai backup kita (developer) jika ada kebijakan baru. Kita tidak tahu jika aplikasi web kita kedepannya mengalami perubahan kebijakan, misalnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;User boleh login dengan username atau email, atau&lt;/li&gt;
&lt;li&gt;User yang bisa login, akun harus diaktifkan melalui email dulu, atau&lt;/li&gt;
&lt;li&gt;Ada fitur suspend user di dalam sistem, jika user berstatus suspend, maka dia tidak dapat login, atau&lt;/li&gt;
&lt;li&gt;Login sebagai tipe user tertentu akan ter-redirect ke halaman yang berbeda dengan user tipe lain, atau&lt;/li&gt;
&lt;li&gt;Setelah user login, ada &lt;em&gt;flash message&lt;/em&gt; untuk user : &lt;strong&gt;&amp;ldquo;Selamat datang kembali, John Thor&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Atau berbagai macam perubahan kebijakan lain terkait urusan login user. Dengan adanya automated testing pada fitur ini, kita dapat dengan mudah menyesuaikan aplikasi/sistem dengan kebijakan baru.&lt;/p&gt;
&lt;p&gt;Semua kode yang telah kita kerjakan pada artikel ini, bisa teman-teman lihat di pada file &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/blob/eb202bf09ce4d2dd7074c5b7cf4c5b555024efcc/tests/Feature/Auth/LoginTest.php&#34;&gt;LoginTest.php&lt;/a&gt; ini.&lt;/p&gt;
&lt;p&gt;Demikian teman-teman terima kasih atas waktunya, semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Membeli Aplikasi Android di Playstore dengan Pulsa XL</title>
       <link>https://blog.inweeks.com/tips/cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl/</link>
       <pubDate>Sun, 04 Nov 2018 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tips/cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pagi ini saya membeli sebuah aplikasi android dari playstore dengan cara potong pulsa XL. Alhamdulillah berhasil. Saya membeli aplikasi &lt;a href=&#34;https://play.google.com/store/apps/details?id=net.cdeguet.smartkeyboardpro&amp;amp;hl=en&#34;&gt;Smart Keyboard Pro&lt;/a&gt; seharga Rp. 28.000,- dengan biaya tambahan sekitar 12%, pulsa terpotong total Rp. 31.360,-.&lt;/p&gt;
&lt;p&gt;Baik, saya share tahapan cara belanjanya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-01.jpg&#34; alt=&#34;Aplikasi Playstore&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pada Playstore, buka detail aplikasi yang ingin dibeli. Misal beli aplikasi Smart Keyboard Pro.&lt;/li&gt;
&lt;li&gt;Klik tombol hijau &lt;strong&gt;&amp;ldquo;IDR 28,000&amp;rdquo;&lt;/strong&gt; (ini harga aplikasinya).
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-02.jpg&#34; alt=&#34;Pilih Payment Method&#34;&gt;&lt;/li&gt;
&lt;li&gt;Di bahwa judul aplikasi, ada &lt;strong&gt;metode pembayaran&lt;/strong&gt;, klik (touch) agar muncul pilihan metode pembayaran lain.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;&amp;ldquo;Payment Methods&amp;rdquo;&lt;/strong&gt;.&lt;br&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-03.jpg&#34; alt=&#34;Pilih XL/Axis&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;&amp;ldquo;Use XL/Axis billing&amp;rdquo;&lt;/strong&gt;.&lt;br&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-04.jpg&#34; alt=&#34;Payment Confirmation&#34;&gt;&lt;/li&gt;
&lt;li&gt;Baca aturan pakai, jika ingin tahu. Yang jelas informasinya, ada charge/tarif yang dikenakan oleh operator pada proses pembayaran ini.&lt;/li&gt;
&lt;li&gt;Tekan &lt;strong&gt;&amp;ldquo;Buy&amp;rdquo;&lt;/strong&gt;, setelah ini mungkin kita akan &lt;strong&gt;diminta masukkan password&lt;/strong&gt; akun google/gmail kita, sebagai konfirmasi bahwa kita ingin membayar.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-05.jpg&#34; alt=&#34;Require Authentication&#34;&gt;&lt;/li&gt;
&lt;li&gt;Setelah &lt;strong&gt;Payment successful&lt;/strong&gt;, tampil halaman konfirmasi &lt;strong&gt;&amp;ldquo;Require authentication for purcases?&amp;rdquo;&lt;/strong&gt;. Pilih &lt;strong&gt;&amp;ldquo;YES, ALWAYS&amp;rdquo;&lt;/strong&gt;. Agar kita &lt;strong&gt;selalu diminta masukkan password&lt;/strong&gt; saat akan melakukan pembelian/ pembayaran di playstore. Ini untuk menghindari pembelian yang tidak disengaja.&lt;/li&gt;
&lt;li&gt;Payment successful, installation in prgress, klik &amp;ldquo;Continue&amp;rdquo;. Proses install ke handset android kita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selesai&lt;/strong&gt;. Kita akan menerima SMS dan email masuk sebagai resi pembayaran.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-06.jpg&#34; alt=&#34;Resi Pembayaran&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, begitu cara mudah membeli aplikasi android di playstore dengan cara potong pulsa. Sampai artikel ini ditulis, ada 4 operator telekomunikasi di Indonesia yang menyediakan layanan bayar playstore dengan potong pulsa ini. Bisa dilihat &lt;a href=&#34;https://support.google.com/googleplay/answer/6394130&#34;&gt;detailnya di sini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-11-04-cara-beli-aplikasi-android-di-playstore-dengan-pulsa-xl-07.jpg&#34; alt=&#34;Resi Pembayaran&#34;&gt;&lt;/p&gt;
&lt;p&gt;Demikian teman-teman, semoga bermanfaat. Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Ketika Masa GCP Free Trial Habis (12 Bulan)</title>
       <link>https://blog.inweeks.com/web-server/ketika-gcp-free-account-habis-12-bulan/</link>
       <pubDate>Mon, 29 Oct 2018 07:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/ketika-gcp-free-account-habis-12-bulan/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Alhamdulillah saya 12 bulan menggunakan Google Cloud Platform (GCP) Free Trial adalah pengalaman yang mengasikkan dan rezeki yang besar untuk saya secara pribadi. Pada tulisan ini, saya akan berbagi pengalaman ketika masa Free Trial GCP akan dan telah habis.&lt;/p&gt;
&lt;h3 id=&#34;manfaat-yang-saya-dapatkan&#34;&gt;Manfaat yang saya dapatkan&lt;/h3&gt;
&lt;p&gt;Apa saja manfaat dan pengalaman yang saya dapatkan dari layanan GCP Free Trial ini? Ini beberapa hal yang menurut saya penting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Satu VM Instance (VPS) yang digunakan untuk website marketing saya dan juga blog ini.&lt;/li&gt;
&lt;li&gt;Satu VM Instance yang digunakan untuk riset, demo &lt;a href=&#34;https://github.com/nafiesl&#34;&gt;project open-source&lt;/a&gt;, dan demo prototype aplikasi (project) untuk klien.&lt;/li&gt;
&lt;li&gt;Beberapa kali deploy (dan destroy) Virtual Machine (VM) Instance untuk riset saat belajar install dan konfigurasi web server.&lt;/li&gt;
&lt;li&gt;Semua didapatkan gratis sekitar 11 bulan (secara efektif).&lt;/li&gt;
&lt;li&gt;Tidak ada charge ke kartu kredit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sekali lagi ini pengalaman yang sangat bermanfaat untuk saya pribadi.&lt;/p&gt;
&lt;h3 id=&#34;apa-yang-terjadi-setelah-12-bulan&#34;&gt;Apa yang terjadi setelah 12 bulan?&lt;/h3&gt;
&lt;p&gt;Nah apa yang terjadi setelah 12 bulan Free Trial GCP ini habis? Secara umum teman-teman bisa membaca di &lt;a href=&#34;https://cloud.google.com/free/docs/frequently-asked-questions#end&#34;&gt;Google Cloud Platform Free Tier FAQ&lt;/a&gt; ini. Tatapi saya akan saya ceritakan apa yang saya alami, sebagai gambaaran untuk tema-teman semua.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;7 hari&lt;/strong&gt; sebelum masa trial habis, kita akan mendapatkan &lt;strong&gt;email&lt;/strong&gt; dari GCP sebagai &lt;strong&gt;reminder&lt;/strong&gt; bahwa trial akan habis.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-29-ketika-gcp-free-account-habis-12-bulan-01.jpg&#34; alt=&#34;GCP Remainder Email&#34;&gt;&lt;/li&gt;
&lt;li&gt;Ini &lt;strong&gt;kesempatan&lt;/strong&gt; kita untuk melakukan &lt;strong&gt;backup dan download/migrasi&lt;/strong&gt; semua website, database, demo project, konfigurasi DNS, dan file-file yang saya titipkan di VM Instance Google Cloud Engine (GCE).&lt;/li&gt;
&lt;li&gt;Tepat tanggal Free Trial habis, kita akan mendapatkan email lagi dari GCP, bahwa &lt;strong&gt;masa trial habis&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-29-ketika-gcp-free-account-habis-12-bulan-02.jpg&#34; alt=&#34;GCP Trial End Email&#34;&gt;&lt;/li&gt;
&lt;li&gt;Ketika free trial habis, kita sudah &lt;strong&gt;tidak bisa mengakses&lt;/strong&gt; VM Instance kita lagi, termasuk yang &amp;ldquo;always free&amp;rdquo; (I&amp;rsquo;m sorry, good bye&amp;hellip;).
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-29-ketika-gcp-free-account-habis-12-bulan-03.jpg&#34; alt=&#34;GCP VM Empty&#34;&gt;&lt;/li&gt;
&lt;li&gt;Free Credit yang tersisa hangus, tidak dapat digunakan lagi.&lt;/li&gt;
&lt;li&gt;Selama 12 bulan pemakaian GCP, sesuai dengan pernyataan GCP di &lt;a href=&#34;https://cloud.google.com/free/docs/frequently-asked-questions#end&#34;&gt;FAQ&lt;/a&gt;-nya, mereka benar-benar konsisten, tidak melakukan charge ke kartu kredit, sampai kita upgrade billing ke akun berbayar.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;tips-untuk-pengguna-gce-free-trial-yang-masih-aktif&#34;&gt;Tips untuk pengguna GCE Free Trial yang masih aktif&lt;/h3&gt;
&lt;p&gt;Beberapa tips saya bisa berikan berdasarkan pengalaman saya menggunakan GCP ini.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Set reminder 1 bulan&lt;/strong&gt; sebelum tanggal Free Trial expired, untuk antisipasi jika kita ingin pindah ke provider yang lain. Tanggal expired bisa dilihat di GCP Console, menu Billing.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-29-ketika-gcp-free-account-habis-12-bulan-04.jpg&#34; alt=&#34;GCP Trial End Date&#34;&gt;&lt;/li&gt;
&lt;li&gt;Cari layanan VPS pengganti. Ada beberapa alternatif, akhirnya saya &lt;a href=&#34;https://blog.inweeks.com/web-server/pindah-dari-google-cloud-platform-ke-microsoft-azure/&#34;&gt;memilih Microsoft Azure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persiapkan checklist&lt;/strong&gt;, apa saja yang perlu dibackup/dipindahkan dari GCE yang masih aktif. Untuk memastikan tidak ada yang tertinggal saat proses migrasi/proses backup. Untuk saya kemarin, checklistnya kurang lebih ini:
&lt;ul&gt;
&lt;li&gt;Folder Project Web (tempat website dipasang).&lt;/li&gt;
&lt;li&gt;Folder konfigurasi &lt;code&gt;sites-available&lt;/code&gt; nginx.&lt;/li&gt;
&lt;li&gt;Isi database MySQL dan PostgreSQL.&lt;/li&gt;
&lt;li&gt;Cloud DNS Entry tempat saya mengatur domain dan subdomain yang saya pasang di GCP.&lt;/li&gt;
&lt;li&gt;Folder repository git (bare) yang digunakan untuk git push langsung dari local PC langsung ke VM Instance.&lt;/li&gt;
&lt;li&gt;Semua folder di-zip dengan timestamp, misalnya: &lt;code&gt;web_2018-08-29.064600.zip&lt;/code&gt;, &lt;code&gt;config_site_nginx_2018-08-29.064600.zip&lt;/code&gt;, dan seterusnya.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tutup/destroy VM-VM yang sudah tidak digunakan lagi, untuk minimalisir data tertinggal.&lt;/li&gt;
&lt;li&gt;Jika layanan VPS pengganti sudah siap, lakukan &lt;strong&gt;migrasi paling lambat 7 hari&lt;/strong&gt; sebelum free trial habis.&lt;/li&gt;
&lt;li&gt;Pelajari cara &lt;strong&gt;transfer file antar server&lt;/strong&gt;, untuk menghemat kuota internet (daripada kita download dulu dari GCE, lalu upload lagi ke VPS baru). Kalau saya kemarin menggunakan perintah &lt;code&gt;scp&lt;/code&gt; untuk mengirim file ke server baru. Bisa lihat referensi &lt;a href=&#34;https://www.linux.com/learn/intro-to-linux/2017/2/how-securely-transfer-files-between-servers-scp&#34;&gt;di sini&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
Tadinya saya berharap bahwa VM instance yang &lt;a href=&#34;https://cloud.google.com/free/docs/frequently-asked-questions#always-free&#34;&gt;&amp;ldquo;Always Free&amp;rdquo;&lt;/a&gt; masih tetap dapat digunakan saat Free Trial habis, ternyata tidak bisa lagi. Semua layanan Always Free dapat diteruskan jika kita sudah upgrade billing. So, keep that in mind!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;penutup&#34;&gt;Penutup&lt;/h3&gt;
&lt;p&gt;Demikian teman-teman, semoga dengan artikel ini bermanfaat untuk teman-teman yang akan/sedang menggunakan Google Cloud Platform Free Account. Sebagai antisipasi ketika nanti masa trial akan habis. Jika teman-teman mengalami kendala baik teknikal atau billing/tagihan, bisa coba menghubungi Customer Support GCPnya, caranya bisa cek di &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-menghubungi-customer-support-gcp-google-cloud-platform/&#34;&gt;artikel ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bagi yang belum tahu bagaimana cara mendaftar dan mendapatkan Free Credit Google Cloud Platform ini, silakan baca-baca &lt;a href=&#34;https://blog.inweeks.com/web-server/mendapatkan-free-credit-usd-300-google-compute-engine/&#34;&gt;artikel ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>MS Azure Free Account harus Upgrade Biling setelah 30 Hari</title>
       <link>https://blog.inweeks.com/web-server/microsoft-azure-free-account-upgrade-billing-setelah-30-hari/</link>
       <pubDate>Sat, 27 Oct 2018 23:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/microsoft-azure-free-account-upgrade-billing-setelah-30-hari/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;h3 id=&#34;perhatian&#34;&gt;Perhatian!&lt;/h3&gt;
&lt;p&gt;Saya ingin menginformasikan kepada teman-teman yang sudah membaca tulisan saya tentang &lt;a href=&#34;https://blog.inweeks.com/web-server/pindah-dari-google-cloud-platform-ke-microsoft-azure/&#34;&gt;pindah layanan dari Google Cloud ke MS Azure&lt;/a&gt;. Bahwa &lt;strong&gt;30 hari&lt;/strong&gt; setelah mendaftar Microsoft Azure Free Account (masa free credit), saya mendapatkan email bahwa &lt;strong&gt;semua layanan free account dihentikan&lt;/strong&gt;. Kebetulan saya membaca email ini setelah mendapat info dari pembaca blog ini, bahwa web tidak dapat diakses.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-27-microsoft-azure-free-account-upgrade-billing-setelah-30-hari-01.jpg&#34; alt=&#34;MS Azure Subscription Disabled&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;layanan-stop-setelah-30-hari&#34;&gt;Layanan Stop setelah 30 Hari&lt;/h3&gt;
&lt;p&gt;Yap, diluar ekspektasi memang, setelah membaca &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/billing/billing-subscription-become-disable&#34;&gt;aturan mainnya&lt;/a&gt;, ternyata layanan Free Account ini hanya berlaku 30 hari sejak pendaftaran (sesuai dengan masa berlaku Free Credit yang $200). Setelah itu harus upgrade billing ke layanan berbayar untuk terus menggunakan layanan MS Azure.&lt;/p&gt;
&lt;p&gt;Virtual Machine atau VPS gratis selama 12 bulan (dan semua produk &amp;ldquo;always-free&amp;rdquo;) itu dihentikan, dan hanya dapat diteruskan setelah melakukan &lt;strong&gt;upgrade langganan&lt;/strong&gt; ke &amp;ldquo;Bayar seperlunya&amp;rdquo; (Pay as you go).&lt;/p&gt;
&lt;p&gt;Setelah membaca aturannya, langganan/billing &amp;ldquo;Pay as you go&amp;rdquo; ini artinya kartu kredit akan standby untuk dikenakan &lt;em&gt;charge&lt;/em&gt; jika ada layanan berbayar yang digunakan. Wah, ngeri kan?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-27-microsoft-azure-free-account-upgrade-billing-setelah-30-hari-02.jpg&#34; alt=&#34;MS Azure Subscription Disabled Documentation&#34;&gt;&lt;/p&gt;
&lt;p&gt;Dengan kondisi saya saat itu :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Semua sudah terlanjur pindah ke VPS di MS Azure.&lt;/li&gt;
&lt;li&gt;Layanan 12 bulan VPS gratis (katanya) tetap dapat dinikmati.&lt;/li&gt;
&lt;li&gt;Belum ada pilihan lain untuk mendapatkan VPS gratis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Setelah membaca aturan main berulang-ulang dan mempertimbangkan resikonya, akhirnya saya putuskan untuk upgrade billing.&lt;/p&gt;
&lt;h3 id=&#34;upgrade-ke-billing-pay-as-you-go&#34;&gt;Upgrade ke Billing &amp;ldquo;Pay as you go&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Jika teman-teman ada yang mengalami hal yang sama, dan memutuskan untuk upgrade juga, begini caranya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buka email dari MS Azure perihal Upgrade Billing (gambar di atas), klik tombol/link &lt;strong&gt;&amp;ldquo;Upgrade Now&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Login ke akun MS Azure (jika diperlukan). Kita akan masuk ke formulir &lt;strong&gt;Upgrade your subscription&lt;/strong&gt; seperti di bawah ini.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-27-microsoft-azure-free-account-upgrade-billing-setelah-30-hari-03.jpg&#34; alt=&#34;MS Azure Upgrade Billing&#34;&gt;&lt;/li&gt;
&lt;li&gt;Isikan field &lt;strong&gt;subscription friendly name&lt;/strong&gt;, misal &amp;ldquo;Bayar seperlunya&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Pada &lt;strong&gt;Add a support plan&lt;/strong&gt;, pastikan kita memilih &lt;strong&gt;opsi terbawah&lt;/strong&gt; &amp;ldquo;No technical support or I&amp;rsquo;m already covered Microsoft Premier Support&amp;rdquo;. &lt;em&gt;(Agar tidak tidak terkena biaya layanan teknis perbulan).&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;&amp;ldquo;Upgrade&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tunggu sampai muncul notifikasi &lt;strong&gt;Succcessfully upgraded subscription&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-27-microsoft-azure-free-account-upgrade-billing-setelah-30-hari-04.jpg&#34; alt=&#34;MS Azure Upgrade Billing Success&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sampai disini selesai proses upgrade billing ke &amp;ldquo;Pay as you go&amp;rdquo;. Selanjutnya kita aktifkan kembali Virtual Machine yang distop tadi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kembali ke &lt;em&gt;dashboard&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Buka halaman detail Virtual Machine yang &lt;em&gt;disabled&lt;/em&gt;, melalui menu di samping, atau dari &lt;em&gt;dashboard&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Klik tombol &lt;strong&gt;Start&amp;quot;&lt;/strong&gt;. tunggu sampai ada notifikasi: &lt;em&gt;&amp;ldquo;Started virtual machine&amp;rdquo;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Kunjungi lagi IP Address/domain dari VPS ini, seharusnya sudah aktif lagi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-27-microsoft-azure-free-account-upgrade-billing-setelah-30-hari-05.jpg&#34; alt=&#34;MS Azure Disabled Start VM&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;hal-yang-harus-diperhatikan&#34;&gt;Hal yang harus diperhatikan&lt;/h3&gt;
&lt;p&gt;Agar kartu kredit tidak dikenakan charge/biaya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Monitor bandwidth (memastikan tidak ada kelebihan outbound data transfer dari jatah free account).&lt;/li&gt;
&lt;li&gt;Memastikan tidak menggunakan layanan berbayar MS Azure.&lt;/li&gt;
&lt;li&gt;Rajin mengunjungi halaman &lt;strong&gt;Cost Management + Billing&lt;/strong&gt; untuk melihat dan memastikan &lt;strong&gt;Current Cost&lt;/strong&gt; selalu nol.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-10-27-microsoft-azure-free-account-upgrade-billing-setelah-30-hari-06.jpg&#34; alt=&#34;MS Azure Cost and Billing&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;penutup&#34;&gt;Penutup&lt;/h3&gt;
&lt;p&gt;Ketika menulis artikel ini, terhitung sudah 1 bulan lebih saya upgrade ke billing &amp;ldquo;Pay as you go&amp;rdquo;. Alhamdulillah tidak ada charge pada kartu kredit dari Microsoft Azure, artinya pemakaian VPS masih di bawah batas layanan gratis 12 bulan. Semoga tetap terjaga agar tagihan selalu di angka nol.&lt;/p&gt;
&lt;p&gt;Baik, demikian cerita saya menggunakan layanan Microsoft Azure Free Account (yang sudah tidak free lagi) ini. Terima kasih atas waktu teman-teman, semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Deploy Free Account Virtual Machine di MS Azure</title>
       <link>https://blog.inweeks.com/web-server/cara-deploy-free-account-virtual-machine-microsoft-azure/</link>
       <pubDate>Sun, 23 Sep 2018 21:12:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/cara-deploy-free-account-virtual-machine-microsoft-azure/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Sebagaimana yang telah kita bahas di artikel sebelumnya, bahwa Free Account dari Microsoft Azure memberikan kita satu Virtual Machine atau VPS gratis selama 12 bulan. Kali ini saya ingin share ke teman-teman pembaca, tentang cara men-deploy sebuah Virtual Machine atau VPS tersebut. Tetapi sebelum mengikuti langkah-langkah di bawah, pastikan teman-teman sudah &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-mendaftar-microsoft-azure-free-account/&#34;&gt;mendaftar&lt;/a&gt; di Microsoft Azure Free Account.&lt;/p&gt;
&lt;h2 id=&#34;login-ke-portal-ms-azure&#34;&gt;Login ke Portal MS Azure&lt;/h2&gt;
&lt;p&gt;Untuk memulai kita harus login terlebih dahulu di Portal Microsoft Azure.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kunjungi &lt;a href=&#34;https://azure.microsoft.com&#34;&gt;https://azure.microsoft.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Sign in&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Lanjutkan proses hingga masuk ke dashboard.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-05-cara-mendaftar-microsoft-azure-free-account-05.jpg&#34; alt=&#34;Microsoft Azure Portal&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;langkah-deployment-vm&#34;&gt;Langkah Deployment VM&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Klik link &lt;strong&gt;Create a resource&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pada kotak pencarian, cari &lt;strong&gt;&amp;ldquo;b1s&amp;rdquo;&lt;/strong&gt;, lalu klik &lt;strong&gt;b1s&lt;/strong&gt; pada hasil pencarian.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-01.jpg&#34; alt=&#34;Pencarian Free Account Virtual Machine&#34;&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-02.jpg&#34; alt=&#34;Create Free Account Virtual Machine&#34;&gt;&lt;/li&gt;
&lt;li&gt;Muncul hasil pencariannya, kemudian klik link &lt;strong&gt;Free account virtual machine&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-03.jpg&#34; alt=&#34;Create Free Account Virtual Machine&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pada kotak dialog Free account virtual machine, klik &lt;strong&gt;Create&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-04.jpg&#34; alt=&#34;Form Create Virtual Machine&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pada subscription pilih &lt;strong&gt;Free Trial&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Resource group isikan nama grup secara bebas, contoh di saya : &lt;strong&gt;&amp;ldquo;grup-saya&amp;rdquo;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tulis nama virtual machine/VPS yang diinginkan, misal: &lt;strong&gt;my-azure-vm&lt;/strong&gt;, ini nama computer namenya.&lt;/li&gt;
&lt;li&gt;Untuk region pilih yang terdekat dengan target audience website, saya di Indonesia, pilih &lt;strong&gt;Southeast Asia&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pada Image, pilih operating sistem yang diinginkan, kalau saya pilih &lt;strong&gt;Ubuntu 16.04-LTS&lt;/strong&gt;. Karena bisanya cuman ubuntu itu, xixi..&lt;/li&gt;
&lt;li&gt;Size sudah pilihkan oleh webnya, &lt;strong&gt;1 virtual CPU, RAM 1 GB&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-05.jpg&#34; alt=&#34;Form Create Virtual Machine&#34;&gt;&lt;/li&gt;
&lt;li&gt;Authentication type, jika mau langsung dengan &lt;strong&gt;SSH public key&lt;/strong&gt;, silakan pilih, nanti kita diminta masukkan public key dari PC kita. Saya pilih dengan &lt;strong&gt;password&lt;/strong&gt; dulu untuk mempermudah di awal.&lt;/li&gt;
&lt;li&gt;Isikan &lt;strong&gt;username&lt;/strong&gt; dan &lt;strong&gt;password&lt;/strong&gt; yang digunakan untuk login ke VM/VPS nanti.&lt;/li&gt;
&lt;li&gt;Pada &lt;strong&gt;Inbound Port Rules&lt;/strong&gt; kita pilih 3 item:
&lt;ul&gt;
&lt;li&gt;HTTP&lt;/li&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;SSH (22)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inbound port source pilih &lt;strong&gt;Any IP Address&lt;/strong&gt;, agar bisa login dari PC/laptop mana saja. Silakan pilih opsi lain kalau ingin disesuaikan dengan kebutuhan teman-teman.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Review + create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Selanjutnya kita diberi halaman verifikasi isian, kalau ada yang keliru silakan klik &lt;strong&gt;Previous&lt;/strong&gt;. &lt;em&gt;Tenang saja, tidak sakit kok, ini masih gratis.&lt;/em&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-06.jpg&#34; alt=&#34;Form Create Virtual Machine&#34;&gt;&lt;/li&gt;
&lt;li&gt;Kalau sudah yakin dengan isiannya, klik &lt;strong&gt;Create&lt;/strong&gt; untuk memulai proses deploy VM kita. (Prosesnya sekitar 3-5 menitan.)&lt;br&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-07.jpg&#34; alt=&#34;Virtual Machine Deployment success notification&#34;&gt;&lt;/li&gt;
&lt;li&gt;Jika sudah dapat notifikasi &lt;strong&gt;Deployment succeeded&lt;/strong&gt;, klik link &lt;strong&gt;Go to resource&lt;/strong&gt; untuk melihat VM/VPS kita.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-08.jpg&#34; alt=&#34;Virtual Machine Detail&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pada detail VM ini, kita bisa melihat &lt;strong&gt;Public IP Address&lt;/strong&gt; nya. Silakan teman-teman ping dari terminal untuk mengujinya.&lt;/p&gt;
&lt;h2 id=&#34;ping-ip-address-vm&#34;&gt;Ping IP Address VM&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-09.jpg&#34; alt=&#34;Ping Virtual Machine&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;login-ssh-ke-vm&#34;&gt;Login SSH ke VM&lt;/h2&gt;
&lt;p&gt;Kalau Ping sukses, seharusnya kita sudah bisa login ke VM dengan SSH. Kita coba dengan username yang kita seting di point 12 tadi:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh username@ip-address
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# masukkan password&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-10.jpg&#34; alt=&#34;SSH Virtual Machine&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip sudah. Jika berhasil login seperti di atas, berarti kita sudah berhasil deploy VM dari Free Account Microsoft Azure ini.&lt;/p&gt;
&lt;h2 id=&#34;cek-memory-dan-disk-space&#34;&gt;Cek Memory dan Disk Space&lt;/h2&gt;
&lt;p&gt;Masih dalam kondisi login SSH di VM, RAM/memory pada VM kita bisa cek dengan perintah:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ free -m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-11.jpg&#34; alt=&#34;Memory Virtual Machine&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sedangkan Disk Space pada VM kita bisa cek dengan perintah:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ df -h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-23-cara-deploy-free-account-virtual-machine-microsoft-azure-12.jpg&#34; alt=&#34;Disk Space Virtual Machine&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yap, kita dapat disk dengan space &lt;strong&gt;~64GB&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;next-step&#34;&gt;Next Step&lt;/h2&gt;
&lt;p&gt;Setelah selesai deploy VM dengan langkah-langkah di atas, selanjutnya teman-teman bisa mengoperasikan/menggunakannya sesuai kebutuhan. Misalnya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.inweeks.com/web-server/install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04/&#34;&gt;Install LEMP Stack&lt;/a&gt; dulu untuk web server.&lt;/li&gt;
&lt;li&gt;Lalu &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-project-laravel-dari-github-ke-vps/&#34;&gt;Deploy Project Laravel&lt;/a&gt;, silakan coba project open-source &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;Free-PMO&lt;/a&gt; ini untuk mempermudah mengelola project.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.inweeks.com/deploy/mapping-subdomain-ke-vps/&#34;&gt;Mapping subdomain agar mengarah ke VM&lt;/a&gt; yang baru.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alhamdulillah, cukup sampai di sini. Insyaallah kita akan bahas hal-hal lain lagi pada artikel berikutnya. Terima kasih atas waktu teman-teman.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Mendaftar Microsoft Azure Free Account</title>
       <link>https://blog.inweeks.com/web-server/cara-mendaftar-microsoft-azure-free-account/</link>
       <pubDate>Wed, 05 Sep 2018 13:15:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/cara-mendaftar-microsoft-azure-free-account/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://azure.microsoft.com/en-us&#34;&gt;Microsoft Azure&lt;/a&gt; adalah layanan cloud yang dimiliki oleh Microsoft. Mirip seperti Google Cloud Platform, Azure memiliki banyak layanan, salah satu di antaranya adalah Virtual Machines, atau biasa kita sebut Virtual Private Server (VPS).&lt;/p&gt;
&lt;p&gt;Pada &lt;a href=&#34;https://blog.inweeks.com/web-server/pindah-dari-google-cloud-platform-ke-microsoft-azure/&#34;&gt;artikel sebelumnya&lt;/a&gt;, saya cerita tentang rencana pindah layanan VPS dari Google Cloud Platform karena masa trialnya sudah hampir habis. Alhamdulillah sekarang sudah mendaftar dan pindah ke Microsoft Azure ini. Nah, kali ini saya mau share ke teman-teman tentang bagaimana cara mendaftar Free Account di Microsoft Azure ini.&lt;/p&gt;
&lt;h3 id=&#34;perhatian&#34;&gt;Perhatian!&lt;/h3&gt;
&lt;p&gt;Sebelum teman-teman mendaftar, saya informasikan bahwa Microsoft Azure Free Account &lt;strong&gt;hanya berlaku 30 hari&lt;/strong&gt; sejak pendaftaran. Setelah itu kita harus upgrade ke layanan berbayar. Lihat detailnya pada &lt;a href=&#34;https://blog.inweeks.com/web-server/microsoft-azure-free-account-upgrade-billing-setelah-30-hari/&#34;&gt;artikel ini&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;syarat-mendaftar-microsoft-azure&#34;&gt;Syarat Mendaftar Microsoft Azure&lt;/h3&gt;
&lt;p&gt;Untuk mendaftar, &lt;strong&gt;syaratnya&lt;/strong&gt; kita perlu :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kartu Kredit&lt;/strong&gt; yang masih berlaku.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nomor Hape&lt;/strong&gt; aktif.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Akun Microsoft/Live/Skype&lt;/strong&gt; (bisa dibuat sekalian mendaftar Akun Azure).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;proses-mendaftar-microsoft-azure&#34;&gt;Proses Mendaftar Microsoft Azure&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Kunjungi link pendaftarannya: &lt;a href=&#34;https://azure.microsoft.com/en-us/free&#34;&gt;https://azure.microsoft.com/en-us/free&lt;/a&gt;, kemudian klik tombol &lt;strong&gt;Start free&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Kita akan menuju ke halaman login akun Microsoft. Silakan login ke akun Microsoft (atau buat akun jika belum ada).
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-05-cara-mendaftar-microsoft-azure-free-account-01.jpg&#34; alt=&#34;Microsoft Login Account&#34;&gt;&lt;/li&gt;
&lt;li&gt;Setelah login akun Microsoft, kita akan diarahkan ke halaman &lt;strong&gt;Azure free account sign up&lt;/strong&gt;. Silakan isi Data Diri di sana.&lt;/li&gt;
&lt;li&gt;Pada bagian &lt;strong&gt;Identity verification by phone&lt;/strong&gt;, silakan isi nomor telepon/Hp., tekan &lt;strong&gt;Text me&lt;/strong&gt;. Nanti akan dapat SMS berisi nomor verifikasi.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-05-cara-mendaftar-microsoft-azure-free-account-02.jpg&#34; alt=&#34;Azure sign up form&#34;&gt;&lt;/li&gt;
&lt;li&gt;Isikan data kartu kredit yang akan digunakan pada bagian &lt;strong&gt;Identify verification by card&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-05-cara-mendaftar-microsoft-azure-free-account-03.jpg&#34; alt=&#34;Azure sign up card&#34;&gt;&lt;/li&gt;
&lt;li&gt;Lanjutkan ke bagian &lt;strong&gt;Agreement&lt;/strong&gt; sampai selesai.&lt;/li&gt;
&lt;li&gt;Setelah berhasil mendaftar, kita mendapatkan halaman: &lt;strong&gt;You&amp;rsquo;re ready to start with Azure&lt;/strong&gt;. Klik tombol &lt;strong&gt;Go to portal&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-05-cara-mendaftar-microsoft-azure-free-account-04.jpg&#34; alt=&#34;Azure sign up card&#34;&gt;&lt;/li&gt;
&lt;li&gt;Tampil halaman &lt;strong&gt;Portal Microsoft Azure&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-09-05-cara-mendaftar-microsoft-azure-free-account-05.jpg&#34; alt=&#34;Microsoft Azure Portal&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sip, sampai di tahap ini kita sudah sukses &lt;strong&gt;mendaftar di Microsoft Azure Free Account&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;penutup&#34;&gt;Penutup&lt;/h3&gt;
&lt;p&gt;Sampai artikel ini ditulis, saya sudah mencoba men-deploy satu Virtual Machine (VPS), caranya agak berbeda dengan membuat &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;VM Instance di Google Cloud Engine&lt;/a&gt;. Selanjutnya insyaallah kita akan bahas &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-deploy-free-account-virtual-machine-microsoft-azure/&#34;&gt;cara men-deploy Free Account Virtual Machine&lt;/a&gt; (VPS yang gratis).&lt;/p&gt;
&lt;p&gt;Btw jika teman-teman ingin coba daftar ke Google Cloud Platform dan dapat &lt;strong&gt;Free Credit $300&lt;/strong&gt; selama 12 bulan, bisa cek artikel ini: &lt;a href=&#34;https://blog.inweeks.com/web-server/mendapatkan-free-credit-usd-300-google-compute-engine/&#34;&gt;Mendapatkan Free Credit USD 300 untuk Google Compute Engine&lt;/a&gt;. Lumayan bisa digunakan untuk kebutuhan riset selama 1 tahun.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktu teman-teman, semoga bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Pindah dari Google Cloud Platform ke Microsoft Azure</title>
       <link>https://blog.inweeks.com/web-server/pindah-dari-google-cloud-platform-ke-microsoft-azure/</link>
       <pubDate>Thu, 30 Aug 2018 21:15:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/pindah-dari-google-cloud-platform-ke-microsoft-azure/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel terdahulu saya pernah cerita bahwa saya menggunakan &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;layanan Google Cloud Engine&lt;/a&gt; sebagai server untuk blog ini, web &lt;a href=&#34;https://jasawebsitebanjarmasin.com/&#34;&gt;JasaWebsiteBanjarmasin.com&lt;/a&gt;, beberapa project riset dan demo project untuk klien.&lt;/p&gt;
&lt;p&gt;Waktu itu sudah 5 bulan saya menggunakan layanan Google Cloud Engine. Sekarang, layanan itu sudah hampir habis, sudah hampir 12 bulan saya menggunakannya. Jika diteruskan, biaya perbulan untuk 1 VM Instance cukup menguras kantong ($19.63 atau Rp. 295.000 per bulan), jadi saya putuskan untuk mencari layanan lain yang menyediakan VPS murah, atau gratis 12 bulan juga, hehe&amp;hellip;&lt;/p&gt;
&lt;p&gt;Btw, per hari ini, ketika artikel ini ditulis, saya punya waktu sekitar 1 minggu untuk melakukan migrasi ke layanan yang baru.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-08-30-pindah-dari-google-cloud-platform-ke-microsoft-azure-01.jpg&#34; alt=&#34;GCP Credit Expiry&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;alternatif-penyedia-server&#34;&gt;Alternatif Penyedia Server&lt;/h3&gt;
&lt;p&gt;Setelah googling, saya mendapatkan 2 provider yang memiliki layanan Free Trial 12 bulan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Azure&lt;/strong&gt; Free Account (&lt;a href=&#34;https://azure.microsoft.com/en-us/free&#34;&gt;info&lt;/a&gt; dan &lt;a href=&#34;https://azure.microsoft.com/en-us/free/free-account-faq&#34;&gt;FAQ&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazone Web Services&lt;/strong&gt; Free Tier (&lt;a href=&#34;https://aws.amazon.com/free&#34;&gt;info&lt;/a&gt; dan &lt;a href=&#34;https://aws.amazon.com/free/faqs&#34;&gt;FAQ&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Teman-teman bisa lihat informasi dan FAQ di kedua penyedia server itu. Keduanya memiliki Data Center Singapore, dekat dari Indonesia dengan &lt;strong&gt;latency&lt;/strong&gt; rata-rata &lt;strong&gt;70 ms&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;pilihan-penyedia-server&#34;&gt;Pilihan Penyedia Server&lt;/h3&gt;
&lt;p&gt;Setelah mempelajari info dan FAQ dari kedua layanan tersebut, saya memilih untuk mencoba &lt;strong&gt;Microsoft Azure Free Account&lt;/strong&gt;. Kenapa? Karena FAQnya lebih mudah saya pahami, dan ada lumayan banyak layanan always free yang mungkin bisa saya manfaatkan suatu hari nanti.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-08-30-pindah-dari-google-cloud-platform-ke-microsoft-azure-02.jpg&#34; alt=&#34;FAQ Microsoft Azure Free Account&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;spesifikasi-mesin-virtual-vps&#34;&gt;Spesifikasi Mesin Virtual (VPS)&lt;/h3&gt;
&lt;p&gt;Di screenshot FAQ MS Azure ini, ada &lt;em&gt;750 hours of Azure &lt;strong&gt;B1S General Purpose&lt;/strong&gt; Virtual Machines for Linux&lt;/em&gt; yang free 12 bulan. Setelah saya cek, di free account ini kita akan dapat virtual server dengan spesifikasi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU: 1 virtual CPU&lt;/li&gt;
&lt;li&gt;RAM: &lt;strong&gt;1 GB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DISK: &lt;strong&gt;SSD 64 GB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bandwidth: outbound 15 GB per bulan, inbound unlimited.&lt;/li&gt;
&lt;li&gt;Operating System: Ubuntu Server 16.04.5 LTS&lt;br&gt;
(Sampai artikel ini ditulis, belum tersedia Ubuntu 18.04 LTS.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lumayan ya. Dengan spesifikasi itu, insyaallah cukup untuk kebutuhan saya saat ini. Sebagai perbandingan, di Google Cloud Platform saya menggunakan VM Instance jenis:&lt;br&gt;
&lt;strong&gt;g1-small&lt;/strong&gt; (1 vCPU, RAM 1.7 GB).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-08-30-pindah-dari-google-cloud-platform-ke-microsoft-azure-03.jpg&#34; alt=&#34;GCE Virtual Machine&#34;&gt;&lt;/p&gt;
&lt;p&gt;Baik, sampai disitu dulu cerita rencana saya untuk pindah layanan VPS. Pada artikel berikutnya, insya Allah saya lanjutkan dengan menulis cara &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-mendaftar-microsoft-azure-free-account/&#34;&gt;mendaftar ke Microsoft Azure Free Account&lt;/a&gt;. Stay tuned&amp;hellip;&lt;/p&gt;
&lt;p&gt;Terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Install Wordpress dengan WP-CLI</title>
       <link>https://blog.inweeks.com/tool/cara-install-wordpress-dengan-wp-cli/</link>
       <pubDate>Tue, 28 Aug 2018 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/cara-install-wordpress-dengan-wp-cli/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Kali ini kita akan bermain dengan command-line tool untuk menginstall CMS Wordpress, yaitu &lt;a href=&#34;https://wp-cli.org/&#34;&gt;&lt;strong&gt;WP-CLI&lt;/strong&gt; (wordpress command-line interface)&lt;/a&gt;. Bagi yang sudah terbiasa bekerja dengan terminal, WP-CLI ini sangat membantu untuk mempercepat proses installasi wordpress.&lt;/p&gt;
&lt;h3 id=&#34;install-wp-cli&#34;&gt;Install WP-CLI&lt;/h3&gt;
&lt;h4 id=&#34;requirement&#34;&gt;Requirement&lt;/h4&gt;
&lt;p&gt;Untuk dapat menggunakan dan menginstall WP-CLI, ada beberapa requirement yang harus dipenuhi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lingkungan UNIX-like ( X, Linux, FreeBSD, Cygwin). Menurut websitenya, lingkungan windows masih kurang disupport. Di sini saya menggunakan Ubuntu 16.04.&lt;/li&gt;
&lt;li&gt;Bisa perintah &lt;code&gt;curl&lt;/code&gt; atau &lt;code&gt;wget&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Versi PHP minimal 5.4.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;cara-install&#34;&gt;Cara Install&lt;/h4&gt;
&lt;p&gt;Proses install WP-CLI, kita bisa jalankan perintah berikut :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Download dengan curl (bebas di direktori mana saja)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cek hasil install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php wp-cli.phar --info
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Berikan permission untuk eksekusi wp-cli&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ chmod +x wp-cli.phar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Pindahkan file ke direktori `/usr/local/bin` dengan nama file `wp`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mv wp-cli.phar /usr/local/bin/wp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cek hasil install lagi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ wp --info
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PHP binary: /usr/bin/php7.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PHP version:    7.2.7-1+ubuntu16.04.1+deb.sury.org+1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php.ini used:   /etc/php/7.2/cli/php.ini
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP-CLI root dir:    phar://wp-cli.phar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP-CLI vendor dir:  phar://wp-cli.phar/vendor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP_CLI phar path:   /home/nafies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP-CLI packages dir:    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP-CLI global config:   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP-CLI project config:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WP-CLI version: 1.3.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jika sudah tampil seperti di atas, berarti proses install WP-CLI dan selesai berhasil.&lt;/p&gt;
&lt;h3 id=&#34;install-wordpress-dengan-wp-cli&#34;&gt;Install Wordpress dengan WP-CLI&lt;/h3&gt;
&lt;p&gt;Untuk proses installasi wordpress dengan WP-CLI, kita lakukan langkah-langkah berikut&lt;/p&gt;
&lt;h4 id=&#34;membuat-database-baru-di-mysql&#34;&gt;Membuat Database Baru di MySQL&lt;/h4&gt;
&lt;p&gt;Kita buat database baru dengan perintah &lt;code&gt;mysqladmin&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mysqladmin -urootuser -p create wp_2018_test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter password: &lt;span style=&#34;color:#75715e&#34;&gt;# masukkan password user mysql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;buat-direktori-wordpress&#34;&gt;Buat Direktori Wordpress&lt;/h4&gt;
&lt;p&gt;Buat satu direktori/folder (misal &lt;code&gt;wp-test&lt;/code&gt;) sesuai dengan document root web server kita, baik di XAMPP, LAMP atau LEMP. Untuk kasus saya, document root apache ada di &lt;code&gt;~/www&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mkdir wp-test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd wp-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;install-wordpress&#34;&gt;Install Wordpress&lt;/h4&gt;
&lt;p&gt;Jalankan perintah WP-CLI untuk mulai menginstall wordress.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Download wordpress file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ wp core download
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Buat file `wp-config.php`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ wp config create --dbname&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;wp_2018_test --dbuser&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;rootuser --prompt&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dbpass --dbprefix&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;test_
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --dbname adalah nama database yang kita buat untuk wordpress di atas.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --dbuser adalah username MySQL yang kita gunakan untuk wordpress ini.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --prompt=dbpass adalah perintah untuk memasukkan password user MySQL (agar tidak masuk cli history).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --dbprefix adalah prefix table-tabel wordpress di database.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Install wordpress dan set admin user.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ wp core install --url&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://localhost/wp-test --title&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;My Wordpress Website&amp;#34;&lt;/span&gt; --admin_user&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;web_manager --prompt&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;admin_password --admin_email&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;info@example.net --skip-email
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --url adalah domain atau URL untuk website wordpressnya, bisa juga langsung gunakan domain.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --title adalah judul website wordpress.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --admin_user adalah username untuk administrator website.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --prompt=admin_password adalah perintah untuk memasukkan password user admin wordpress (agar tidak masuk cli history).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --admin_email adalah alamat email user administrator website.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --skip-email ditambahkan agar server tidak mengirimkan data akun dan profil user admin melalui email.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Disini kita menggunakan perintah &lt;code&gt;wp core&lt;/code&gt; dan &lt;code&gt;wp-config&lt;/code&gt;, teman-teman bisa melihat dokumentasi perintah ini di websitenya : &lt;a href=&#34;https://developer.wordpress.org/cli/commands/core/&#34;&gt;wp core&lt;/a&gt; dan &lt;a href=&#34;https://developer.wordpress.org/cli/commands/config/&#34;&gt;wp config&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sampai di sini proses install wordpress sudah selesai. Sekarang kita bisa coba kunjugi URL wordpressnya melalui browser. Untuk kasus saya, saya akan mengunjungi URL:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://localhost/wp-test
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-08-28-cara-install-wordpress-dengan-wp-cli-01.jpg&#34; alt=&#34;Installed Wordpress Site&#34;&gt;&lt;/p&gt;
&lt;p&gt;Untuk login admin area, dapat dikunjungi seperti biasa, dengan ditambahkan &lt;code&gt;/wp-admin&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://localhost/wp-test/wp-admin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-08-28-cara-install-wordpress-dengan-wp-cli-02.jpg&#34; alt=&#34;Wordpress Admin Area&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Baik sampai di situ selesai tutorial cara install wordpress dengan wp-cli. Beberapa hal yang bisa saya simpulkan dari cara installasi ini.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cara install ini hanya salah satu dari sekian banyak cara menginstall wordpress ke localhost.&lt;/li&gt;
&lt;li&gt;Menurut saya pribadi, dengan cara ini proses installasi wordpress menjadi ringkas dan cepat.&lt;/li&gt;
&lt;li&gt;Selain di localhost, cara install dengan CLI ini dapat juga diterapkan jika kita menggunakan server online (VPS). Tetapi tidak dapat digunakan di shared hosting.&lt;/li&gt;
&lt;li&gt;Kita bisa menggunakan WP-CLI untuk mengelola theme, plugin, user, media, option, dan banyak lagi, hanya melalui perintah terminal.&lt;/li&gt;
&lt;li&gt;List perintah WP-CLI dapat dilihat di &lt;a href=&#34;https://developer.wordpress.org/cli/commands/&#34;&gt;dokumentasinya&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alhamdulillah, semoga tulisan ini bermanfaat. Terima kasih atas waktu teman-teman sudah membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Mengatur Environment Variable pada POSTMAN</title>
       <link>https://blog.inweeks.com/tool/mengatur-environment-variables-pada-postman/</link>
       <pubDate>Thu, 31 May 2018 11:20:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/mengatur-environment-variables-pada-postman/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Ketika kita mengembangkan API Endpoint untuk dikonsumsi berbagai platform sistem, salah satu alat bantunya adalah POSTMAN. &lt;a href=&#34;https://www.getpostman.com/&#34;&gt;POSTMAN&lt;/a&gt; adalah alat bantu untuk menguji hasil atau output dari API Endpoint dari sebuah server back-end. Baik Endpoint tersebut berasal dari localhost (saat development), maupun di server online.&lt;/p&gt;
&lt;p&gt;Jika kita ingin menguji endpoint-endpoint API yang sudah dibuat, kita harus &lt;strong&gt;mengisi URL&lt;/strong&gt; yang sesuai dengan lingkungan server yang diuji, yaitu di localhost dan di server online. Misalnya di &lt;strong&gt;localhost&lt;/strong&gt; base URLnya: &lt;code&gt;http://localhost/dompet/public&lt;/code&gt;, sedangkan di &lt;strong&gt;server online&lt;/strong&gt;, pasti base URLnya berbeda, misalnya: &lt;code&gt;http://dompet.nafies.id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ketika tahap development kita tes endpoint di localhost, dengan URL localhost, ketika tes endpoint di server online, kita &lt;strong&gt;ubah URL nya&lt;/strong&gt; jadi domain di server online. Ketika lanjut development, URL domain server online &lt;strong&gt;diubah lagi&lt;/strong&gt; menjadi localhost.&lt;/p&gt;
&lt;p&gt;Kalau hanya 1 atau 5 endpoint saja tidak masalah kita gonta-ganti URL seperti itu. Tapi kalau endpointnya ada 20 bagaimana? Kalau ada 50 endpoint bagaimana? Apakah harus mengganti semua URL? Atau sebagai alternatif, kita buat endpoint duplikat, yang satu untuk locahost yang satu untuk online? Apakah begitu? Ternyata tidak perlu. Ada satu fitur di POSTMAN yang bernama &lt;strong&gt;Environment&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;fitur-environment&#34;&gt;Fitur Environment&lt;/h3&gt;
&lt;p&gt;Fitur Environment ini dapat kita gunakan untuk &lt;strong&gt;membuat variabel&lt;/strong&gt; dengan nilai yang berbeda &lt;strong&gt;sesuai dengan lingkungan (environment)&lt;/strong&gt; yang ingin diuji coba. &lt;strong&gt;Manfaatnya&lt;/strong&gt;, kita tidak repot lagi mengganti-ganti URL atau nilai-nilai apapun untuk menguji API endpoint yang ada di localhost dan server online.&lt;/p&gt;
&lt;h3 id=&#34;membuat-environment-variable&#34;&gt;Membuat Environment Variable&lt;/h3&gt;
&lt;p&gt;Langsung saja, misal kita perlu uji coba project &lt;a href=&#34;https://github.com/nafiesl/dompet&#34;&gt;&lt;strong&gt;Dompet&lt;/strong&gt;&lt;/a&gt; pada dua lingkungan server, localhost dan server online. Maka kita membuat dua environment :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;dompet-local&lt;/strong&gt;, yaitu environment untuk mencoba API di localhost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dompet-staging&lt;/strong&gt;, yaitu environment untuk mencoba API di server staging (atau server demo).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dari dua environment itu, kita akan membuat variabel dan nilai sesuai dengan pengaturan masing-masing server. Caranya :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-05-31-mengatur-environment-variables-pada-postman-01.jpg&#34; alt=&#34;POSTMAN Environment&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Klik &lt;strong&gt;tombol elips&lt;/strong&gt; disamping environment, lalu klik &lt;strong&gt;Add&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Isi &lt;strong&gt;nama environment&lt;/strong&gt; (misal: &lt;code&gt;dompet-local&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Isi nama &lt;strong&gt;variabel&lt;/strong&gt; dan &lt;strong&gt;nilainya&lt;/strong&gt; (misal: &lt;code&gt;base_url&lt;/code&gt; = &lt;code&gt;http://localhost/lv/2018/dompet/public&lt;/code&gt;)
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-05-31-mengatur-environment-variables-pada-postman-02.jpg&#34; alt=&#34;Create Environment&#34;&gt;&lt;/li&gt;
&lt;li&gt;Tambah nama variable dan nilainya sesuai kebutuhan&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Add&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Environment pertama (&lt;code&gt;dompet-local&lt;/code&gt;) sudah jadi
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-05-31-mengatur-environment-variables-pada-postman-03.jpg&#34; alt=&#34;Created Environment&#34;&gt;&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Add&lt;/strong&gt; (jika masih berada pada tampilan Manage Environments)&lt;/li&gt;
&lt;li&gt;Ulangi langkah dari nomor 2 sampai 5 untuk environment kedua
&lt;ul&gt;
&lt;li&gt;nama environment = &lt;code&gt;dompet-staging&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;variabel &lt;code&gt;base_url&lt;/code&gt; = &lt;code&gt;http://dompet.nafies.id&lt;/code&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-05-31-mengatur-environment-variables-pada-postman-04.jpg&#34; alt=&#34;Create second Environment&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Environment kedua (&lt;code&gt;dompet-staging&lt;/code&gt;) sudah jadi
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-05-31-mengatur-environment-variables-pada-postman-05.jpg&#34; alt=&#34;Created second Environment&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;mengunakan-environment-variable&#34;&gt;Mengunakan Environment Variable&lt;/h3&gt;
&lt;p&gt;Untuk menggunakan environment variable yang sudah kita atur tadi, masukkan nama variabel dengan kode &lt;strong&gt;{% raw&amp;quot; &amp;gt;}}{{nama_variabel}}{% endraw&amp;quot; &amp;gt;}}&lt;/strong&gt;, contoh:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Untuk menggunakan variabel &lt;strong&gt;base_url&lt;/strong&gt; pada endpoint URL, kita tambahkan variabel seperti ini&lt;br&gt;
&lt;code&gt;{% raw&amp;quot; &amp;gt;}}{{base_url}}/api/transactions{% endraw&amp;quot; &amp;gt;}}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pilih Environment yang kita ingin gunakan.&lt;/li&gt;
&lt;li&gt;Untuk menggunakan variabel pada Request Header dan Request Body, caranya juga sama.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-05-31-mengatur-environment-variables-pada-postman-06.jpg&#34; alt=&#34;Using POSTMAN Environment&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Dengan bantuan fitur environment ini kita lebih mudah untuk menguji endpoint-endpoint yang ada pada aplikasi yang kita buat di beberapa lingkungan server yang berbeda.&lt;/li&gt;
&lt;li&gt;Tidak ada batasan jumlah environment, sehingga kita bisa membuat sesuai kebutuhan, misalnya:
&lt;ul&gt;
&lt;li&gt;dompet-local (untuk development di locahost)&lt;/li&gt;
&lt;li&gt;dompet-staging (untuk ujicoba pra-produksi)&lt;/li&gt;
&lt;li&gt;dompet-production (untuk server produksi)&lt;/li&gt;
&lt;li&gt;dompet-demo (untuk server demo)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demikian cara mengatur environment variable pada aplikasi POSTMAN, terima kasih.&lt;/p&gt;
&lt;h5 id=&#34;referensi-bacaan&#34;&gt;Referensi Bacaan&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;&#34;&gt;http://blog.getpostman.com/2014/02/20/using-variables-inside-postman-and-collection-runner&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Mempersiapkan Calon Project untuk Calon Klien Baru</title>
       <link>https://blog.inweeks.com/freelancing/mempersiapkan-calon-project-untuk-calon-klien-baru/</link>
       <pubDate>Sun, 27 May 2018 10:40:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/mempersiapkan-calon-project-untuk-calon-klien-baru/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Ketika ada orang yang menghubungi untuk diskusi tentang rencana atau konsepnya sebuah project pembuatan web, tentu ini hal yang menyenangkan. Karena ada potensi ini menjadi pekerjaan, artinya potensi rejeki baru. Maklum, karena sebagai freelancer, saya bekerja dari satu project ke project yang lain, seperti yang sempat dibahas di &lt;a href=&#34;https://blog.inweeks.com/freelancing/apakah-fulltime-freelancer-itu/#apakah-berarti-pekerjaan-saya-mengerjakan-web-lalu-dibayar-lalu-selesai-begitu&#34;&gt;artikel sebelumnya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nah, bagaimana cara yang saya terapkan untuk &lt;strong&gt;memperbesar kemungkinan&lt;/strong&gt; agar calon klien ini &lt;strong&gt;mempercayakan pekerjaan kepada saya&lt;/strong&gt;? Di artikel ini kita akan bahas beberapa tahap yang biasa saya lakukan untuk mem-follow up seorang calon klien :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tahap Kontak Awal&lt;/li&gt;
&lt;li&gt;Tahap sebelum Bertemu Calon Klien&lt;/li&gt;
&lt;li&gt;Tahap Pertemuan dengan Calon klien&lt;/li&gt;
&lt;li&gt;Tahap Setelah Pertemuan dengan Calon Klien&lt;/li&gt;
&lt;li&gt;Proses Pengajuan Anggaran Project&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sebagai catatan, hal-hal yang kita bahas di sini adalah untuk jenis pekerjaan freelance web developer. Untuk pekerjaan freelance jenis lainnya mungkin sedikit berbeda.&lt;/p&gt;
&lt;p&gt;Baik kita bahas satu persatu.&lt;/p&gt;
&lt;h3 id=&#34;1-tahap-kontak-awal&#34;&gt;1. Tahap Kontak Awal&lt;/h3&gt;
&lt;p&gt;Ini adalah pada saat kita dihubungi oleh calon klien, baik melalui telepon atau chat, di mana beliau menyampaikan secara umum tentang project yang beliau rencakankan. Biasanya tahap ini hanya berupa diskusi singkat 10-15 menit. Pada saat ini, yang saya biasa lakukan adalah :&lt;/p&gt;
&lt;h5 id=&#34;mencatat-point-pembiacaraan&#34;&gt;Mencatat point pembiacaraan&lt;/h5&gt;
&lt;p&gt;Buat catatan, baik ditulis tangan, atau notepad di PC/Laptop, terkait point-point pembicaraan saat diskusi singkat ini. Catat yang menurut kita penting untuk diketahui lebih lanjut ketika bertemu dengan beliau.&lt;/p&gt;
&lt;h5 id=&#34;ajak-bertemu-untuk-diskusi-lebih-detail&#34;&gt;Ajak bertemu untuk diskusi lebih detail&lt;/h5&gt;
&lt;p&gt;Yap, tentu saja tidak cukup berbicara di telepon atau chat. Buat janji dengan calon klien bertemu untuk pembicaraan lebih detail. Agar kita memahami lebih dalam tentang konsep dan rencana projectnya.&lt;/p&gt;
&lt;h3 id=&#34;2-tahap-sebelum-bertemu-calon-klien&#34;&gt;2. Tahap sebelum Bertemu Calon Klien&lt;/h3&gt;
&lt;p&gt;Setelah selesai diskusi singkat tadi, kita lakukan beberapa hal berikut &lt;strong&gt;sebagai bekal&lt;/strong&gt; atau persiapan bertemu dengan calon klien.&lt;/p&gt;
&lt;h5 id=&#34;cari-informasi-seputar-topik-project&#34;&gt;Cari informasi seputar topik project&lt;/h5&gt;
&lt;p&gt;Misalnya ada klien dari perusahaan rental kendaraan minta buatkan software transaksi sewa dan pengelolaan kendaraan. Nah kita bisa &amp;ldquo;googling&amp;rdquo; dulu seputar software manajemen rental kendaraan. Tidak usah banyak-banyak, setidaknya kita tahu sedikit seputar topik itu, jadi tidak &amp;ldquo;blank&amp;rdquo; ketika diskusi dengan klien.&lt;/p&gt;
&lt;p&gt;Atau jika klien sudah punya website profil perusahaan, bisa lihat-lihat sekilas di sana.&lt;/p&gt;
&lt;p&gt;Kenapa mesti mencari informasi ini? Karena beberapa project yang datang, umumnya berupa hal baru yang belum pernah kita kerjakan sebelumnya. Akan menjadi &lt;strong&gt;nilai plus&lt;/strong&gt; di mata calon klien, jika kita mengetahui seputar topik project yang akan dikerjakan (setidaknya pengetahuan secara umum saja).&lt;/p&gt;
&lt;h5 id=&#34;buat-list-pertanyaan-seputar-project&#34;&gt;Buat list pertanyaan seputar project&lt;/h5&gt;
&lt;p&gt;Setelah kita punya catatan kecil dari hasil diskusi awal dan sudah mencari informasi seputar topik project tersebut, pasti akan muncul pertanyaan-pertanyaan untuk menggali informasi lebih detail. Kita buat list pertanyaan tertulis juga, beberapa misalnya :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Apa tujuan dan manfaat software ini untuk perusahaan?&lt;/li&gt;
&lt;li&gt;Apa kendala-kendala yang dihadapi saat ini (sehingga membutuhkan bantuan software)?&lt;/li&gt;
&lt;li&gt;Alat bantu apa saja yang digunakan saat ini? (Boleh jadi ada software yang sudah digunakan, tetapi dinilai belum maksimal).&lt;/li&gt;
&lt;li&gt;Bagaimana proses bisnis yang berjalan di perusahaan ini (dari awal hingga selesai)?&lt;/li&gt;
&lt;li&gt;Siapa saja (tipe user) yang akan menggunakan software nanti?&lt;/li&gt;
&lt;li&gt;Apa saja hak akses masing-masing jenis user?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Itu list pertanyaan yang biasanya saya siapkan sebelum bertemu calon klien. Dari 6 pertanyaan tersebut akan berkembang ke pertanyaan lain agar kita mendapat info lebih detail.&lt;/p&gt;
&lt;h3 id=&#34;3-tahap-pertemuan-dengan-calon-klien&#34;&gt;3. Tahap Pertemuan dengan Calon klien&lt;/h3&gt;
&lt;p&gt;Oke dari persiapan di atas, saatnya kita bertemu dengan klien.&lt;/p&gt;
&lt;h5 id=&#34;datang-ontime&#34;&gt;DATANG ONTIME&lt;/h5&gt;
&lt;p&gt;Nah, maaf ini hurufnya saya kapital semua, &lt;strong&gt;DATANG ONTIME&lt;/strong&gt;. Misal janjian bertemu hari Senin jam 10.00. Maka kita harus datang tepat waktu, selambatnya 5 menit sebelum waktu yang dijanjikan. Kenapa penting? Karena ini adalah &lt;strong&gt;kesan pertama&lt;/strong&gt; antara kita dan klien. Ada 2 hal yang penting di sini :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Klien melihat &lt;strong&gt;keseriusan kita&lt;/strong&gt; dalam hal waktu.&lt;/li&gt;
&lt;li&gt;Kita juga melihat &lt;strong&gt;keseriusan klien&lt;/strong&gt; dalam hal waktu.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jika &lt;strong&gt;kita&lt;/strong&gt; yang terlambat, klien &lt;strong&gt;bisa menilai&lt;/strong&gt; mungkin nanti &lt;strong&gt;progress kerja&lt;/strong&gt; kita juga akan terlambat. Sebaliknya, jika &lt;strong&gt;klien&lt;/strong&gt; yang terlambat, kita &lt;strong&gt;bisa menilai&lt;/strong&gt; mungkin nanti &lt;strong&gt;pembayaran&lt;/strong&gt; juga bisa terlambat.&lt;/p&gt;
&lt;p&gt;Walaupun ini tidak selalu dan bukan penilaian yang obyektif (namanya juga &amp;ldquo;mungkin&amp;rdquo;), tetapi ada kecenderungan itu akan terjadi. Itu sih pengalaman saya, hehe&amp;hellip;&lt;/p&gt;
&lt;h5 id=&#34;saat-diskusi-dengan-calon-klien&#34;&gt;Saat Diskusi dengan Calon Klien&lt;/h5&gt;
&lt;p&gt;Ketika bertemu dan mulai diskusi, biasanya saya lakukan hal-hal berikut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catat&lt;/strong&gt; hal-hal yang menurut klien penting (manfaat yang diharapkan dan kesulitan yang terjadi saat ini).&lt;/li&gt;
&lt;li&gt;Pastikan &lt;strong&gt;daftar pertanyaan&lt;/strong&gt; yang sudah dibuat tadi terjawab semuanya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minta contoh&lt;/strong&gt; formulir yang saat ini digunakan.&lt;/li&gt;
&lt;li&gt;Minta contoh laporan yang saat ini digunakan dan bagaimana &lt;strong&gt;laporan yang diharapkan&lt;/strong&gt; pada software nantinya.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;tips-saat-diskusi&#34;&gt;Tips Saat Diskusi&lt;/h5&gt;
&lt;p&gt;Sedikit tips untuk agar diskusi berjalan lancar :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Silent handphone (agar tidak mengganggu ada yang berbicara).&lt;/li&gt;
&lt;li&gt;Bicara dengan sopan.&lt;/li&gt;
&lt;li&gt;Hindari istilah-istilah teknis yang sulit dihapami klien (tidak perlu terlihat intelek).&lt;/li&gt;
&lt;li&gt;Perhatikan dengan serius ketika klien berbicara/bercerita (usahakan tidak memotong pembicaraan).&lt;/li&gt;
&lt;li&gt;Ukur kemampuan kita terhadap permintaan klien.&lt;/li&gt;
&lt;li&gt;Jangan malu menyampaikan &amp;ldquo;saya belum bisa&amp;rdquo; jika memang skill/ilmu kita belum cukup. Klien lebih senang dengan kejujuran daripada kepintaran kita.&lt;/li&gt;
&lt;li&gt;Jangan menjanjikan hal-hal yang tidak bisa kita penuhi (tentang item pekerjaan dan waktu).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;selesai-diskusi&#34;&gt;Selesai Diskusi&lt;/h5&gt;
&lt;p&gt;Biasanya selesai diskusi, calon klien itu bertanya kisaran biaya dan waktu pengerjaan project. Saran saya :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Sampaikan bahwa &lt;strong&gt;anggaran/biaya dan waktu&lt;/strong&gt; diajukan setelah analisis kebutuhan sistem.&lt;br&gt;
Jangan sebutkan anggaran/biaya pada pertemuan pertama (apalagi deal, jangan). Karena kita di pertemuan awal ini, &lt;strong&gt;kita belum tahu persis apa saja yang mesti dikerjakan nanti&lt;/strong&gt;. Mungkin bagi freelancer profesional, atau sudah punya jam terbang tinggi memang langsung bisa estimasi biaya. Kalau saya pribadi belum bisa. Takut salah hitung. :)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minta waktu untuk analisis requirement.&lt;br&gt;
Yap, kita butuh waktu untuk menganalisis kebutuhan klien ini, terutama jika proses bisnis yang akan dibuat ini lumayan panjang. Kalau saya biasanya setidaknya perlu waktu 1 minggu, maksimal 2 minggu. Kalau lebih dari 2 minggu terlalu lama klien menunggu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;4-tahap-setelah-pertemuan-dengan-calon-klien&#34;&gt;4. Tahap Setelah Pertemuan dengan Calon Klien&lt;/h3&gt;
&lt;p&gt;Oke, setelah diberi waktu untuk analisis kebutuhan project, kita manfaatkan untuk membuat &lt;strong&gt;konsep secara tertulis&lt;/strong&gt;. Bagaimana bentuknya, ini agak panjang pembahasannya, insyaallah kita akan bahas pada &lt;a href=&#34;https://blog.inweeks.com/freelancing/contoh-penulisan-konsep-project-sistem-untuk-klien/&#34;&gt;artikel lain&lt;/a&gt;. Tetapi secara umum, ini yang biasa saya lakukan untuk menindak lanjuti hasil pertemuan tadi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buat &lt;strong&gt;rangkuman diskusi/konsep&lt;/strong&gt; secara tertulis dari hasil pertemuan pertama.&lt;/li&gt;
&lt;li&gt;Kirim rangkuman diskusi kepada klien untuk di-review.&lt;/li&gt;
&lt;li&gt;Minta tanggapan atau koreksi dari klien jika rangkuman diskusi tersebut ada yang keliru.&lt;br&gt;
Bisa saja kita &lt;strong&gt;salah memahami&lt;/strong&gt; cerita dari klien, bisa juga ada yang ditambahkan oleh klien karena &lt;strong&gt;lupa disampaikan&lt;/strong&gt; waktu pertemuan pertama.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Rangkuman diskusi/konsep&lt;/strong&gt; itu, harus sesuai dengan rencana/harapan klien. Karena itu akan menjadi acuan kita dalam membuat list item pekerjaan dan pengajuan anggaran biaya project. Artinya konsep itu harus disepakati bersama (antara kita dan klien).&lt;/p&gt;
&lt;p&gt;Untuk &lt;strong&gt;memastikan konsep&lt;/strong&gt; ini benar, biasanya saya lakukan pertemuan kedua atau ketiga dengan klien, sampai konsep pas dengan keinginan klien dan disepakat bersama.&lt;/p&gt;
&lt;p&gt;Perlu diingat, konsep disepakati, belum tentu pengajuan biaya juga disepakati.&lt;/p&gt;
&lt;h3 id=&#34;5-proses-pengajuan-anggaran-project&#34;&gt;5. Proses Pengajuan Anggaran Project&lt;/h3&gt;
&lt;p&gt;Setelah konsep jadi, selanjutnya bagaimana? Ini beberapa hal yang biasa saya lakukan:&lt;/p&gt;
&lt;h5 id=&#34;buat-list-fituritem-pekerjaan&#34;&gt;Buat list fitur/item pekerjaan&lt;/h5&gt;
&lt;p&gt;List fitur atau item pekerjaan ini adalah item-item yang akan dikerjakan dalam pengembangan software sesuai dengan konsep tadi. List fitur ini yang akan dibuat pengajuan biaya.&lt;/p&gt;
&lt;p&gt;Kok perlu buat list fitur lagi? Bukanya sudah buat konsep tertulis? Apakah konsep tertulis itu berbeda dengan fitur di softwarenya? Yap, tentu beda. Konsep tertulis yang disepakati tadi &lt;strong&gt;itu baru konsepnya&lt;/strong&gt;, sedangkan list fitur itu adalah &lt;strong&gt;item-item yang akan kita kerjakan&lt;/strong&gt; atau kita develop untuk software.&lt;/p&gt;
&lt;h5 id=&#34;pengajuan-anggaran-biaya-dan-waktu-berdasarkan-fiturlist-pekerjaan&#34;&gt;Pengajuan anggaran biaya dan waktu berdasarkan fitur/list pekerjaan&lt;/h5&gt;
&lt;p&gt;Dari list fitur atau item pekerjaan ini, kita membuat pengajuan biaya berdasarkan tingkat kesulitan fitur aplikasi yang dibuat. Jika pekerjaannya rumit biayanya tinggi, sebaliknya, jika pekerjaan ringan, biayanya juga ringan.&lt;/p&gt;
&lt;p&gt;Ini misalnya, ada 6 fitur/item pekerjaan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fitur autentikasi Rp. 500.000&lt;/li&gt;
&lt;li&gt;Fitur entry data Rp. 700.000&lt;/li&gt;
&lt;li&gt;Fitur proses data dari A ke C Rp. 300.000&lt;/li&gt;
&lt;li&gt;Fitur proses data dari C ke E Rp. 1.000.000&lt;/li&gt;
&lt;li&gt;Fitur manajemen user Rp. 300.000&lt;/li&gt;
&lt;li&gt;Fitur report/laporan Rp. 1.200.000&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Total: Rp. 4.000.000.&lt;/p&gt;
&lt;p&gt;Jadi nanti &lt;strong&gt;total biaya project&lt;/strong&gt; itu berdasarkan jumlah fitur dan tingkat kerumitannya masing-masing. Dengan cara ini, ketika calon klien disodorkan pengajuan Rp. 4.000.000, &lt;strong&gt;beliau jadi tahu apa saja yang akan didapatkan dari nilai itu&lt;/strong&gt;. Sehingga pengajuan anggaran biaya dari kita akan &lt;strong&gt;masuk akal bagi calon klien&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dari list pengerjaan dan biaya itu kita dapat &lt;strong&gt;mengukur berapa lama&lt;/strong&gt; project ini akan dikerjakan. Mungkin kita perlu bahas lebih detail tentang penyusunan anggaran dan waktu pada artikel tersendiri, karena agak panjang.&lt;/p&gt;
&lt;h5 id=&#34;diskon-harga-minim&#34;&gt;Diskon Harga Minim&lt;/h5&gt;
&lt;p&gt;Karena kita sudah membuat rincian item pekerjaan sesuai konsep yang disepakati sebelumnya, maka minim kemungkinan klien menawar/meminta diskon yang tinggi (misal sampai 50%). Kalaupun ada permintaan diskon, kita bisa pertahankan maksimal 10% dari biaya pengajuan.&lt;/p&gt;
&lt;h5 id=&#34;deal-or-cancel&#34;&gt;Deal or Cancel&lt;/h5&gt;
&lt;p&gt;Baik, setelah proses yang panjang untuk diskusi, membuat konsep dan anggaran untuk project, kita akan sampai pada titik kesepakatan dengan calon klien ini.&lt;/p&gt;
&lt;p&gt;Selama saya menerapkan cara ini dalam mempersiapkan project, kemungkinan yang besar hanya ada dua, yaitu : &lt;strong&gt;Sepakat&lt;/strong&gt; atau &lt;strong&gt;Batal&lt;/strong&gt;. Kalaupun ada diskon, alhamdulillah diskon yang disepakati tidak lebih dari 10% dari pengajuan.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Baiklah, kita simpulkan pembahasan kita tentang &amp;ldquo;Mempersiapkan Calon Project untuk Calon Klien Baru&amp;rdquo; ini.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cara kita&lt;/strong&gt; melayani saat mempersiapkan project akan menjadi point besar bagi klien untuk mempertimbangkan, apakah memberikan pekerjaan kepada kita atau tidak.&lt;/li&gt;
&lt;li&gt;Klien &lt;strong&gt;menilai kita serius&lt;/strong&gt; dalam bekerja jika kita tepat waktu dalam berjanji, dan membuat konsep tertulis untuk project beliau.&lt;/li&gt;
&lt;li&gt;Kita juga bisa menilai &lt;strong&gt;keseriusan klien&lt;/strong&gt;, selama proses persiapan project ini.&lt;/li&gt;
&lt;li&gt;Sangat penting bagi programmer &lt;strong&gt;membuat list pekerjaan tertulis&lt;/strong&gt; untuk disepakati bersama dengan klien. Ini untuk minimalisir perubahan kebijakan saat project berjalan dan minimalisir revisi (setelah project selesai) yang lumayan menyita waktu dan pikiran.&lt;/li&gt;
&lt;li&gt;List pekerjaan tertulis akan &lt;strong&gt;mengamankan&lt;/strong&gt; seorang programmer dalam batasan &lt;strong&gt;hak dan tanggung jawab&lt;/strong&gt; yang harus dipenuhi, sehingga dapat bekerja fokus dan terencana.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nilai project&lt;/strong&gt; yang kita ajukan lengkap dengan rincian item pekerjaan akan mendapat penilaian yang berbeda dibandingkan nilai project yang diajukan tanpa rincian yang jelas.&lt;/li&gt;
&lt;li&gt;Dengan ini kita belajar profesional dalam bekerja.&lt;/li&gt;
&lt;li&gt;Urutan persiapan project :&lt;br&gt;
&lt;strong&gt;Konsep&lt;/strong&gt; &amp;ndash;&amp;gt; &lt;strong&gt;List Item Pekerjaan&lt;/strong&gt; &amp;ndash;&amp;gt; &lt;strong&gt;Pengajuan Biaya&lt;/strong&gt; &amp;ndash;&amp;gt; &lt;strong&gt;Pengajuan Waktu&lt;/strong&gt; &amp;ndash;&amp;gt; &lt;strong&gt;Deal&lt;/strong&gt; atau &lt;strong&gt;Batal&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Urutan persiapan project yang saya terapkan memang panjang, perlu waktu dan pikiran, tetapi manfaatnya juga besar untuk menghasil pelayanan lebih baik, insyaallah menjadikan testimoni yang baik dan menjadi sarana promosi yang efektif.&lt;/p&gt;
&lt;p&gt;Tapi mungkin ada pertanyaan di benak teman-teman, kalau sudah mempersiapkan project sedemikan rupa, &lt;strong&gt;ternyata batal bagaimana?&lt;/strong&gt; Nah ini menarik, insyaallah akan kita bahas di artikel lainnya. Semoga teman-teman tidak bosan membaca blog saya.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Kelebihan dan Konsekuensi Kerja Fulltime Freelance</title>
       <link>https://blog.inweeks.com/freelancing/kelebihan-dan-konsekuensi-kerja-fulltime-freelancer/</link>
       <pubDate>Tue, 08 May 2018 00:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/kelebihan-dan-konsekuensi-kerja-fulltime-freelancer/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ketika ada orang yang bertanya kepada saya :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Mas kerja di mana?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Saya jawab &amp;ldquo;Saya kerja dirumah pak.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Ditanya lagi &amp;ldquo;Wah kerja apa dirumah?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Saya jawab lagi &amp;ldquo;Saya buat web dan program komputer pak. Saya programmer, freelance, pak.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Terus kata bapaknya. &amp;ldquo;Wah freelance ya, kerja dirumah, enak bisa santai ngatur waktu sendiri, ga kena macet dan hujan panas di jalanan.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Saya jawab &amp;ldquo;Iya pak, alhamdulillah. Bisa bantu isteri ke pasar dan ngangkat jemuran.&amp;rdquo;&lt;br&gt;
Kemudian diskusi bisa berlanjut pendek atau panjang sesuai rasa penasaran Bapaknya.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kebanyakan pada diskusi seperti itu, orang melihat seorang fulltime freelancer sebagai pekerjaan yang enak, pekerjaan yang diharapkan oleh semua orang.&lt;/p&gt;
&lt;p&gt;Nah kali ini saya akan coba &lt;em&gt;&amp;ldquo;nge-list&amp;rdquo;&lt;/em&gt; kelebihan dan konsekuensi jika kita bekerja freelance secara fulltime. Supaya teman-teman pembaca ada gambaran enaknya apa, dan konsekuensinya apa.&lt;/p&gt;
&lt;p&gt;Di sini yang akan kita bahas adalah pekerjaan &lt;strong&gt;Freelance Web Developer&lt;/strong&gt; yang saya jalani, mungkin ada beberapa perbedaan dengan jenis pekerjaan freelance lainnya. Mudah-mudahan perbedaannya tidak terlalu jauh.&lt;/p&gt;
&lt;h3 id=&#34;kelebihan-freelance-fulltime&#34;&gt;Kelebihan Freelance Fulltime&lt;/h3&gt;
&lt;h5 id=&#34;1-kebebasan-mengelola-waktu-kerja&#34;&gt;1. Kebebasan mengelola waktu kerja&lt;/h5&gt;
&lt;p&gt;Ya, keuntungan utama nya adalah, kita &amp;ldquo;bebas&amp;rdquo; mengelola waktu kerja. Kapan mau kerja, kapan mau istirahat, kapan mau piknik, kita yang atur sendiri.&lt;/p&gt;
&lt;p&gt;Tetapi perlu diingat, &amp;ldquo;bebas&amp;rdquo; disini bukan berarti jam kerja tidak teratur, suka-suka, kerja kapan mau dan kapan malas, bukan begitu. Waktu kerja itu harus dikelola, harus ada target progress, setidaknya kita ada perencanaan progress per minggu untuk setiap project yang dikerjakan, dan itu harus konsisten.&lt;/p&gt;
&lt;p&gt;Pekerjaan seperti ini membuat dan mengharuskan kita mengelola waktu dengan baik, agar semua pekerjaan terlaksana sesuai rencana. Ada dua hal yang minimal kita terapkan dalam bekerja freelance :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Waktu kerja harian&lt;/strong&gt;, setiap hari kita bekerja dari jam berapa sampai jam berapa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perencanaan/target progress per minggu&lt;/strong&gt;, dalam mengerjakan project, kita harus punya target, setidaknya perminggu, pekerjaan bisa selesai on target atau bahkan lebih cepat dari target.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Insyaallah tentang pengelolaan waktu kerja, kita bisa bahas di artikel tersendiri nanti.&lt;/p&gt;
&lt;h5 id=&#34;2-dapat-bekerja-di-mana-saja&#34;&gt;2. Dapat bekerja di mana saja&lt;/h5&gt;
&lt;p&gt;Pekerjaan seperti ini (fulltime freelancer) &lt;strong&gt;tidak mengharuskan kita bekerja di satu tempat&lt;/strong&gt; yang tetap, bisa dirumah, di cafe (kata orang-orang), sewa tempat seperti co-working space, atau di mana saja selama bisa membuat kita fokus kerja dan terhubung internet.&lt;/p&gt;
&lt;p&gt;Tetapi walaupun bebas kerja di mana saja, sebaiknya ada &lt;strong&gt;tempat kerja yang pasti&lt;/strong&gt;. Misalnya di pojokan rumah kita punya meja kerja, atau ada kamar kerja sendiri. Jadi walaupun kita bisa kerja di mana saja, kita ada tempat kerja yang tetap.&lt;/p&gt;
&lt;p&gt;Saran dari saya, &lt;strong&gt;buat tempat kerja senyaman mungkin&lt;/strong&gt;. Atur tinggi meja yang pas. Jika ada rejeki yang cukup, beli kursi yang nyaman dan empuk, ada senderannya, seperti kursi direktur itu. Saya sendiri malah potong kaki meja agar tingginya pas dengan tempat duduk (istilah kerennya dibikin &amp;ldquo;ergonomis&amp;rdquo;). Intinya untuk membuat kita nyaman saat kerja, karena sebagian besar waktu kita seharian duduk di situ. :)&lt;/p&gt;
&lt;h5 id=&#34;3-membangun-hubungan-dengan-klien&#34;&gt;3. Membangun hubungan dengan klien&lt;/h5&gt;
&lt;p&gt;Pekerjaan Freelancer umumnya berhubungan langsung dengan klien (pemilik project). Ada banyak pengalaman positif yang kita dapatkan jika terhubung langsung dengan klien :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mengetahui ide-ide baru, atau ide lama dengan konsep baru.&lt;/li&gt;
&lt;li&gt;Mengetahui lebih jelas, tujuan dan manfaat project yang akan dikerjakan.&lt;/li&gt;
&lt;li&gt;Melatih untuk komunikasi profesional, bekerja profesional, karena kita pasti dinilai langsung oleh klien.&lt;/li&gt;
&lt;li&gt;Kemungkinan kerjasama jangka panjang.&lt;/li&gt;
&lt;li&gt;Tahu karakter klien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi manfaat dari hubungan langsung dengan klien, kita tahu persis karakter orang yang memberi kita pekerjaan, dan klien juga tahu persis karakter orang yang membantu projectnya.&lt;/p&gt;
&lt;p&gt;Perlu diingat, ini akan menjadi testimoni dari klien untuk kita, &lt;strong&gt;hubungan yang baik&lt;/strong&gt; membuahkan &lt;strong&gt;hasil yang baik&lt;/strong&gt;, &lt;strong&gt;hubungan kurang baik&lt;/strong&gt; membuahkan &lt;strong&gt;hasil yang kurang baik&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bagaimana cara membangun hubungan yang baik dengan klien? Insyaallah akan kita bahas pada artikel tersendiri.&lt;/p&gt;
&lt;h5 id=&#34;4-dapat-memilih-pekerjaan&#34;&gt;4. Dapat memilih pekerjaan&lt;/h5&gt;
&lt;p&gt;Wah, &amp;ldquo;memilih pekerjaan?&amp;rdquo; Kedengarannya sedap ini. Yap, artinya kita misa memilih (menyanggupi) pekerjaan sesuai keinginan dan kemampuan kita. Ketika ada project yang telah kita diskusikan dengan klien, biasanya saya mempertimbangkan :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apakah sesuai dengan &lt;strong&gt;kemampuan/skill&lt;/strong&gt; yang saya miliki?&lt;/li&gt;
&lt;li&gt;Apakah sesuai dengan kemampuan &lt;strong&gt;jadwal&lt;/strong&gt; dan memenuhi &lt;strong&gt;target deadline&lt;/strong&gt; klien?&lt;/li&gt;
&lt;li&gt;Apakah sesuai dengan &lt;strong&gt;anggaran biaya&lt;/strong&gt; klien?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Di sini kita berhak menentukan apakah kita &lt;strong&gt;lanjut atau tidak&lt;/strong&gt; untuk mengerjakan project itu.&lt;/p&gt;
&lt;h5 id=&#34;5-melatih-attitude-sebagai-business-owner&#34;&gt;5. Melatih attitude sebagai “business owner”&lt;/h5&gt;
&lt;p&gt;Sama seperti pemilik usaha, sebagai freelancer kita &lt;strong&gt;berperan sebagai pemilik bisnis&lt;/strong&gt;. Sehingga attitude atau &lt;strong&gt;prilaku&lt;/strong&gt; kita harus sesuai &lt;strong&gt;selayaknya pemilik usaha&lt;/strong&gt;. Siapapun yang berhubungan dengan kita, akan menilai kita.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attitude kita dalam bekerja dan hubungan dengan klien akan kembali kepada kita.&lt;/li&gt;
&lt;li&gt;Hal-hal yang positif dan negatif kembali kepada kita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attitude yang baik&lt;/strong&gt; akan menghasilkan &lt;strong&gt;testimoni yang baik&lt;/strong&gt;, juga sebaliknya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portfolio&lt;/strong&gt; dan &lt;strong&gt;testimoni&lt;/strong&gt; adalah hal yang penting untuk modal marketing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nasib dari bisnis&lt;/strong&gt; dan pekerjaan kita akan &lt;strong&gt;ditentukan oleh attitude&lt;/strong&gt; cara kita bekerja.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pekerjaan ini  juga melatih kita agar &lt;strong&gt;bertanggung jawab secara menyeluruh&lt;/strong&gt;. Tanggung jawab memang konsekuensi dari semua jenis pekerjaan, tatapi sebagai freelancer, seluruh project menjadi tanggung jawab kita, diantaranya :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrasi Project (pengelolaan email, bukti pembayaran, bukti diskusi).&lt;/li&gt;
&lt;li&gt;Mengerjakan progress pekerjaan.&lt;/li&gt;
&lt;li&gt;Laporan Progress.&lt;/li&gt;
&lt;li&gt;Penyelesaian pekerjaan.&lt;/li&gt;
&lt;li&gt;Problem-problem dalam project.&lt;/li&gt;
&lt;li&gt;Data-data penting/rahasia milik klien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Semua jadi tanggung jawab kita. Ini menjadi &lt;strong&gt;latihan soft-skill&lt;/strong&gt; yang sangat bagus untuk kita. Sekali lagi, &lt;strong&gt;nasib bisnis&lt;/strong&gt; akan &lt;strong&gt;ditentukan oleh attitude&lt;/strong&gt; cara kita bekerja. :)&lt;/p&gt;
&lt;h5 id=&#34;6-kesempatan-ruang-dan-waktu-untuk-berkembang-terbuka-lebar&#34;&gt;6. Kesempatan, ruang dan waktu untuk berkembang terbuka lebar&lt;/h5&gt;
&lt;p&gt;Nah karena kita bekerja sendiri, &lt;strong&gt;tidak ada yang mengatur “kapan kita ngapain”&lt;/strong&gt;. Mau berkembang atau tetap begitu-begitu saja, itu tergantung kemauan diri sendiri.&lt;/p&gt;
&lt;p&gt;Kita bisa mengatur jadwal agar bisa mempelajari hal-hal yang baru. Saya biasa mengatur waktu untuk belajar hal baru, terutama hal-hal yang &lt;strong&gt;menurut saya penting&lt;/strong&gt; untuk produktifitas kerja ke depan.&lt;/p&gt;
&lt;p&gt;Tetapi perlu diingat, &lt;strong&gt;jangan jadikan klien sebagai “kelinci percobaan”&lt;/strong&gt;. Misalnya kita baru belajar suatu bahasa pemrograman atau teknologi yang sedang &amp;ldquo;trend&amp;rdquo;, jangan langsung digunakan untuk project klien. Pastikan dulu &lt;strong&gt;teknologi itu efisien untuk project tersebut&lt;/strong&gt;, baik dari sisi waktu pengerjaan, dan kemungkinan problem di kemudian hari. Jika sudah yakin, silakan diterapkan. Jika belum, gunakan yang sudah kita punya.&lt;/p&gt;
&lt;h3 id=&#34;konsekuensi-freelance-fulltime&#34;&gt;Konsekuensi Freelance Fulltime&lt;/h3&gt;
&lt;h5 id=&#34;1-memulai-dengan-relatif-sulit&#34;&gt;1. Memulai dengan (relatif) sulit&lt;/h5&gt;
&lt;p&gt;Beberapa hal yang saya temui ketika memulai bekerja sebagai freelance web developer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Semua solusi harus diupayakan sendiri, tidak bisa mengandalkan orang lain karena ini pekerjaan kita. Ketika ada problem, cari solusinya sendiri, ini tanggung jawab kita. Karena itu kita harus memastikan bahwa kita memilik skill yang cukup untuk target pekerjaan kita.&lt;/li&gt;
&lt;li&gt;Setiap orang pasti pernah jadi “newbie”, karena kita belum ada pengalaman, belum tahu apa-apa tentang bekerja sendiri.&lt;/li&gt;
&lt;li&gt;Tidak sedikit project dengan bayaran (relatif) rendah, lihat point kedua di atas. :)&lt;/li&gt;
&lt;li&gt;Tidak setiap rencana akan berjalan sesuai target, terutama kali pertama. Lihat lagi point kedua, semua yang kita rencanakan bisa berantakan karena berbagai hal yang terjadi ketika project sedang dikerjakan.&lt;/li&gt;
&lt;li&gt;Di awal kita harus fokus mengumpulkan portfolio dan testimoni.&lt;br&gt;
&lt;strong&gt;Portfolio&lt;/strong&gt;, bisa dibilang, pekerjaan yang bisa kita banggakan untuk ditunjukkan kepada calon klien.&lt;br&gt;
&lt;strong&gt;Testimoni&lt;/strong&gt; adalah bagaimana perasaan klien setelah kita mengerjakan projectnya. Apakah senang, biasa saja, atau suram?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Memang semua dimulai dengan relatif sulit, tetapi dari situ kita belajar :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Oh, Supaya tidak kejadian begini, caranya harus begini.&lt;/li&gt;
&lt;li&gt;Oh, ternyata klien itu tidak suka kalau saya begini, berarti saya harus begitu.&lt;/li&gt;
&lt;li&gt;Oh, sepertinya harus pakai cara ini biar efisien nih.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cukup jelas ya? :D&lt;/p&gt;
&lt;h5 id=&#34;2-penghasilan-tidak-tetap&#34;&gt;2. Penghasilan tidak tetap&lt;/h5&gt;
&lt;p&gt;Pekerjaan fulltime frelancer adalah &lt;strong&gt;“based on demand”&lt;/strong&gt;. Ketika ada order, maka ada pekerjaan, dan ada pemasukan. Ketika tidak ada order, maka tidak ada pekerjaan, dan tidak ada pemasukan. Jadi &lt;strong&gt;tidak ada tanggal tetap&lt;/strong&gt; untuk gajian.&lt;/p&gt;
&lt;p&gt;Jumlah penghasilan juga tidak tetap, nilai project itu kadang relatif besar, kadang relatif kecil, tergantung yang disepakati.&lt;/p&gt;
&lt;p&gt;So, karena tidak ada slip gaji, jadinya sulit mengajukan kredit barang, hahaha..&lt;br&gt;
Mau ajukan kredit laptop tidak bisa, ajukan kredit motor tidak bisa. Mesti pintar nabung agar bisa beli barang dengan tunai.&lt;/p&gt;
&lt;p&gt;Yahh.. gitu lah.&lt;/p&gt;
&lt;h5 id=&#34;3-terkadang-menghadapi-klien-yang-sulit&#34;&gt;3. Terkadang menghadapi klien yang sulit&lt;/h5&gt;
&lt;p&gt;Klien yang sulit itu kriterianya (menurut saya) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tidak mau paham kondisi sulit (bukan tidak paham ya, tapi tidak mau).&lt;/li&gt;
&lt;li&gt;Suka menunda pembayaran.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Rajin&amp;rdquo; tanya progress.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tidak ada klien yang paket lengkap seperti itu, biasanya hanya salah satu saja per klien.&lt;/p&gt;
&lt;p&gt;Kenapa &amp;ldquo;rajin&amp;rdquo; tanya progress itu (menurut saya) termasuk klien yang sulit, karena setiap awal kerja, saya biasanya buat kesepakatan frekuensi laporan progress, misalnya per minggu atau per 3 hari. Nah, kategori ini adalah klien yang suka tanya progress sebelum waktunya. :)&lt;/p&gt;
&lt;p&gt;Bagaimanapun kondisinya, ketika sudah sepakat, kita harus konsekuen dengan kesepakatan. Sadari bahwa :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tidak semua hal berjalan sesuai rencana.&lt;/li&gt;
&lt;li&gt;Menjadi pelajaran dan modal kita pada project selanjutnya.&lt;/li&gt;
&lt;li&gt;Kita tetap bertanggung jawab hingga project selesai.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alhamdulillah sedikit sekali saya bekerja dengan klien yang sulit, karena sudah banyak dapat pelajaran sebelumnya. Sekali lagi kita sebagai freelancer berhak menentukan &amp;ldquo;lanjut&amp;rdquo; atau &amp;ldquo;tidak&amp;rdquo; untuk mengerjakan sebuah project. Silakan pertimbangkan sebelum menyanggupi pekerjaan. :)&lt;/p&gt;
&lt;h5 id=&#34;4-harus-menolak-pekerjaan-ketika-sedang-padat&#34;&gt;4. Harus menolak pekerjaan ketika sedang padat&lt;/h5&gt;
&lt;p&gt;Kalau kita sudah dikenal orang, besar kemungkinan kita akan mendapat tawaran project, apalagi kalau dia (calon klien) dapat rekomendasi dari temannya yang sudah menggunakan jasa kita (ini pentingnya testimoni nih).&lt;/p&gt;
&lt;p&gt;Jadi, ketika ada tawaran project datang, apa yang harus kita lakukan?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diskusikan spesifikasi dan target waktu calon project baru.&lt;/li&gt;
&lt;li&gt;Periksa jadwal dan target project yang berjalan.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saran dari saya, &lt;strong&gt;jangan menerima&lt;/strong&gt; pekerjaan diluar kemampuan kita, yaitu di sisi &lt;strong&gt;skill&lt;/strong&gt; dan jadwal &lt;strong&gt;waktu&lt;/strong&gt;. &lt;strong&gt;Jangan berani&lt;/strong&gt; menumpuk pekerjaan jika kita &lt;strong&gt;belum disiplin waktu&lt;/strong&gt;.&lt;/p&gt;
&lt;h5 id=&#34;5-kerja-bergantung-dengan-internet&#34;&gt;5. Kerja bergantung dengan Internet&lt;/h5&gt;
&lt;p&gt;Saya sering lihat orang-orang di media sosial mengeluhkan layanan penyedia internet. Sebagian besar pekerja freelance bergantung dengan internet. Termasuk saya, yang sangat mengandalkan internet untuk bekerja.&lt;/p&gt;
&lt;p&gt;Apa saya lakukan untuk menanggulangi masalah internet?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lakukan experimen beberapa layanan internet, terutama di tempat kerja kita yang tetap.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;layanan internet yang tetap&lt;/strong&gt; sesuai kemampuan. Jadi jangan mengandalkan yang harus gonta-ganti kartu, pilih satu yang tetap sesuai kemampuan.&lt;/li&gt;
&lt;li&gt;Kategorikan item-item pekerjaan &lt;strong&gt;yang membutuhkan&lt;/strong&gt; internet dan yang &lt;strong&gt;tidak memubutuhkan&lt;/strong&gt; internet. Jadi ketika internet bermasalah, fokus kerjakan item yang tidak perlu internet.&lt;/li&gt;
&lt;li&gt;Manfaatkan waktu luang dengan &amp;ldquo;piknik&amp;rdquo;. Kalau tidak ada yang bisa dikerjakan silakan piknik, dengan main game, atau nonton anime kesukaan. &lt;em&gt;Yah, namanya ga bisa kerja, gimana dong?&lt;/em&gt; :)&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;6-sering-dikejar-deadline&#34;&gt;6. Sering dikejar deadline&lt;/h5&gt;
&lt;p&gt;Nah ini yang sering dialami oleh freelancer, &lt;strong&gt;mepet deadline&lt;/strong&gt;. :)&lt;/p&gt;
&lt;p&gt;Cara &lt;strong&gt;meminimalisir&lt;/strong&gt; kondisi &lt;strong&gt;&amp;ldquo;dikejar deadline&amp;rdquo;&lt;/strong&gt; bagimana? &lt;strong&gt;Kuncinya disiplin&lt;/strong&gt;, yaitu disiplin waktu dan laporan progress secara rutin sesuai kesepakatan. Jangan menyalahkan klien jika memberi deadline mepet (sejak awal), kalau memang kita tidak sanggup, jangan disepkati.&lt;/p&gt;
&lt;p&gt;Apa saja hal yang sering menyebabkan kita dikejar deadline?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bekerja tanpa jadwal yang jelas.&lt;/li&gt;
&lt;li&gt;Keliru membuat jadwal.&lt;/li&gt;
&lt;li&gt;Tidak disiplin melaporkan progress secara rutin.&lt;/li&gt;
&lt;li&gt;Tidak disiplin dengan jadwal yang telah dibuat.&lt;/li&gt;
&lt;li&gt;Project yang dikerjakan terlalu banyak (beberapa project dalam satu waktu).&lt;/li&gt;
&lt;li&gt;Kondisi badan kurang fit/sakit.&lt;/li&gt;
&lt;li&gt;Terlalu banyak &amp;ldquo;piknik&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tapi ada sisi positif yang kita ambil dari &amp;ldquo;dikejar deadline&amp;rdquo; ini, kita &lt;strong&gt;jadi tahu&lt;/strong&gt; bahwa dikejar deadline itu tidak nyaman. Jadikan hal ini sebagai &lt;strong&gt;pelajaran untuk project selanjutnya&lt;/strong&gt;. Artinya jangan diulangi lagi.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Oke, lumayan panjang lebar pembahasan kita, kesimpulannya :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setiap pekerjaan ada plus minusnya, ada kenyamaman dan resikonya.&lt;/li&gt;
&lt;li&gt;Apakah saya nyaman bekerja seperti sekarang? Alhamdulillah, seperti anggapan banyak orang, nyaman.&lt;/li&gt;
&lt;li&gt;Kenapa di sini saya sebut kelebihan dan konsekuensi, &lt;strong&gt;bukan&lt;/strong&gt; kelebihan dan kekurangan? Karena saya tidak melihat kekurangan dari pekerjaan saya sekarang.&lt;br&gt;
Semua hal yang kurang baik yang saya dapatkan itu, sangat bermanfaat untuk saya pribadi agar bekerja lebih baik, lebih efisien, dan lebih aman. Jadi pelajaran.&lt;/li&gt;
&lt;li&gt;Semua hal yang kita bahas diatas berdasarkan pengalaman yang saya temukan selama bekerja freelance.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demikian teman-teman, semoga menjadi bahan bacaan yang bermanfaat, terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Apakah Fulltime Freelancer itu?</title>
       <link>https://blog.inweeks.com/freelancing/apakah-fulltime-freelancer-itu/</link>
       <pubDate>Tue, 01 May 2018 14:20:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/freelancing/apakah-fulltime-freelancer-itu/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Alhamdulillah hari ini tanggal 1 mei 2018, tepat 4 tahun saya bekerja sebagai fulltime freelancer, tepatnya &lt;strong&gt;freelance web developer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Waktu yang lumayan lama dalam menjalani dunia freelancing, dan memang banyak sekali pelajaran yang saya dapatkan. Dari mulai menemui dan berbicara dengan klien, mengerjakan project dengan progress dan waktu yang efektif, mengelola project agar tidak dikejar deadline, belajar hal-hal yang baru untuk mendukung pekerjaan, dan mengatur keuangan agar kebutuhan keluarga tetap terpenuhi.&lt;/p&gt;
&lt;p&gt;Pada artikel ini, dan insyaallah pada beberapa artikel kedepan, saya ingin berbagi cerita ke teman-teman seputar dunia freelance, setidaknya sejauh yang saya pahami dalam 4 tahun terakhir ini. Mungkin bisa menjadi salah satu rujukan bagi teman-teman yang ingin tahu tentang freelancing.&lt;/p&gt;
&lt;p&gt;Nah pada tulisan ini, saya akan buat semacam tanya jawab, sesuai dengan pertanyaan-pertanyaan yang sering diajukan orang seputar pekerjaan freelance yang saya kerjakan.&lt;/p&gt;
&lt;h3 id=&#34;1-apa-itu-freelancing--freelance-dan-freelancer&#34;&gt;1. Apa itu freelancing / freelance dan freelancer?&lt;/h3&gt;
&lt;p&gt;Freelance adalah sebuah pekerjaan yang dilakukan oleh seseorang dengan durasi waktu yang disepakati. Kalau kita lihat di kamus bahasa inggris, freelance artinya lepas atau bekerja lepas. Jadi biasanya orang bekerja freelance untuk mengisi waktu di sela sela kegiatan rutinnya.&lt;/p&gt;
&lt;p&gt;Umumnya pekerjaan freelance itu, yaitu ketika kita diminta mengerjakan sesuatu dalam jangka waktu tertentu, kemudian dibayar, dan selesai pekerjaan sampai di situ. Di lain waktu, ada pekerjaan lagi, dibayar lagi, selesai lagi.&lt;/p&gt;
&lt;p&gt;Jadi pekerjaan freelance ini memang pekerjaan yang tidak tentu/tidak tetap, tergantung permintaan orang lain (biasa disebut klien/client). Dan umumnya pekerjaan freelance membutuhkan skill/kebisaan tertentu sesuai pekerjaan yang ditawarkan.&lt;/p&gt;
&lt;h3 id=&#34;2-nah-apakah-saat-ini-saya-bekerja-seperti-itu&#34;&gt;2. Nah, apakah saat ini saya bekerja seperti itu?&lt;/h3&gt;
&lt;p&gt;Jawabnya: Ya. Saat ini saya bekerja sebagai freelance web developer. Saya membuat web untuk klien-klien sesuai kebutuhan mereka.&lt;/p&gt;
&lt;p&gt;Web seperti apa? Macam2, ada yang web profil usaha, toko online, tetapi kebanyakan berupa web aplikasi untuk manajemen dalam perusahaan.&lt;/p&gt;
&lt;h3 id=&#34;3-apakah-berarti-pekerjaan-saya-mengerjakan-web-lalu-dibayar-lalu-selesai-begitu&#34;&gt;3. Apakah berarti pekerjaan saya mengerjakan web, lalu dibayar, lalu selesai, begitu?&lt;/h3&gt;
&lt;p&gt;Jawab: Ya, begitu.&lt;/p&gt;
&lt;p&gt;Tetapi setiap project yang saya kerjakan tidak selalu untuk klien baru, malah yang saya kerjakan dalam 2 tahun terakhir berasal dari klien lama. Kebanyakan klien yang saya layani, mereka tidak cukup buat website atau aplikasi web sekali jadi. Biasanya mereka ada permintaan improvement/pengembangan dari web/sistem yang sudah dibuat di awal.&lt;/p&gt;
&lt;p&gt;Tetapi model pekerjaannya ya seperti itu: diskusi, buat kesepakatan, kerjakan, dibayar, selesai. Lalu lanjutkan project berikutnya.&lt;/p&gt;
&lt;h3 id=&#34;4-sepertinya-pekerjaan-freelance-ini-hanya-untuk-programer-ya&#34;&gt;4. Sepertinya pekerjaan freelance ini hanya untuk programer ya?&lt;/h3&gt;
&lt;p&gt;Jawab: Tidak, banyak juga jenis pekerjaan yang lain, seperti :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Penulis (blogger, content writer, email marketing),&lt;/li&gt;
&lt;li&gt;Designer (desainer web, desainer logo, desainer borsur),&lt;/li&gt;
&lt;li&gt;Digital marketing (SEO website, Google Adwords, Facebook Ads),&lt;/li&gt;
&lt;li&gt;Video animator dan editing,&lt;/li&gt;
&lt;li&gt;Dan pekerjaan2 yang umumnya dapat dikerjakan per project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi di Indonesia cukup banyak orang yang bekerja freelance, bahkan ada situs-situs marketplace untuk pekerjaan freelance seperti &lt;a href=&#34;https://projects.co.id/public/browse_projects/listing&#34;&gt;projects.co.id&lt;/a&gt;, &lt;a href=&#34;https://www.freelancer.co.id/info/how-it-works&#34;&gt;freelancer.co.id&lt;/a&gt;, dan yang di luar negeri juga ada &lt;a href=&#34;https://www.upwork.com/i/freelancer-categories-all/&#34;&gt;upwork.com&lt;/a&gt;. Kebanyakan pekerjaan freelance itu adalah pekerjaan yang dibantu oleh komputer dan internet.&lt;/p&gt;
&lt;h3 id=&#34;5-itu-freelancer-lalu-yang-fulltime-freelancer-itu-bagaimana&#34;&gt;5. Itu Freelancer, lalu yang Fulltime Freelancer itu bagaimana?&lt;/h3&gt;
&lt;p&gt;Jawab: Nah biasanya, pekerjaan freelance ini dikerjakan oleh orang-orang yang sudah memiliki pekerjaan tetap. Kemudian untuk menambah penghasilan atau mengisi waktu senggang, mereka memanfaatkan skill yang mereka punya untuk bekerja freelance. Itu yang freelance, biasanya ada juga yang menyebutnya &amp;ldquo;Part-timer&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Sedangkan Fulltime Freelancer itu, secara umum seperti ini :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bekerja tanpa ikatan pada instansi/perusahaan, jadi bekerjanya sebagai personal, bukan sebagai karyawan/pegawai.&lt;/li&gt;
&lt;li&gt;Bekerja sesuai project (atau kontak project), di mana ada kesepakatan target waktu, tahap pekerjaan, bagaimana pekerjaan dianggap selesai. Sehingga komitmen dan tanggung jawab pekerjaannya sesuai kesepakatan.&lt;/li&gt;
&lt;li&gt;Mengelola waktu dan tempat kerja sendiri, di mana seorang fulltime freelancer mengatur jam kerja sendiri sesuai target waktu pengerjaan project, dan dapat bekerja di manapun.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jadi saat ini saya tidak menjadi karyawan atau pegawai di sebuah perusahaan atau instansi, saya bekerja di rumah. Biasanya berkomunikasi dengan klien melalui chat, telepon, email, video call. Sesekali saya datang ke kantor klien untuk diskusi jika diperlukan.&lt;/p&gt;
&lt;p&gt;Saya sering menganalogikan Freelancer ini seperti tukang bangunan. Di mana yang kita tahu, setiap tukang bangunan mereka memiliki skill sendiri-sendiri. Ada yang bisa bangun rumah, ada yang bisa bangun rumah kayu saja, ada yang bisa bangun rumah beton saja, ada yang spesialis bikin dapur, ada yang spesialis bikin kamar mandi, macam-macam kan ya?&lt;/p&gt;
&lt;p&gt;Nah freelancer juga begitu, ada yang punya keahlian ini, keahlian itu, bisa bikin ini, spesialis bikin itu, masing-masing orang bisa memanfaatkan skill untuk mencari nafkah yang halal dan baik. :)&lt;/p&gt;
&lt;h3 id=&#34;penutup&#34;&gt;Penutup&lt;/h3&gt;
&lt;p&gt;Baik, 5 tanya jawab itu rasanya cukup untuk menjelaskan seperti apa itu freelancer dan fulltime freelancer. Insya Allah tulisan-tulisan berikutnya, saya bisa berbagi lagi seputar kelebihan dan konsekuensi bekerja freelance, bertemu dan komunikasi dengan calon klien, cara saya memulai, menjalankan dan melaporkan progress project, dan lain-lain.&lt;/p&gt;
&lt;p&gt;Semoga bermanfaat, terima kasih atas waktu teman-teman.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Deploy Project Laravel dari Github ke VPS Ubuntu Server</title>
       <link>https://blog.inweeks.com/web-server/deploy-project-laravel-dari-github-ke-vps/</link>
       <pubDate>Mon, 23 Apr 2018 23:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/deploy-project-laravel-dari-github-ke-vps/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Kita lanjut seputar web server, yaitu cara men-deploy atau menginstall project Laravel dari Github ke VPS. Pada artikel ini, kita akan install project &lt;a href=&#34;https://blog.inweeks.com/open-source/free-pmo-aplikasi-management-software-untuk-freelancer-dan-agency/&#34;&gt;&lt;strong&gt;Free-PMO&lt;/strong&gt;&lt;/a&gt; dan membatasi cakupan bahasan sebagai berikut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Source Project di-clone langsung dari &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;repository Free-PMO&lt;/a&gt; di github.&lt;/li&gt;
&lt;li&gt;VPS dengan Ubuntu Server 16.04.&lt;/li&gt;
&lt;li&gt;Menggunakan LEMP Stack (Nginx, MariaDB 10.2, dan PHP 7).&lt;/li&gt;
&lt;li&gt;Database menggunakan MariaDB / MySQL.&lt;/li&gt;
&lt;li&gt;Kita mengikuti petunjuk installasi yang ada pada &lt;a href=&#34;https://github.com/nafiesl/free-pmo#installation-steps&#34;&gt;readme project&lt;/a&gt; di github.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;1-install-lemp-stack&#34;&gt;1. Install LEMP Stack&lt;/h3&gt;
&lt;p&gt;Baik kita mulai dengan ssh ke VPS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh projectuser@35.198.238.82
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian lakukan proses installasi LEMP Stack, yaitu Nginx, MariaDB/MySQL, dan PHP untuk Linux. Untuk menjaga agar posting ini fokus pada cara deploy project Laravel, cara install LEMP Stack bisa teman-teman cek di &lt;a href=&#34;https://blog.inweeks.com/web-server/install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04/&#34;&gt;posting ini&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;2-clone-source-code-dari-github&#34;&gt;2. Clone Source Code dari Github&lt;/h3&gt;
&lt;p&gt;Baik, setelah LEMP Stack terinstall dengan benar, kita &lt;code&gt;cd&lt;/code&gt; ke direktori tempat project akan kita deploy/install.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/projectuser
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd www
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian kita clone source code dari &lt;a href=&#34;https://github.com/nafiesl/free-pmo#installation-steps&#34;&gt;Repository Free-PMO&lt;/a&gt; di github.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Clone repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/nafiesl/free-pmo.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Pindah ke direktori project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd free-pmo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Install dependensi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer install
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Buat file .env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cp .env.example .env
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Generate APP_KEY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan key:generate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Application key &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;base64:UPcKQ3i4arfBe5...&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; set successfully.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Update permission untuk direktori storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo chown www-data: -R storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-buat-database-dan-config-di-env&#34;&gt;3. Buat Database dan Config di .env&lt;/h3&gt;
&lt;p&gt;Sekarang kita membuat database untuk melayani project Free-PMO.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mysqladmin -uusernamebaru -p create laravel_free_pmo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Catatan:&lt;br&gt;
Pada potongan perintah -u&lt;strong&gt;usernamebaru&lt;/strong&gt;, &lt;strong&gt;usernamebaru&lt;/strong&gt; adalah username MySQL yang dgunakan untuk database &lt;code&gt;laravel_free_pmo&lt;/code&gt; di project ini. &lt;a href=&#34;https://blog.inweeks.com/web-server/install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04/#membuat-user-mysql-dengan-root-privileges&#34;&gt;Cek referensi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Setelah itu kita buka file &lt;code&gt;.env&lt;/code&gt; untuk input config database project ini. Misalnya kita menggunakan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nama Database: &lt;code&gt;laravel_free_pmo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Username MySQL: &lt;code&gt;homestead&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Password user MySQL: &lt;code&gt;supersecurepassword&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vim .env &lt;span style=&#34;color:#75715e&#34;&gt;# atau nano .env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Ubah&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_DATABASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;homestead
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_USERNAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;homestead
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;supersecurepassword
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Menjadi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_DATABASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;laravel_free_pmo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_USERNAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;usernamebaru
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;secret
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan file &lt;code&gt;.env&lt;/code&gt; kemudian jalankan &lt;code&gt;artisan migrate&lt;/code&gt; untuk mengisi database:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan migrate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sip, proses installasi aplikasi web Free-PMO selesai sampai di sini.&lt;/p&gt;
&lt;h3 id=&#34;4-serverblock-nginx&#34;&gt;4. Serverblock Nginx&lt;/h3&gt;
&lt;p&gt;Sekarang kita lakukan konfigurasi &lt;strong&gt;serverblock nginx&lt;/strong&gt; agar melayani aplikasi web Free-PMO.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Duplikat serverblock yang sudah ada
$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/free-pmo

# Edit serverblock baru
$ sudo vim /etc/nginx/sites-available/free-pmo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Silakan &lt;em&gt;copy&lt;/em&gt; dan &lt;em&gt;paste script&lt;/em&gt; serverblock berikut, kemudian sesuaikan dengan kondisi server teman-teman.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {
        root /home/projectuser/www/free-pmo/public;
        index index.php index.html;
        server_name 35.198.238.82;
        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
        location ~ /\.ht {
                deny all;
        }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hal yang &lt;strong&gt;harus&lt;/strong&gt; teman-teman sesuaikan adalah :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;root /home/&lt;strong&gt;projectuser&lt;/strong&gt;/www/&lt;strong&gt;free-pmo&lt;/strong&gt;/public;&lt;br&gt;
Sesuaikan dengan absolute path direktori project di VPS.&lt;/li&gt;
&lt;li&gt;server_name &lt;strong&gt;35.198.238.82&lt;/strong&gt;;&lt;br&gt;
Disesuaikan dengan IP Address VPS atau domain dari VPS.&lt;/li&gt;
&lt;li&gt;fastcgi_pass unix:/run/php/&lt;strong&gt;php7.0&lt;/strong&gt;-fpm.sock;&lt;br&gt;
Disesuaikan dengan versi PHP di VPS.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ok, jika sudah, silakan simpan, kemudian aktifkan serverblock.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Symlink serverblock ke sites-enabled&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo ln -s /etc/nginx/sites-available/free-pmo /etc/nginx/sites-enabled
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Test script serverblock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Reload nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo nginx -s reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sampai di sini selesai konfigurasi nginx.&lt;/p&gt;
&lt;p&gt;Sekarang kita bisa coba kunjungi IP Address atau domain sesuai konfigurasi nginx teman-teman di atas. Misal: &lt;code&gt;http://35.198.238.82&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-04-23-deploy-project-laravel-dari-github-ke-vps-01.jpg&#34; alt=&#34;Login Free-PMO&#34;&gt;&lt;/p&gt;
&lt;p&gt;Jika sudah tampil halaman login project Free-PMO, artinya &lt;strong&gt;proses deploy kita sudah berhasil&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;6-optional-formulir-install-free-pmo&#34;&gt;6. (Optional) Formulir Install Free-PMO&lt;/h3&gt;
&lt;p&gt;Untuk dapat menggunakan Free-PMO, silakan teman-teman kunjungi route &lt;code&gt;/app-install&lt;/code&gt; dari IP Address atau domain VPS kita: &lt;code&gt;http://35.198.238.82/app-install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-04-23-deploy-project-laravel-dari-github-ke-vps-02.jpg&#34; alt=&#34;Install Free-PMO&#34;&gt;&lt;/p&gt;
&lt;p&gt;Isi formulir sesuai dengan data agency teman-teman, kemudian klik &lt;strong&gt;Install Free-PMO&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-04-23-deploy-project-laravel-dari-github-ke-vps-03.jpg&#34; alt=&#34;Free-PMO Dashboard&#34;&gt;&lt;/p&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Dari proses deployment dan konfigurasi yang agak pajang di atas, kita tarik beberapa kesimpulan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Proses di atas (langkah 1 s/d 5) berlaku untuk project Laravel secara umum.&lt;/li&gt;
&lt;li&gt;Proses di atas berlaku untuk &lt;strong&gt;public repository&lt;/strong&gt;, untuk &lt;strong&gt;private repository&lt;/strong&gt; saya belum coba cara ini.&lt;/li&gt;
&lt;li&gt;Jika ada &lt;strong&gt;commit baru&lt;/strong&gt; di repo github Free-PMO (atau project manapun yang kita install), maka kita tinggal menjalankan perintah &lt;code&gt;git pull origin master&lt;/code&gt; untuk mendapatkan update terbaru di VPS.&lt;/li&gt;
&lt;li&gt;Proses yang sama (langkah 1 s/d 6) dapat dilakukan untuk menginstall aplikasi web Free-PMO di &lt;strong&gt;local PC/Laptop&lt;/strong&gt; yang memiliki &lt;strong&gt;OS Ubuntu 16.04 dengan LEMP Stack&lt;/strong&gt; web server.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik demikian pembahasan tentang Cara Deploy Project Laravel dari Github ke VPS Ubuntu Server 16.04. Terima kasih atas waktu teman-teman sudah membaca.&lt;/p&gt;
&lt;p&gt;Jika teman-teman ingin mencoba aplikasi Free-PMO, silakan kunjungi demonya:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;URL: &lt;a href=&#34;http://free-pmo.nafies.id/login&#34;&gt;&lt;strong&gt;http://free-pmo.nafies.id/login&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;
Email: &lt;code&gt;pmo_admin@mail.com&lt;/code&gt;&lt;br&gt;
Password: &lt;code&gt;secret&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
     </item>
   
     <item>
       <title>Akses Database MariaDB/MySQL VPS dengan Heidi SQL via SSH</title>
       <link>https://blog.inweeks.com/web-server/akses-database-mariadb-mysql-vps-dengan-heidisql-via-ssh/</link>
       <pubDate>Sun, 18 Mar 2018 08:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/akses-database-mariadb-mysql-vps-dengan-heidisql-via-ssh/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Ketika kita deploy sebuah VPS, untuk mengoperasikan database dengan GUI, kita biasa menginstall PHPMyAdmin atau &lt;a href=&#34;https://www.adminer.org&#34;&gt;Adminer&lt;/a&gt;. Kalau kita terbiasa menggunakan MySQL Client di localhost, tentu rasanya jadi beda. Misal saya suka menggunakan Heidi SQL, kan enak kalau kita menggunakan Heidi SQL juga untuk mengelola database di VPS? Apakah bisa? Bisa. :D&lt;/p&gt;
&lt;p&gt;Salah satu caranya menggunakan SSH Tunnel pada HeidiSQL dengan bantuann &lt;a href=&#34;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&#34;&gt;plink&lt;/a&gt;. Bisa dicek pada artikel &lt;a href=&#34;https://www.enovision.net/mysql-ssh-tunnel-heidisql&#34;&gt;How to connect to a MySQL database over a SSH tunnel with HeidiSQL&lt;/a&gt; ini.&lt;/p&gt;
&lt;p&gt;Saya mendapatkan cara yang lebih mudah dari artikel ini: &lt;a href=&#34;https://serversforhackers.com/c/connecting-to-mysql-via-ssh&#34;&gt;Connecting to MySQL via SSH&lt;/a&gt;. Setelah dicoba, ternyata lebih mudah.&lt;/p&gt;
&lt;h3 id=&#34;ssh-dengan-port-forward&#34;&gt;SSH dengan Port Forward&lt;/h3&gt;
&lt;p&gt;Caranya, kita ssh ke server melalui terminal dengan menambahkan command option &lt;code&gt;-L&lt;/code&gt;, seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh projectuser@35.198.238.82 -L 3333:localhost:3306
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Di mana :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;projectuser&lt;/code&gt; adalah sudoer user pada VPS, bisa juga pakai root.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;35.198.238.82&lt;/code&gt; IP Address VPS, bisa juga menggunakan domain.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3333&lt;/code&gt; adalah port localhost pada PC/Laptop kita, dan&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3306&lt;/code&gt; adalah port MySQL pada VPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sekarang kita konfigurasi koneksinya di session manager HeidiSQL.&lt;/p&gt;
&lt;h3 id=&#34;konfigurasi-session-heidisql&#34;&gt;Konfigurasi Session HeidiSQL&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-03-18-akses-database-mariadb-mysql-vps-dengan-heidisql-via-ssh-01.jpg&#34; alt=&#34;Setup Session Heidi SQL&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Klik &lt;strong&gt;New&lt;/strong&gt; untuk membuat session baru.&lt;/li&gt;
&lt;li&gt;Isi &lt;strong&gt;nama session&lt;/strong&gt;, misalnya my-vps&lt;/li&gt;
&lt;li&gt;Isi &lt;strong&gt;Hostname / IP&lt;/strong&gt; : 127.0.0.1&lt;/li&gt;
&lt;li&gt;Isi &lt;strong&gt;User&lt;/strong&gt; dan &lt;strong&gt;Password&lt;/strong&gt; sesuai dengan username dan password MySQL pada VPS&lt;/li&gt;
&lt;li&gt;(Optional) untuk mempermudah akses selanjutnya, simpan perintah SSH pada &lt;strong&gt;Comment&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Simpan dengan tombol &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Open&lt;/strong&gt; untuk membuka koneksi database ke VPS.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kalau kita sudah terhubung ke VPS melalui di terminal, dan konfigurasi session sudah benar, seharusnya kita berhasil terhubung ke database pada VPS kita. Tampil seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-03-18-akses-database-mariadb-mysql-vps-dengan-heidisql-via-ssh-02.jpg&#34; alt=&#34;Heidi SQL Connected to VPS&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Sip. Kita simpulkan pembahasan pada artikel ini. &lt;strong&gt;Cara koneksi MySQL via SSH dengan port forward&lt;/strong&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(Saat ini saya rasa) adalah cara yang paling mudah.&lt;/li&gt;
&lt;li&gt;Bergantung dari koneksi SSH di terminal, jika koneksi SSH terminal putus, maka koneksi di HeidiSQL juga akan putus.&lt;/li&gt;
&lt;li&gt;Tidak hanya berlaku untuk HeidiSQL, tetapi bisa menggunakan MySQL Client yang lain juga.&lt;/li&gt;
&lt;li&gt;Waktu respons saat kita bekerja dengan HeidiSQL di VPS tentu berbeda dengan pengoperasian database di localhost, tergantung dari latency dari PC/Laptop kita ke VPS.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demikian teman-teman, terima kasih atas waktunya.&lt;/p&gt;
&lt;h4 id=&#34;sumber-bacaan&#34;&gt;Sumber Bacaan&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://serversforhackers.com/c/connecting-to-mysql-via-ssh&#34;&gt;Connecting to MySQL via SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.enovision.net/mysql-ssh-tunnel-heidisql&#34;&gt;How to connect to a MySQL database over a SSH tunnel with HeidiSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
     </item>
   
     <item>
       <title>Install LEMP Stack pada Ubuntu Server 16.04</title>
       <link>https://blog.inweeks.com/web-server/install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04/</link>
       <pubDate>Fri, 16 Mar 2018 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Sekarang kita akan menginstall LEMP Stack web server: Nginx, MariaDB, dan PHP 7.0 pada &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;VPS (atau VM Instance)&lt;/a&gt; yang sudah kita punya. Sebenarnya artikel cara install web server pada Ubuntu Server sudah banyak bertebaran di internet, tetapi kali ini kita akan bahas installasi LEMP Stack dengan konfigurasi tambahan yang biasa saya terapkan :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mengubah root directory project pada serverblock nginx.&lt;/li&gt;
&lt;li&gt;Menambah user baru setara &amp;ldquo;root&amp;rdquo; pada MySQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pada artikel ini, saya menggunakan Ubuntu Server 16.04 dari Google Cloud Engine, tetapi ini bisa diterapkan ke VPS dari provider lain, dengan catatan kita tidak menggunakan user &amp;ldquo;root&amp;rdquo;, tetapi  menggunakan &lt;a href=&#34;https://blog.inweeks.com/web-server/cara-membuat-sudoer-user-pada-ubuntu-server-1604/&#34;&gt;sudoer user&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Baik kita mulai.&lt;/p&gt;
&lt;h3 id=&#34;install-nginx-1103&#34;&gt;Install Nginx 1.10.3&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.inweeks.com/web-server/akses-ssh-vm-instance-vps-google-cloud-engine-dari-terminal-ubuntu-1604/&#34;&gt;SSH ke VPS&lt;/a&gt; atau VM Instance, kemudian:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ketika selesai, bisa kita cek di browser dengan membuka IP Address VPS kita.
Misal: &lt;code&gt;http://35.198.238.82&lt;/code&gt; (tampil Welcome to nginx!).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-03-16-install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04-01.jpg&#34; alt=&#34;Hallo Nginx&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;mengubah-directory-root-nginx&#34;&gt;Mengubah directory root nginx&lt;/h4&gt;
&lt;p&gt;Secara default, nginx melayani project yang berada pada direktori &lt;code&gt;/var/www/html&lt;/code&gt;. Tetapi untuk akses dan menjalankan perintah ke direktori itu, kita harus menggunakan sudo (karena kita tidak menggunakan user root).&lt;/p&gt;
&lt;p&gt;Agar kita tidak repot menggunakan sudo, kita ubah direktori root nginx dari &lt;code&gt;/var/www/html&lt;/code&gt; ke &lt;code&gt;/home/username/www&lt;/code&gt;. Di mana &lt;code&gt;username&lt;/code&gt; adalah sudoer user di server ini.&lt;/p&gt;
&lt;p&gt;Caranya, edit serverblock &lt;code&gt;default&lt;/code&gt; nginx.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/nginx/sites-available/default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubah 2 baris berikut ini :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Ubah sesuai dengan direktori yang akan kita gunakan
root /home/username/www;

# ubah sesuai dengan IP Address Server atau domain
server_name 35.198.238.82;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simpan, kemudian &lt;strong&gt;buat direktori&lt;/strong&gt; sesuai dengan yang diatur pada serverblock, yaitu &lt;code&gt;/home/username/www&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cek direktori saat ini.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/username
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Buat direktori sesuai dengan yang diatur pada serverblock.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mkdir www
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Test nginx (jika OK, maka serverblock sudah benar).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nginx: configuration file /etc/nginx/nginx.conf test is successful
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Reload nginx.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo service nginx reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita cek, apakah perubahan yang kita buat berhasil? Buat buat file &lt;code&gt;index.html&lt;/code&gt; pada direktori &lt;code&gt;www&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vim www/index.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Isi file &lt;code&gt;index.html&lt;/code&gt;, misal :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;Dilayani dari direktori /home/username/www&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tes via browser &lt;code&gt;http://35.198.238.82&lt;/code&gt;, jika tampil tulisan di file &lt;code&gt;index.html&lt;/code&gt; tadi, berarti perubahan root directori nginx berhasil.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-03-16-install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04-02.jpg&#34; alt=&#34;Update nginx directory root&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip, selesai install nginx dengan project root pada home directory kita.&lt;/p&gt;
&lt;h3 id=&#34;install-php-70&#34;&gt;Install PHP 7.0&lt;/h3&gt;
&lt;p&gt;Lanjutkan install PHP 7.0 beserta extensionnya (yang diperlukan oleh Laravel).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt install php-fpm php-mysql php-mbstring zip unzip php7.0-zip gzip php-xml php-gd php-curl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setting nginx serverblock &lt;code&gt;default&lt;/code&gt; agar melayani PHP.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/nginx/sites-available/default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        # Tambahkan index.php pada baris index
        index index.php index.html index.htm index.nginx-debian.html;

        # Uncomment pada location ~ \.php$ seperti di bawah
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
                # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        # Uncomment untuk menolak akses .htaccess
        location ~ /\.ht {
                deny all;
        }
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;Serverblock lengkapnya bisa dilihat pada &lt;a href=&#34;https://gist.github.com/nafiesl/54c7720c41ab55a1c1fdb09905897829&#34;&gt;gist ini&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Simpan, kemudian reload nginx.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Test nginx (jika OK, maka serverblock sudah benar).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Reload nginx.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo service nginx reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit &lt;code&gt;php.ini&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo vim /etc/php/7.0/fpm/php.ini
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubah baris ini &lt;code&gt;cgi.fix_pathinfo&lt;/code&gt; menjadi &lt;code&gt;0&lt;/code&gt;, hilangkan &lt;code&gt;#&lt;/code&gt; jika ada.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cgi.fix_pathinfo=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simpan, kemudian restart PHP-FPM.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo service php7.0-fpm restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setup PHP-FPM untuk nginx sudah beres, sekarang kita tes apakah konfigurasi berhasil.&lt;/p&gt;
&lt;h4 id=&#34;uji-coba-php&#34;&gt;Uji Coba PHP&lt;/h4&gt;
&lt;p&gt;Buat file &lt;code&gt;info.php&lt;/code&gt; pada direktori &lt;code&gt;www&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vim www/info.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Isi file dengan script &lt;code&gt;phpinfo()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;phpinfo&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, kemudian tes di browser: &lt;code&gt;http://35.198.238.82/info.php&lt;/code&gt;. Seharusnya tampil info lengkap PHP pada server kita.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-03-16-install-lemp-stack-nginx-mariadb-php-fpm-ubuntu-server-16.04-03.jpg&#34; alt=&#34;PHP 7.0 info&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Kalau sudah tampil seperti di atas,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# hapus file info.php demi keamanan.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rm www/info.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Selesai install PHP 7.0, kita lanjutkan install MariaDB.&lt;/p&gt;
&lt;h3 id=&#34;install-mariadb-102&#34;&gt;Install MariaDB 10.2&lt;/h3&gt;
&lt;p&gt;Secara default, pada ubuntu server 16.04 kita mendapatkan &lt;strong&gt;MariaDB 10.0&lt;/strong&gt;. Tetapi kali ini kita akan menginstall &lt;strong&gt;MariaDB 10.2&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt-get install software-properties-common
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo add-apt-repository &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;deb [arch=amd64,i386,ppc64el] http://mirror.poliwangi.ac.id/mariadb/repo/10.2/ubuntu xenial main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt install mariadb-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cek versi MariaDB :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mysql -V
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mysql  Ver 15.1 Distrib 10.2.13-MariaDB ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita konfigurasi keamanannya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mysql_secure_installation
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Ikut langkahnya, dengan menjawab pertanyaan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Enter current password for root (enter for none): &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Change the root password? [Y/n] Y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# New password: &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Re-enter new password: &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Password updated successfully!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Remove anonymous users? [Y/n] Y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Disallow root login remotely? [Y/n] Y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Remove test database and access to it? [Y/n] Y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#  ... Success!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cleaning up...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# All done!  If you&amp;#39;ve completed all of the above steps, your MariaDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# installation should now be secure.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Thanks for using MariaDB!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sip, selesai install &lt;strong&gt;MariaDB 10.2&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&#34;membuat-user-mysql-dengan-root-privileges&#34;&gt;Membuat User MySQL dengan root privileges&lt;/h4&gt;
&lt;p&gt;Setiap installasi MariaDB/MySQL, kita memiliki user &lt;strong&gt;root&lt;/strong&gt;. Sama halnya dengan user root pada Ubuntu, sebaiknya kita tidak menggunakan user ini untuk bekerja. Kita buat user baru dengan hak akses yang sama dengan root.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Masuk (login) ke MySQL dengan user root.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mysql -uroot -p
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Buat user dengan nama &amp;#39;usernamebaru&amp;#39; dan password &amp;#39;supersecurepassword&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MariaDB &lt;span style=&#34;color:#f92672&#34;&gt;[(&lt;/span&gt;none&lt;span style=&#34;color:#f92672&#34;&gt;)]&lt;/span&gt;&amp;gt; CREATE USER &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;usernamebaru&amp;#39;&lt;/span&gt;@&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt; IDENTIFIED BY &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;supersecurepassword&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Grant privilleges untuk user baru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MariaDB &lt;span style=&#34;color:#f92672&#34;&gt;[(&lt;/span&gt;none&lt;span style=&#34;color:#f92672&#34;&gt;)]&lt;/span&gt;&amp;gt; GRANT ALL PRIVILEGES ON * . * TO &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;usernamebaru&amp;#39;&lt;/span&gt;@&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MariaDB &lt;span style=&#34;color:#f92672&#34;&gt;[(&lt;/span&gt;none&lt;span style=&#34;color:#f92672&#34;&gt;)]&lt;/span&gt;&amp;gt; FLUSH PRIVILEGES;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Untuk melihat semua user yang ada&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MariaDB &lt;span style=&#34;color:#f92672&#34;&gt;[(&lt;/span&gt;none&lt;span style=&#34;color:#f92672&#34;&gt;)]&lt;/span&gt;&amp;gt; SELECT User,Host FROM mysql.user;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Selesai, exit MariaDB/MySQL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MariaDB &lt;span style=&#34;color:#f92672&#34;&gt;[(&lt;/span&gt;none&lt;span style=&#34;color:#f92672&#34;&gt;)]&lt;/span&gt;&amp;gt; exit;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sehingga nanti aplikasi PHP yang kita deploy pada server ini dapat menggunakan database dengan username &lt;code&gt;usernamebaru&lt;/code&gt; dan password &lt;code&gt;supersecurepassword&lt;/code&gt;, tidak perlu menggunakan user &lt;strong&gt;root&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Dengan installasi dan setup/konfigurasi di atas, maka kita akan memiliki :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nginx versi 1.10.3 dengan root directory &lt;code&gt;/home/username/www&lt;/code&gt;.&lt;br&gt;
(Tidak perlu &lt;code&gt;sudo&lt;/code&gt; untuk menjalankan &lt;a href=&#34;https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md&#34;&gt;composer&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;PHP versi 7.0.&lt;/li&gt;
&lt;li&gt;Database MariaDB versi 10.2.&lt;br&gt;
Dengan username &lt;code&gt;usernamebaru&lt;/code&gt; dan password &lt;code&gt;supersecurepassword&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Database lebih aman karena :
&lt;ul&gt;
&lt;li&gt;Memiliki user mysql baru yang hanya kita yang tahu.&lt;/li&gt;
&lt;li&gt;Kita blok akses database secara remote untuk user &lt;code&gt;root&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demikian teman-teman, seperti ini proses installasi LEMP Stack yang biasa saya lakukan untuk VPS Ubuntu Server 16.04. Cara dan proses di atas sebatas sepengetahuan saya yang sangat sedikit dalam hal keamanan server. Mudah-mudahan kedepannya kita bisa bahas tentang keamanan ubuntu server jika sudah ketemu ilmu baru. :D&lt;/p&gt;
&lt;p&gt;Terima kasih sudah berkenan membaca.&lt;/p&gt;
&lt;h4 id=&#34;sumber-bacaan&#34;&gt;Sumber Bacaan&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.vultr.com/docs/how-to-install-apache-24-mariadb-10-and-php-7x-on-ubuntu-16-04&#34;&gt;How to Install Apache 2.4.x, MariaDB 10.x, and PHP 7.x on Ubuntu 16.04
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql&#34;&gt;How To Create a New User and Grant Permissions in MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.liquidweb.com/kb/create-a-mysql-user-on-linux-via-command-line/&#34;&gt;Create a MySQL User on Linux via Command Line&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
     </item>
   
     <item>
       <title>Google Script dengan Trigger, Alternatif Laravel Schedule</title>
       <link>https://blog.inweeks.com/tool/google-script-trigger-alternatif-laravel-schedule-atau-server-cron/</link>
       <pubDate>Tue, 27 Feb 2018 13:45:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/google-script-trigger-alternatif-laravel-schedule-atau-server-cron/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Saya ingin share video tutorial yang saya jadikan referensi untuk menjalankan &lt;strong&gt;Google App Script&lt;/strong&gt; dengan &lt;strong&gt;triggernya&lt;/strong&gt; sebagai alternatif agar aplikasi kita &amp;ldquo;melakukan sesuatu&amp;rdquo; pada jadwal yang sudah ditetapkan.&lt;/p&gt;
&lt;h3 id=&#34;how-to-call-external-api-using-google-app-script---by-amarindazhttpswwwyoutubecomchanneluclmq_ejiz-obnyfkr__jrua&#34;&gt;How To Call External API Using Google App Script - by &lt;a href=&#34;https://www.youtube.com/channel/UCLMQ_EJIZ-OBNYFKr__JRuA&#34;&gt;Amarindaz&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ini video tutorial cara membuat sebuah function pada &lt;a href=&#34;https://developers.google.com/apps-script/overview&#34;&gt;Google App Script&lt;/a&gt; untuk memanggil external API endpoint &lt;a href=&#34;https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app&#34;&gt;UrlFetchApp&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;responsive-embed responsive-embed-16by9&#34;&gt;
  &lt;iframe class=&#34;responsive-embed-item&#34; src=&#34;https://www.youtube.com/embed/hL4I6cyE5TA&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Jika pada video di atas kita mendapatkan ilmu baru untuk membuat script pemanggilan API Endpoint, pada video berikut ini kita mengetahui cara membuat &lt;a href=&#34;https://developers.google.com/apps-script/guides/triggers/&#34;&gt;Trigger&lt;/a&gt; agar script tersebut dijalankan setiap waktu (jadwal) yang kita tentukan.&lt;/p&gt;
&lt;h3 id=&#34;setup-triggers-run-script-using-google-apps-script---by-break-periodhttpswwwyoutubecomchanneluctsplhxih3q23w05jmf_jrg&#34;&gt;Setup Triggers Run script using Google Apps Script - by &lt;a href=&#34;https://www.youtube.com/channel/UCtSplHxih3q23w05jMf_Jrg&#34;&gt;Break Period&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&#34;responsive-embed responsive-embed-16by9&#34;&gt;
  &lt;iframe class=&#34;responsive-embed-item&#34; src=&#34;https://www.youtube.com/embed/to0EXJvY-q0&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Nah dengan berbekal ilmu baru dari tutorial tersebut maka kita dapat melakukan penyesuaian untuk scheduler pada project/aplikasi kita, kurang lebih logic nya seperti ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buat sebuah endpoint pada project agar dapat diakses oleh Google App Script.&lt;/li&gt;
&lt;li&gt;Buat sebuah kondisi bahwa hanya google atau ada syarat tertentu yang akan dilayani oleh endpoint ini.&lt;/li&gt;
&lt;li&gt;Buat script aktifitas apapun yang diperlukan jika endpoint tersebut dikunjungi, seperti :
&lt;ul&gt;
&lt;li&gt;Membersihkan notifikasi lama,&lt;/li&gt;
&lt;li&gt;Menghapus order yang tidak terbayar lebih dari 1 minggu,&lt;/li&gt;
&lt;li&gt;Atau aktifitas apapun &lt;strong&gt;yang ingin diotomatiskan&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cek dan re-cek agar aktifitas tersebut berjalan sesuai dengan kebutuhan.&lt;/li&gt;
&lt;li&gt;Buat Google Script function dengan triggernya.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;contoh-kasus&#34;&gt;Contoh Kasus&lt;/h3&gt;
&lt;p&gt;Di sebuah project CRM Sales Otomotif, saya diminta untuk membuat sebuah fitur di mana &lt;strong&gt;setiap hari ada pengecekan&lt;/strong&gt; untuk customer yang tidak di follow-up lebih dari 1 minggu dari tanggal deadlinenya (overdue follow up).&lt;/p&gt;
&lt;p&gt;Misalkan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deadline&lt;/strong&gt; customer tanggal &lt;strong&gt;01 Pebruari 2018&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Toleransi deadline &lt;strong&gt;7 Hari&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;Kalau tidak ada follow-up &lt;strong&gt;hingga 07 Pebruari 2018, jam 12 malam&lt;/strong&gt;, sistem secara otomatis akan &amp;ldquo;membebaskan&amp;rdquo; customer tersebut dari PIC Sales nya,&lt;/li&gt;
&lt;li&gt;Customer masuk ke daftar &amp;ldquo;Free Customers&amp;rdquo;,&lt;/li&gt;
&lt;li&gt;PIC Sales lain dapat dapat diambil alih customer tersebut yang menginginkannya.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Karena akan dideploy ke shared hosting, maka saya tidak dapat membuat laravel schedule untuk keperluan ini. Solusinya saya coba dengan Google App Script plus Triggernya.&lt;/p&gt;
&lt;p&gt;Untuk melakukan pengecekan itu saya membuat script seperti ini :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-27-google-script-trigger-alternatif-laravel-schedule-atau-server-cron-01.jpg&#34; alt=&#34;Endpoint Action&#34;&gt;&lt;/p&gt;
&lt;p&gt;Di sini bisa kita lihat, jika &lt;strong&gt;tidak ada payload&lt;/strong&gt; atau &lt;strong&gt;request body&lt;/strong&gt; yang berisi &lt;code&gt;&#39;action&#39; =&amp;gt; &#39;evaluate-free-customers&#39;&lt;/code&gt; maka sistem akan &lt;code&gt;abort(404)&lt;/code&gt; (diberi respons halaman tidak ditemukan).&lt;/p&gt;
&lt;p&gt;Setelah memastikan Endpoint API tersebut sudah berjalan dengan baik melalui &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-automated-testing/&#34;&gt;automated testing&lt;/a&gt; dan &lt;a href=&#34;https://www.getpostman.com/apps&#34;&gt;Postman&lt;/a&gt;, saya buatkan google script seperti gambar di bawah.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-27-google-script-trigger-alternatif-laravel-schedule-atau-server-cron-02.jpg&#34; alt=&#34;Google App Script Function&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kalau dijalankan dan tidak ada error, hasilnya cek di &lt;strong&gt;Logs&lt;/strong&gt; seperti ini (Menu: &lt;strong&gt;View&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Logs&lt;/strong&gt; atau Ctrl+Enter) :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-27-google-script-trigger-alternatif-laravel-schedule-atau-server-cron-03.jpg&#34; alt=&#34;Google App Script Function Run&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kemudian setting jadwalnya seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-27-google-script-trigger-alternatif-laravel-schedule-atau-server-cron-04.jpg&#34; alt=&#34;Google App Script Trigger&#34;&gt;&lt;/p&gt;
&lt;p&gt;Maka maka setiap jam 12 malam (tiap hari), google script akan &amp;ldquo;mengunjungi&amp;rdquo; endpoint tersebut, dan aplikasi melakukan pengecekan customer sebagaimana yang diinstruksikan. :D&lt;/p&gt;
&lt;p&gt;Gimana cukup mudah ya menggunakan &lt;a href=&#34;https://developers.google.com/apps-script/overview&#34;&gt;Google App Script&lt;/a&gt; ini? Sangat membantu meng-otomatiskan sesuatu di aplikasi yang dipasang di shared hosting. Ditambah adanya video tutorial di atas, setupnya tidak terlalu sulit.&lt;/p&gt;
&lt;p&gt;Demikian share singkat dari saya seputar Google Script dengan Trigger, sebagai alternatif Laravel Schedule dan Server Cron untuk project laravel yang dipasang di shared hosting.&lt;/p&gt;
&lt;p&gt;Terima kasih teman-teman atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Free PMO - Aplikasi Management Project</title>
       <link>https://blog.inweeks.com/open-source/free-pmo-aplikasi-management-software-untuk-freelancer-dan-agency/</link>
       <pubDate>Sun, 25 Feb 2018 19:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/open-source/free-pmo-aplikasi-management-software-untuk-freelancer-dan-agency/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Saya ingin share tool/software yang saya kembangkan untuk mempermudah pengelolaan project-project yang saya kerjakan. Nama nya &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;&lt;strong&gt;Free PMO&lt;/strong&gt;&lt;/a&gt;. Software ini membantu saya dalam mengelola project, membuat proposal pengajuan anggaran project, update progress task (tugas) dan job per project, serta mencatat pemasukan dan pengeluaran uang dalam project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/portfolios/2017-11-23-free-pmo-open-sourced-project-management-software-02.jpg&#34; alt=&#34;Free PMO Dashboard&#34;&gt;&lt;/p&gt;
&lt;p&gt;Aplikasi ini dibuat dengan &lt;a href=&#34;https://laravel.com/&#34;&gt;Laravel 5&lt;/a&gt; ini awalnya hanya untuk tujuan mencatat seluruh pemasukan dan pengeluaran saja, agar saya tahu persis berapa profit/penghasilan yang saya terima dalam setahun (dalam bekerja sebagai Freelance Web Developer). Kemudian aplikasi ini terus saya kembangkan, sambil memanfaatkan waktu senggang, untuk mempermudah mencatat list item-item pekerjaan yang harus saya kerjakan, beserta detail checklist tugasnya.&lt;/p&gt;
&lt;p&gt;Setelah mengembangkan dan menikmati sendiri sekitar 1 tahun, saya memutuskan untuk meng-opensource-kan aplikasi ini. Mungkin dapat bermanfaat bagi teman-teman &lt;strong&gt;developer/freelancer&lt;/strong&gt; atau &lt;strong&gt;agensi&lt;/strong&gt; yang masih belum ketemu tool yang pas untuk mengelola project-projectnya dalam satu aplikasi yang customizable sesuai kebutuhan.&lt;/p&gt;
&lt;p&gt;Software ini juga dapat digunakan oleh &lt;strong&gt;perusahaan/lembaga/usaha yang memiliki layanan &lt;em&gt;project based&lt;/em&gt;&lt;/strong&gt; bagi pelanggannya. Misal seperti Developer Perumahan, Pengacara, Notaris, atau bisa juga digunakan oleh seorang Project Manager di sebuah perusahaan. Memang tidak semua fitur tersedia, tetapi setidaknya pengelolaan project secara umum dapat dilakukan dengan Free PMO. Dan sekali lagi, &lt;strong&gt;source code Free PMO tersedia gratis di &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;github&lt;/a&gt;&lt;/strong&gt;, siapa pun dapat mengembangkan sesuai kebutuhan.&lt;/p&gt;
&lt;p&gt;Software ini free and open-sourced &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/LICENSE&#34;&gt;berlisensi MIT&lt;/a&gt;, yang intinya :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pengembang (baca: saya) mengijinkan dan ridho jika aplikasi ini digunakan/dimodifikasi/distribusikan ulang untuk tujuan pribadi, instansi maupun komersil, dengan catatan file &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/LICENSE&#34;&gt;&lt;strong&gt;LICENSE&lt;/strong&gt;&lt;/a&gt; di dalam project &lt;strong&gt;tidak diubah/dihilangkan&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Artinya saya mempersilakan teman-teman untuk menggunakan source code dan aplikasi Free PMO sesuai keperluan tanpa harus minta ijin atau membayar saya.&lt;/p&gt;
&lt;p&gt;List fitur lengkap dan cara installnya dijelaskan dalam &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;repo githubnya&lt;/a&gt;. Jika ada kendala dalam installasi, silakan diinformasikan.&lt;/p&gt;
&lt;p&gt;Saya juga mempersilakan jika teman-teman ada yang ingin berkontribusi dalam mengembangkan project ini. Beberapa cara dan sarana kontribusi saya jelaskan pada file &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/CONTRIBUTING.id.md&#34;&gt;CONTRIBUTING&lt;/a&gt; di repository Project.&lt;/p&gt;
&lt;p&gt;Btw, aplikasi ini dibangun dengan metode Test-driven Development, yang sudah kita ulas di banyak artikel pada blog ini. Mungkin bisa jadi salah satu referensi jika teman-teman ada yang mau menekuni metode TDD dalam pembangunan aplikasi dengan Framework Laravel.&lt;/p&gt;
&lt;p&gt;Semoga manfaat yang saya dapatkan dari tool ini juga bermanfaat untuk orang banyak.&lt;/p&gt;
&lt;p&gt;Terima kasih atas perkenan teman-teman.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Membuat Sudoer User pada Ubuntu Server 16.04</title>
       <link>https://blog.inweeks.com/web-server/cara-membuat-sudoer-user-pada-ubuntu-server-1604/</link>
       <pubDate>Fri, 23 Feb 2018 22:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/cara-membuat-sudoer-user-pada-ubuntu-server-1604/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Ketika kita menyewa sebuah VPS, umumnya kita mendapatkan login sebagai super user &amp;ldquo;root&amp;rdquo; ke server. Kata orang-orang yang berpengalaman, ini berresiko, karena perintah-perintah yang kita jalankan dengan super user &amp;ldquo;root&amp;rdquo; akan dieksekusi tanpa konfirmasi atau ditanya password. Ini lumayan bahaya jika kita &amp;ldquo;tidak terlalu paham&amp;rdquo; dengan perintah-perintah yang kita eksekusi (IMHO).&lt;/p&gt;
&lt;p&gt;Nah, ketika mulai belajar menggunakan VPS, saya mencari referensi bagaimana &lt;strong&gt;cara membuat sebuah user baru di Ubuntu server&lt;/strong&gt;. Tujuannya agar ketika ingin menjalankan perintah yang berhubungan dengan perubahan di sistem (misal install, hapus atau mengubah sesuatu), harus dilakukan dengan &amp;ldquo;sudo&amp;rdquo; dan ditanya password dulu. Sekedar memastikan bahwa saya yakin akan mengeksekusi perintah itu.&lt;/p&gt;
&lt;p&gt;Yah, sedikit lebih aman lah..&lt;/p&gt;
&lt;p&gt;Oke, kita simpulkan, karena lebih aman, maka setiap deploy VPS baru, kita perlu membuat sebuah user yang memiliki hak akses &amp;ldquo;root&amp;rdquo; dengan bantuan &amp;ldquo;sudo&amp;rdquo;. Inilah yang disebut sudoer user. &lt;strong&gt;Sudoer user&lt;/strong&gt; adalah user masuk dalam &lt;strong&gt;grup super user&lt;/strong&gt;, memiliki hak akses setara super user &amp;ldquo;root&amp;rdquo; dengan &amp;ldquo;mantra&amp;rdquo; bernama &lt;strong&gt;&amp;ldquo;sudo&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sudo = super user do&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;membuat-user-baru&#34;&gt;Membuat User Baru&lt;/h3&gt;
&lt;p&gt;Di sini saya login dari terminal di laptop, ke VPS Ubuntu Server 16.04 yang baru di-deploy melalui SSH dengan user &lt;strong&gt;root&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh root@ip-address-vps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-23-cara-membuat-sudoer-user-pada-ubuntu-server-1604-01.jpg&#34; alt=&#34;SSH ke VPS dengan user root&#34;&gt;&lt;/p&gt;
&lt;p&gt;Misal kita membuat sebuah user baru bernama &lt;strong&gt;&amp;ldquo;projectuser&amp;rdquo;&lt;/strong&gt;, kita berikan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adduser projectuser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Isikan &lt;strong&gt;New password&lt;/strong&gt; dan &lt;strong&gt;Retype new password&lt;/strong&gt;, isikan data yang diperlukan. Lebih kurang seperti ini prosesnya :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@test-vps:~# adduser projectuser
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:

...

perl: warning: Falling back to a fallback locale (&amp;#34;en_US.UTF-8&amp;#34;).
Adding user `projectuser` ...
Adding new group `projectuser` (1000) ...
Adding new user `projectuser` (1000) with group `projectuser` ...
Creating home directory `/home/projectuser` ...
Copying files from `/etc/skel` ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for projectuser
Enter the new value, or press ENTER for the default
    Full Name []: Project User
    Room Number []: 
    Work Phone []: 
    Home Phone []: 
    Other []: 
Is the information correct? [Y/n] y
root@test-vps:~#
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sampai sini kita sudah memiliki user &lt;strong&gt;&amp;ldquo;projectuser&amp;rdquo;&lt;/strong&gt;. Baik kita lanjutkan.&lt;/p&gt;
&lt;h3 id=&#34;masukkan-user-ke-grup-sudo&#34;&gt;Masukkan User ke grup SUDO&lt;/h3&gt;
&lt;p&gt;Agar dapat menjalankan perintah dengan &amp;ldquo;sudo&amp;rdquo;, kita masukkan user &lt;strong&gt;projectuser&lt;/strong&gt; ke dalam grup &lt;strong&gt;&amp;ldquo;sudo&amp;rdquo;&lt;/strong&gt;. Berikut perintahnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;usermod -aG sudo projectuser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Nah salah satu contohnya ini, dengan &amp;ldquo;root&amp;rdquo;, ketika kita &lt;strong&gt;masukkan sebuah user&lt;/strong&gt; ke &lt;strong&gt;grup sudo&lt;/strong&gt;, perintah ini langsung dijalankan oleh sistem, tanpa konfirmasi dulu. Bisa dibayangkan kalau kita eksekusi sebuah perintah yang berbahaya (tanpa kita tahu resikonya)? Hmmm&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;uji-coba-perintah-sudo&#34;&gt;Uji coba perintah SUDO&lt;/h3&gt;
&lt;p&gt;Oke sekarang kita coba login sebagai &lt;strong&gt;projectuser&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;su - projectuser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maka kita akan ter-login sebagai &lt;strong&gt;&amp;ldquo;projectuser&amp;rdquo;&lt;/strong&gt;. Sekarang kita coba sebuah perintah yang memerlukan hak akses root dengan &amp;ldquo;sudo&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo ls -la /root
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Akan tampil seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-23-cara-membuat-sudoer-user-pada-ubuntu-server-1604-02.jpg&#34; alt=&#34;Sudoer user action&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip, jika isi direktori &lt;code&gt;/root&lt;/code&gt; muncul, berarti user ini sudah menjadi seorang &lt;strong&gt;&amp;ldquo;sudoer user&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;uji-coba-ssh-dengan-user-baru&#34;&gt;Uji coba SSH dengan User Baru&lt;/h3&gt;
&lt;p&gt;Apakah kita bisa login dengan user ini langsung melalui SSH? Bisa dong..&lt;br&gt;
Kita coba SSH dari PC/Laptop local kita.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh projectuser@ip-address-vps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-23-cara-membuat-sudoer-user-pada-ubuntu-server-1604-03.jpg&#34; alt=&#34;SSH dengan user baru&#34;&gt;&lt;/p&gt;
&lt;p&gt;Berhasil. Oke dengan demikian, kita sudah punya sebuah user &lt;strong&gt;&amp;ldquo;projectuser&amp;rdquo;&lt;/strong&gt; yang akan digunakan untuk bekerja di VPS kita, tanpa harus menggunakan user &amp;ldquo;root&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Jadi mengapa disarankan menggunakan non-root user dalam bekerja di sebuah VPS?&lt;br&gt;
Berikut beberapa hal yang dapat saya simpulkan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;User &amp;ldquo;root&amp;rdquo; &lt;strong&gt;mengeksekusi perintah tanpa konfirmasi&lt;/strong&gt; password terlebih dahulu, sehingga agak berresiko jika digunakan dalam bekerja di sebuah server.&lt;/li&gt;
&lt;li&gt;Dengan adanya &lt;strong&gt;sudoer user&lt;/strong&gt; dan bisa SSH dengan user tersebut, maka kita dapat disable &amp;ldquo;root&amp;rdquo; login.&lt;/li&gt;
&lt;li&gt;Semua GNU/Linux server memiliki user &amp;ldquo;root&amp;rdquo; dengan hak akses super user. &amp;ldquo;Orang-orang usil&amp;rdquo; dapat mencoba akses via SSH ke server kita dengan user &amp;ldquo;root&amp;rdquo; secara brutal. Istilah kerennya &lt;strong&gt;Brute Force SSH attack&lt;/strong&gt;. Ini dapat dihindari dengan men-disable &amp;ldquo;root&amp;rdquo; login seperti pada point 2 di atas.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, demikian pembahasan kita tentang cara membuat sudoer user, agar kita tidak perlu menggunakan super user &amp;ldquo;root&amp;rdquo; dalam bekerja dengan VPS Ubuntu 16.04. Hanya sedikit share dari pengetahuan saya yang minim seputar pengelolaan server. :D&lt;/p&gt;
&lt;p&gt;Terima kasih teman-teman sudah berkenan membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Akses VM Instance GCE dari Terminal Ubuntu 16.04</title>
       <link>https://blog.inweeks.com/web-server/akses-ssh-vm-instance-vps-google-cloud-engine-dari-terminal-ubuntu-1604/</link>
       <pubDate>Tue, 13 Feb 2018 08:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/akses-ssh-vm-instance-vps-google-cloud-engine-dari-terminal-ubuntu-1604/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Beberapa artikel yang lalu kita bahas tentang Google Cloud Engine (GCE), yaitu VPS dari google. Pada artikel tentang &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;deploy VM Instance&lt;/a&gt; kemarin, kita dapat mengakse VPS tersebut dengan SSH melalui &lt;strong&gt;pop-up window browser&lt;/strong&gt; dari Google Cloud Platform (GCP). Kita &lt;strong&gt;tidak&lt;/strong&gt; dapat mengakses vps tersebut &lt;strong&gt;langsung melalui terminal&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Misal kita punya VM Instance dengan External IP Address: 35.194.38.27.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh nafiesl@35.194.38.27 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Permission denied &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;publickey&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kalau terus-terusan mengakses melalui pop-up window browser di GCP Console, sepertinya lumayan merepotkan. Karena harus buka GCP Console dulu baru bisa login ke VM Instance (VPS) nya. Kita kan inginnya serba cepat ya? Langsung SSH dari terminal Ubuntu kan enak? :D&lt;/p&gt;
&lt;p&gt;Bagaimana caranya agar kita langsung bisa akses melalui terminal kita? Pada artikel ini kita bahas langkah-langkahnya.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Google Cloud SDK (gcloud).&lt;/li&gt;
&lt;li&gt;Setup gcloud compute (ijin akses google cloud SDK).&lt;/li&gt;
&lt;li&gt;SSH dengan gcloud.&lt;/li&gt;
&lt;li&gt;Akses langsung dengan SSH terminal (tanpa gcloud).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;install-google-cloud-sdk-gcloud&#34;&gt;Install Google Cloud SDK (gcloud)&lt;/h3&gt;
&lt;p&gt;Satu-satunya cara bisa akses melalui terminal Ubuntu adalah menggunakan aplikasi &lt;strong&gt;Google Cloud SDK&lt;/strong&gt;. Silakan buka halaman &lt;a href=&#34;https://cloud.google.com/sdk&#34;&gt;dokumentasi Google Cloud SDK&lt;/a&gt;, pilih OS yang sesuai, saya menggunakan Ubuntu 16.04, maka pilih &lt;strong&gt;Install for Debian / Ubuntu&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sesuai petunjuk di dokumentasi tersebut, kita jalankan perintah-perintah berikut untuk install Google Cloud SKD.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Create an environment variable for the correct distribution&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export CLOUD_SDK_REPO&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cloud-sdk-&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;lsb_release -c -s&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Add the Cloud SDK distribution URI as a package source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb http://packages.cloud.google.com/apt &lt;/span&gt;$CLOUD_SDK_REPO&lt;span style=&#34;color:#e6db74&#34;&gt; main&amp;#34;&lt;/span&gt; | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Import the Google Cloud Platform public key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Update the package list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Install the Cloud SDK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install google-cloud-sdk
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Selesai proses installasi, uji coba perintah &lt;code&gt;gcloud -v&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ gcloud -v
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Google Cloud SDK 188.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alpha 2018.02.08
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;beta 2018.02.08
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bq 2.0.28
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core 2018.02.08
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gsutil 4.28
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sip, artinya aplikasi &lt;code&gt;gcloud&lt;/code&gt; sudah terinstall di Ubuntu kita.&lt;/p&gt;
&lt;h3 id=&#34;set-up-gcloud-compute&#34;&gt;Set up gcloud compute&lt;/h3&gt;
&lt;p&gt;Untuk memulai akses ke VM Instance kita di Google Cloud Engine (GCE), kita lakukan &lt;strong&gt;setup gcloud compute&lt;/strong&gt;. Jalan kan perintah &lt;code&gt;gcloud init&lt;/code&gt;, kita akan mendapatkan tampilan berikut, ikuti langkahnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ gcloud init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Welcome! This command will take you through the configuration of gcloud.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your current configuration has been set to: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;default&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;, you must login. Would you like to login &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Y/n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;?  y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your browser has been opened to visit:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://accounts.google.com/o/oauth2/auth?scope&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;https%3A%2F%2Fwww.googleapis.co%2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Fauth%2Fappengine.admin+https%3A%2F%2...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Browser akan terbuka&lt;/strong&gt;, kemudian kita diminta untuk &lt;strong&gt;login dengan akun google&lt;/strong&gt; sesuai yang kita gunakan untuk GCP, kemudian &lt;strong&gt;ijinkan akses untuk Google Cloud SDK&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Setelah berhasil login, kembali ke terminal dan akan muncul &lt;strong&gt;pilihan project pada GCP&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Created new window in existing browser session.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;28187:28222:0212/215654.452498:ERROR:browser_gpu_channel_......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;You are logged in as: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;........@gmail.com&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Pick cloud project to use: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; api-project-6587......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; balm......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; inspe......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; jw......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; nafi......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; youtube-chann......
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;7&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Create a new project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Please enter numeric choice or text value &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;must exactly match list 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;item&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;:  &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Masukkan nomor cloud project yang ingin kita gunakan, silakan isi dengan nomor project sesuai dengan nama project yang kita buat saat &lt;a href=&#34;https://blog.inweeks.com/web-server/mendapatkan-free-credit-usd-300-google-compute-engine/#membuat-project-baru&#34;&gt;mendaftar pada GPC&lt;/a&gt;. Dalam hal ini, saya pilih nomor 5. Lanjutkan proses jika ada pertanyaan selanjutnya, sampai selesai.&lt;/p&gt;
&lt;p&gt;Sampai di sini kita sudah berhasil &lt;strong&gt;set up gcloud compute&lt;/strong&gt;. Artinya dengan perintah :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gcloud compute ssh username@my-vps
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;seharusnya kita sudah dapat akses SSH langsung dari terminal Ubuntu kita.&lt;/p&gt;
&lt;h3 id=&#34;ssh-dengan-gcloud&#34;&gt;SSH dengan gcloud&lt;/h3&gt;
&lt;p&gt;Oke, sekarang kita coba ssh ke VM Instance kita melalui terminal dengan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ gcloud compute ssh nafiesl@my-vps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prosesnya lebih kurang seperti ini :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gcloud compute ssh nafiesl@my-vps
WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/....../.ssh/google_compute_engine.
Your public key has been saved in /home/....../.ssh/google_compute_engine.pub.
The key fingerprint is:
SHA256:+QLtoU95kCnibbK1ZSf3PU...... ......@kingpinn

Updating project ssh metadata...-Updated [https://www.googleapis.com.....].
Updating project ssh metadata...done.     
Waiting for SSH key to propagate.

...

Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.13.0-1008-gcp x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Mon Feb 12 23:26:47 2018 from 202.67.32.89
nafiesl@my-vps:~$
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;Catatan : Jika ada kegagalan dalam proses, coba ditambahkan command option yang sesuai, misal &lt;code&gt;--zone&lt;/code&gt;, panduannya ada pada &lt;a href=&#34;https://cloud.google.com/compute/docs/gcloud-compute/#connecting&#34;&gt;dokumentasi &lt;strong&gt;gcloud-compute&lt;/strong&gt; bagian &lt;strong&gt;connecting&lt;/strong&gt;&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;akses-langsung-dengan-ssh-terminal&#34;&gt;Akses Langsung dengan SSH Terminal?&lt;/h3&gt;
&lt;p&gt;Sekarang,  &lt;em&gt;check this out&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh nafiesl@35.194.38.27
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Welcome to Ubuntu 16.04.3 LTS &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;GNU/Linux 4.13.0-1008-gcp x86_64&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Documentation:  https://help.ubuntu.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Management:     https://landscape.canonical.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Support:        https://ubuntu.com/advantage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Get cloud support with Ubuntu Advantage Cloud Guest:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    http://www.ubuntu.com/business/services/cloud
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; packages can be updated.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; updates are security updates.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Last login: Mon Feb &lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt; 14:46:07 &lt;span style=&#34;color:#ae81ff&#34;&gt;2018&lt;/span&gt; from 173.194.93.34
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nafiesl@my-vps:~$ 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yes! Karena (PC/laptop) kita &lt;strong&gt;sudah pernah terhubung kita melalui gcloud&lt;/strong&gt;, sekarang kita bisa langsung ssh ke VM Instance dengan perintah &lt;code&gt;ssh username@ip-address-vm-instance&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Mantap!&lt;/p&gt;
&lt;h3 id=&#34;catatan&#34;&gt;Catatan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Agar dapat ssh ke VM Instance melalui terminal, kita harus menginstall Google Cloud SKD (gcloud) dan memberikan ijin akses ke project di GPC.&lt;/li&gt;
&lt;li&gt;Sepanjang yang saya tahu, secara default kita tidak mendapat akses &lt;code&gt;root&lt;/code&gt;, kita mendapatkan user ubuntu dengan nama yang sama dengan username gmail kita.&lt;/li&gt;
&lt;li&gt;Jika kita lakukan &lt;code&gt;gcloud compute ssh my-vps&lt;/code&gt; (tanpa username google), maka gcloud akan membuat login/user sesuai dengan username PC/Laptop kita.&lt;/li&gt;
&lt;li&gt;Jika ada kegagalan dalam koneksi ssh, pastikan teman-teman menambahkan command option yang sesuai, misal &lt;code&gt;--zone&lt;/code&gt;, cek panduannya pada &lt;a href=&#34;https://cloud.google.com/compute/docs/gcloud-compute/#connecting&#34;&gt;dokumentasi &lt;strong&gt;gcloud-compute&lt;/strong&gt; bagian &lt;strong&gt;connecting&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sip, selesai. Demikian pembahasan kita tentang cara akses VM Instance GCE dari terminal Ubuntu 16.04. Mudah-mudahan bermanfaat bagi teman-teman yang memerlukan. Jika ada yang ingin didiskusikan, silakan tuliskan pada kolom komentar.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya. :D&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>MkDocs - Project Documentation with Markdown</title>
       <link>https://blog.inweeks.com/tool/mkdocs-project-documentation-with-markdown/</link>
       <pubDate>Mon, 12 Feb 2018 07:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/mkdocs-project-documentation-with-markdown/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Membuat &lt;em&gt;user guide&lt;/em&gt; atau panduan user dari aplikasi yang kita bangun adalah pekerjaan yang lumayan menyita waktu. Apalagi bagi seorang freelancer, umumnya paduan user ini dibuat setelah project selesai, karena semua dikerjakan sendiri. Kita harus mencari cara agar mempermudah pekerjaan ini.&lt;/p&gt;
&lt;p&gt;Salah satu tool yang bisa kita gunakan untuk membuat panduan sistem adalah &lt;a href=&#34;http://www.mkdocs.org&#34;&gt;MkDocs&lt;/a&gt;. MkDocs ini adalah sebuah static site generator yang ditujukan untuk membuat project documentation.&lt;/p&gt;
&lt;p&gt;Beberapa klien yang meminta dibuatkan user guide, saya buatkan dengan tool MkDocs ini.&lt;/p&gt;
&lt;h5 id=&#34;kelebihan-mkdocs&#34;&gt;Kelebihan MkDocs&lt;/h5&gt;
&lt;p&gt;Kelebihannya yang saya ketahui antara lain :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menulis dengan markdown (bagi yang terbiasa menulis readme di github, nyaman dengan ini).&lt;/li&gt;
&lt;li&gt;Auto-reload on save changes (refresh otomatis saat file disimpan).&lt;/li&gt;
&lt;li&gt;Top Navbar otomatis sesuai struktur folder dan file.&lt;/li&gt;
&lt;li&gt;Table of content (daftar isi) otomatis mendeteksi setiap header dokumen (#, ##, ###, h1, h2, h3, h4, &amp;hellip;).&lt;/li&gt;
&lt;li&gt;Scroll spy pada table of content.&lt;/li&gt;
&lt;li&gt;Fitur search dokumentasi.&lt;/li&gt;
&lt;li&gt;Bisa custom CSS dan JS.&lt;/li&gt;
&lt;li&gt;Mobile responsive (bootstrap 3).&lt;/li&gt;
&lt;li&gt;Bisa dipublish ke github pages.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keren ya.&lt;/p&gt;
&lt;h5 id=&#34;contoh-project-mkdocs&#34;&gt;Contoh Project MkDocs&lt;/h5&gt;
&lt;p&gt;Ini contoh yang dipublish dengan github pages :&lt;br&gt;
&lt;a href=&#34;https://nafiesl.github.io/panduan-penjualan&#34;&gt;https://nafiesl.github.io/panduan-penjualan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Source codenya di github :&lt;br&gt;
&lt;a href=&#34;https://github.com/nafiesl/panduan-penjualan&#34;&gt;https://github.com/nafiesl/panduan-penjualan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Silakan teman-teman yang mau coba :&lt;br&gt;
&lt;a href=&#34;http://www.mkdocs.org&#34;&gt;http://www.mkdocs.org&lt;/a&gt;, ada &lt;a href=&#34;http://www.mkdocs.org/#installation&#34;&gt;panduan installasinya&lt;/a&gt;.&lt;/p&gt;
&lt;h5 id=&#34;manfaat-mkdocs&#34;&gt;Manfaat MkDocs&lt;/h5&gt;
&lt;p&gt;Yang saya rasakan dari menggunakan MkDocs ini, dapat mempercepat pembangunan dokumentasi project, karena :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bisa fokus ke konten, karena tampilan yang cantik sudah diberikan oleh MkDocs.&lt;/li&gt;
&lt;li&gt;Tidak perlu tekan tombol refresh browser karena auto-reload.&lt;/li&gt;
&lt;li&gt;Sudah dalam format HTML, tinggal upload ke production server/hosting.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;kendala-pada-mkdocs&#34;&gt;Kendala pada MkDocs&lt;/h5&gt;
&lt;p&gt;Satu yang belum saya temukan di MkDocs adalah konversi ke file PDF, karena kadang klien juga minta versi PDF nya untuk dibaca secara offline, atau dibagi-bagi ke user yang menggunakan sistem. Jadi untuk kebutuhan ini, solusinya dengan menggunakan LibreOffice Writer.&lt;/p&gt;
&lt;p&gt;Oke, demikian sharing singkat tentang MkDocs, mudah-mudahan bermanfaat bagi yang membutuhkannya.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktu teman-teman sudah membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Deploy VPS (VM Instance) Google Cloud Engine</title>
       <link>https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/</link>
       <pubDate>Fri, 02 Feb 2018 16:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Google memiliki promo untuk Google Cloud Platform, yaitu Free Credit $300 untuk 12 bulan untuk pengguna baru. Jika kita sudah mendaftar dan mendapatkan Free Credit ini, kita dapat menggunakannya untuk membayar beberapa Cloud Platform dari Google, salah satunya Google Cloud Engine. Dengan membuat sebuah VM Instance dari Google Cloud Engine, kita akan memiliki sebuah VPS (Virtual Private Server) yang dapat kita gunakan sebagai web server.&lt;/p&gt;
&lt;p&gt;Blog ini, web &lt;a href=&#34;https://jasawebsitebanjarmasin.com&#34;&gt;JasaWebsiteBanjarmasin.com&lt;/a&gt;, dan project riset yang saya kelola, saya hosting di satu VM Instance Google Cloud Engine. Lumayan hemat budget hosting untuk 1 tahun.&lt;/p&gt;
&lt;h3 id=&#34;deploy-vm-instance-google-cloud-engine&#34;&gt;Deploy VM Instance Google Cloud Engine&lt;/h3&gt;
&lt;p&gt;Kali ini kita akan membahas bagaimana cara deploy satu VM Instance pada GCE (Google Cloud Engine). &lt;strong&gt;Persiapannya&lt;/strong&gt;, pastikan kita sudah mendaftar dan &lt;a href=&#34;https://blog.inweeks.com/web-server/mendapatkan-free-credit-usd-300-google-compute-engine/&#34;&gt;mendapatkan Free Credit&lt;/a&gt;. Kemudian lakukan langkah berikut ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dari &lt;a href=&#34;https://console.cloud.google.com/home&#34;&gt;Dashboard Google Cloud Platform&lt;/a&gt;, pilih menu:&lt;br&gt;
&lt;strong&gt;Products &amp;amp; services&lt;/strong&gt; (kiri atas) → &lt;strong&gt;Compute Engine&lt;/strong&gt; → &lt;strong&gt;VM Instances&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-01.jpg&#34; alt=&#34;Google Cloud Engine Create&#34;&gt;&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Create Instance&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-02.jpg&#34; alt=&#34;Google Cloud Engine Create Instance&#34;&gt;&lt;/li&gt;
&lt;li&gt;Isi &lt;strong&gt;Name&lt;/strong&gt;, misal: vps-saya&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Zone&lt;/strong&gt; terdekat dengan target visitor. Ini menentukan &lt;strong&gt;lokasi data center&lt;/strong&gt; VPS kita, untuk Indonesia, pilih &lt;strong&gt;asia-shoutheast1-a&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-03.jpg&#34; alt=&#34;Google Cloud Engine Form 1&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Machine Type&lt;/strong&gt;, paling murah micro (1 shared vCPU), tapi Machine Type ini bebas pilih sesuai kebutuhan.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-04.jpg&#34; alt=&#34;Google Cloud Engine Machine Type&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pada &lt;strong&gt;Boot Disk&lt;/strong&gt;, klik &lt;strong&gt;Change&lt;/strong&gt;, pilih OS Image &lt;strong&gt;Ubuntu 16.04 LTS&lt;/strong&gt;, &lt;strong&gt;Boot disk type&lt;/strong&gt; SSD Persistent Disk, &lt;strong&gt;Size&lt;/strong&gt; minimal 10GB. Klik &lt;strong&gt;Select&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-05.jpg&#34; alt=&#34;Google Cloud Engine Boot Disk&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pada &lt;strong&gt;Identity and API access&lt;/strong&gt;, pilih Service account &lt;strong&gt;App Engine app default service account&lt;/strong&gt; (sesuai nama project).
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-06.jpg&#34; alt=&#34;Google Cloud Engine Identity and API access&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pada &lt;strong&gt;Firewall&lt;/strong&gt;, centang Allow &lt;strong&gt;HTTP&lt;/strong&gt; dan &lt;strong&gt;HTTPS traffic&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-07.jpg&#34; alt=&#34;Google Cloud Engine Form 2&#34;&gt;&lt;/li&gt;
&lt;li&gt;Sebelum klik Create, kita perhatikan &lt;strong&gt;estimasi tagihan perbulan&lt;/strong&gt; di sebelah kanan klik &lt;strong&gt;Details&lt;/strong&gt; untuk melihat rinciannya. Jumlah itu yang akan dipotong dari Kredit nanti.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-08.jpg&#34; alt=&#34;Google Cloud Engine Charge Details&#34;&gt;&lt;/li&gt;
&lt;li&gt;Jika sudah memahami, klik &lt;strong&gt;Create&lt;/strong&gt;. Maka &lt;strong&gt;VM Instance (VPS)&lt;/strong&gt; kita sudah selesai.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-09.jpg&#34; alt=&#34;Google Cloud Engine Created VM&#34;&gt;&lt;/li&gt;
&lt;li&gt;Kita coba login ke VPS melalui SSH, klik link &lt;strong&gt;SSH&lt;/strong&gt; pada kolom &lt;strong&gt;Connect&lt;/strong&gt;. Maka akan muncul terminal window berupa pop-up window browser. Seperti di bawah ini.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-10.jpg&#34; alt=&#34;Google Cloud Engine SSH VM&#34;&gt;&lt;/li&gt;
&lt;li&gt;Sekarang kita coba ping IP Address nya (External IP).
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-deploy-vps-vm-instance-google-compute-engine-11.jpg&#34; alt=&#34;Google Cloud Engine Ping VM&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jika seperti terlihat pada gambar di atas, artinya VM Instance (VPS) kita sudah aktif dan siap digunakan, silakan install web server sesuai kebutuhan.&lt;/p&gt;
&lt;p&gt;BTW untuk harga estimasi perbulan di atas &lt;strong&gt;$6.57&lt;/strong&gt; perbulan = $6.57 * 12 = &lt;strong&gt;$78,84 per tahun&lt;/strong&gt; (Credit masih sisa banyak), jadi silakan teman-teman pilih spesifikasi di atas sesuai dengan kebutuhannya.&lt;/p&gt;
&lt;p&gt;Sip, sampai di sini pembahasan kita tentang Cara deploy VPS (VM Instance) Google Compute Engine. Semoga bermanfaat, terima kasih.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Mendapatkan Free Credit USD 300 untuk Google Compute Engine</title>
       <link>https://blog.inweeks.com/web-server/mendapatkan-free-credit-usd-300-google-compute-engine/</link>
       <pubDate>Fri, 02 Feb 2018 09:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/web-server/mendapatkan-free-credit-usd-300-google-compute-engine/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Sekitar September 2017 saya &lt;strong&gt;mendaftar di Google Cloud Platform&lt;/strong&gt;, karena tergiur dengan &lt;strong&gt;gratis credit $300 untuk 12 bulan&lt;/strong&gt;. Kebetulan shared hosting yang saya sewa untuk &lt;a href=&#34;https://blog.inweeks.com/&#34;&gt;blog ini&lt;/a&gt; dan &lt;a href=&#34;https://jasawebsitebanjarmasin.com&#34;&gt;JasaWebsiteBanjarmasin.com&lt;/a&gt; sudah mau habis (oktober 2017), jadi saya putuskan untuk mencobanya.&lt;/p&gt;
&lt;p&gt;Setelah berhasil mendaftar, &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;mendeploy satu VM Instance (VPS)&lt;/a&gt;, setup web servernya, deploy websitenya, kemudian update nameserver domain ke google cloud, akhirnya kedua web ini akan berjalan di VPS dari google itu. Alhadulillah &amp;ldquo;selamat&amp;rdquo; budget untuk hosting 12 bulan kedepan. :D&lt;/p&gt;
&lt;p&gt;Nah, pada artikel ini saya akan share untuk teman-teman yang mungkin ingin mencobanya.&lt;/p&gt;
&lt;h3 id=&#34;mendaftar-google-cloud-platform&#34;&gt;Mendaftar Google Cloud Platform&lt;/h3&gt;
&lt;p&gt;Langkah pertama yang kita lakukan adalah &lt;strong&gt;mendaftar&lt;/strong&gt; ke &lt;a href=&#34;https://console.cloud.google.com&#34;&gt;Google Cloud Platform&lt;/a&gt;. Syaratnya kita harus memiliki &lt;strong&gt;Kartu Kredit&lt;/strong&gt; yang masih berlaku.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buka halaman web &lt;a href=&#34;https://console.cloud.google.com&#34;&gt;Google Cloud Platform&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Login dengan akun google/gmail.&lt;/li&gt;
&lt;li&gt;Hingga mencapai halaman ini, klik &lt;strong&gt;TRY FOR FREE&lt;/strong&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-01.jpg&#34; alt=&#34;Google Cloud Platform Homepage&#34;&gt;&lt;/li&gt;
&lt;li&gt;Isi Formulirnya, klik &lt;strong&gt;Aggree and continue&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-02.jpg&#34; alt=&#34;Google Cloud Platform Acceptance&#34;&gt;&lt;/li&gt;
&lt;li&gt;Isi Formulir &lt;strong&gt;Data Diri&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-03.jpg&#34; alt=&#34;Google Cloud Platform Form&#34;&gt;&lt;/li&gt;
&lt;li&gt;Isi Data &lt;strong&gt;Kartu Kredit&lt;/strong&gt;.&lt;br&gt;
Info dari google, kartu kredit &lt;strong&gt;tidak ada charge tanpa sepengetahuan user&lt;/strong&gt; (kita), selama 12 bulan, kita tetap akan menggunakan &lt;strong&gt;kredit $300 gratis&lt;/strong&gt; dari google.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Start my free trial&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-04.jpg&#34; alt=&#34;Google Cloud Platform Credit Card&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pendaftaran selesai, dan seharusnya kita sudah bisa mengakses halaman ini: &lt;a href=&#34;https://console.cloud.google.com/home&#34;&gt;https://console.cloud.google.com/home&lt;/a&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-05.jpg&#34; alt=&#34;Google Cloud Platform Dashboard&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;membuat-project-baru&#34;&gt;Membuat Project Baru&lt;/h3&gt;
&lt;p&gt;Untuk dapat memulai menggunakan &lt;strong&gt;VPS&lt;/strong&gt; atau &lt;strong&gt;VM Instance Google Cloud Engine&lt;/strong&gt;, kita harus membuat Project dulu.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buka Menu &lt;strong&gt;Products &amp;amp; services&lt;/strong&gt; (kiri atas) → &lt;strong&gt;Compute Engine&lt;/strong&gt; → &lt;strong&gt;VM Instances&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-06.jpg&#34; alt=&#34;Google Cloud Platform Menu&#34;&gt;&lt;/li&gt;
&lt;li&gt;Pada &lt;strong&gt;Project Name&lt;/strong&gt;, input nama project yang diinginkan, misal Project VPS Saya.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Create&lt;/strong&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-07.jpg&#34; alt=&#34;Google Cloud Platform Create Project&#34;&gt;&lt;/li&gt;
&lt;li&gt;Selesai, mestinya sekarang kita sudah bisa &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;membuat VM Instance baru&lt;/a&gt;.
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-08.jpg&#34; alt=&#34;Google Cloud Engine&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;sisa-kredit-billing&#34;&gt;Sisa Kredit Billing&lt;/h3&gt;
&lt;p&gt;Jika kita sudah mendaftar dan mulai menggunakan VM Instance Google Cloud Engine, kita bisa melihat Sisa Kredit Billing yang kita dapatkan dari google.&lt;/p&gt;
&lt;p&gt;Menu : &lt;strong&gt;Products &amp;amp; services&lt;/strong&gt; (kiri atas) → &lt;strong&gt;Billing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-02-02-mendapatkan-free-credit-usd-300-google-compute-engine-09.jpg&#34; alt=&#34;Google Cloud Platform Menu&#34;&gt;&lt;/p&gt;
&lt;p&gt;Di sini kita bisa lihat, kredit akan berkurang selama kita men-deploy VM Instance.&lt;/p&gt;
&lt;h3 id=&#34;penutup&#34;&gt;Penutup&lt;/h3&gt;
&lt;p&gt;Selama 5 bulan pemakaian (sampai artikel ini ditulis), saya mendeploy 1 VM Instance secara tetap, dan beberapa kali bongkar pasang VM Instance untuk keperluan riset, alhamdulillah belum ada charge yang dikenakan google untuk pembayaran Google Cloud Engine ini.&lt;/p&gt;
&lt;p&gt;Sip, sampai di sini kita sudah siap men-deploy dan menggunakan VM Instance Google Cloud Engine untuk web server. Insya Allah pada artikel berikutnya kita akan bahas tentang &lt;a href=&#34;https://blog.inweeks.com/web-server/deploy-vps-vm-instance-google-compute-engine/&#34;&gt;cara deploy VM Instance&lt;/a&gt; dan perhitungan estimasi biaya bulanannya.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktu teman-teman sudah membaca. Mudah-mudahan artikel ini bermanfaat bagi yang membutuhkannya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Mencatat Bug dan Small Improvement dengan Bitbucket Issue</title>
       <link>https://blog.inweeks.com/tool/mencatat-bug-dan-small-improvement-dengan-bitbucket-issue/</link>
       <pubDate>Sat, 20 Jan 2018 21:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/mencatat-bug-dan-small-improvement-dengan-bitbucket-issue/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Misal teman-teman programmer/software developer telah selesai mengerjakan sebuah software (misalkan project untuk user/klien) dan software tersebut dalam masa uji coba, kita cenderung mendapatkan &lt;strong&gt;laporan bug&lt;/strong&gt; terkait software tersebut. Bagaimana cara &lt;strong&gt;mencatat laporan&lt;/strong&gt; tersebut agar &lt;strong&gt;mudah diingat/dibuka kembali&lt;/strong&gt; ketika ingin mengerjakan perbaikannya?&lt;/p&gt;
&lt;p&gt;Atau ketika ada &lt;strong&gt;permintaan improvement&lt;/strong&gt; kecil dari user/klien. Bagaimana apa sarana yang digunakan &lt;strong&gt;mencatat&lt;/strong&gt; permintaan tersebut untuk &lt;strong&gt;memastikan tidak ada yang terlewat&lt;/strong&gt; oleh kita (saat dikerjakan)?&lt;/p&gt;
&lt;h3 id=&#34;sarana-mencatat-bug-reportimprovement-request&#34;&gt;Sarana Mencatat Bug Report/Improvement Request&lt;/h3&gt;
&lt;p&gt;Ada beberapa sarana (catatan) yang mungkin kita andalkan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;ldquo;Scroll back&amp;rdquo; diskusi melalui Chat&lt;/li&gt;
&lt;li&gt;Mencari diskusi pada Email&lt;/li&gt;
&lt;li&gt;Membuat &lt;strong&gt;catatan file .txt&lt;/strong&gt; atau .odt yang kita buat saat meeting&lt;/li&gt;
&lt;li&gt;Catatan tulis tangan saat kita meeting&lt;/li&gt;
&lt;li&gt;Pada sebuah Board Trello yang sudah kita siapkan&lt;/li&gt;
&lt;li&gt;Atau buat issue pada hosted repo di github/bitbucket/gitlab.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Saya sudah mencoba sarana point 1 s/d 5, dan akhirnya yang paling rutin saya lakukan adalah point 3 karena paling mudah dan cepat. Sedangkan point 6 (saya bayangkan) hanya bisa diterapkan pada sebuah project yang dikerjakan dengan kolaborasi, karena keterlibatan banyak orang dan pasti ada project leader dalam project tersebut. Dan sarana itu juga lengkap dengan fitur &amp;ldquo;penugasan&amp;rdquo;, maka akan sangat membantu dalam pembagian tanggung jawab pada project yang dikerjakan secara kolaborasi.&lt;/p&gt;
&lt;p&gt;Yap, selama ini saya mengandalkan file-file &lt;strong&gt;.txt&lt;/strong&gt; yang saya buat saat meeting/chat dengan klien, dan kembali membuka file-file tersebut untuk mengingat hal-hal yang harus saya kerjakan. Setiap item yang &lt;strong&gt;sudah dikerjakan&lt;/strong&gt;, saya tambahkan tanda &lt;strong&gt;(done)&lt;/strong&gt; disampingnya. Seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-20-mencatat-bug-dan-small-improvement-dengan-bitbucket-issue-01.jpg&#34; alt=&#34;Notes on txt file&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tradisionil&lt;/em&gt; ya? Hehe..&lt;/p&gt;
&lt;p&gt;Setidaknya ini usaha saya agar tidak lalai terhadap pekerjaan yang harus saya kerjakan. Untuk &lt;strong&gt;minimalisir&lt;/strong&gt; kata &lt;strong&gt;&amp;ldquo;saya lupa&amp;rdquo;&lt;/strong&gt; (yang sering sekali menjadi perkara).&lt;/p&gt;
&lt;h3 id=&#34;menggunakan-bitbucket-issue&#34;&gt;Menggunakan Bitbucket Issue&lt;/h3&gt;
&lt;p&gt;Baru-baru ini, saya menyadari, bahwa sarana point 6 di atas juga bisa digunakan untuk project yang dikerjakan sendiri (misal oleh seorang &lt;em&gt;freelancer&lt;/em&gt; atau seorang &lt;em&gt;single fighter&lt;/em&gt; dalam sebuah instansi). Coba teman-teman lihat ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-20-mencatat-bug-dan-small-improvement-dengan-bitbucket-issue-02.jpg&#34; alt=&#34;Bitbucket issue on feature request&#34;&gt;&lt;/p&gt;
&lt;p&gt;Disitu kita bisa lihat, &lt;strong&gt;catatan txt&lt;/strong&gt; saat meeting dengan klien (yang saya buat di atas), &lt;strong&gt;setiap item&lt;/strong&gt; bisa kita input menjadi &lt;strong&gt;sebuah issue&lt;/strong&gt; di repo bitbucket. Kalau sudah diinput seluruhnya (hasil meeting tadi), maka di bitbucket issue kita bisa lihat :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mana item yang &lt;strong&gt;sudah&lt;/strong&gt; dikerjakan,&lt;/li&gt;
&lt;li&gt;Mana yang &lt;strong&gt;belum&lt;/strong&gt; dikerjakan,&lt;/li&gt;
&lt;li&gt;Mana yang &lt;strong&gt;prioritas&lt;/strong&gt;nya tinggi,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sifat&lt;/strong&gt; issue (bug atau improvement atau lainnya)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kapan&lt;/strong&gt; issue dibuat&lt;/li&gt;
&lt;li&gt;Kapan &lt;strong&gt;solved/update&lt;/strong&gt; terakhir (ketahuan jika ada yang sudah lama tidak di-follow-up)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Siapa&lt;/strong&gt; yang bertugas (kalau sendirian ya tentu nama kita di situ :D )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mantap ya, banyak manfaat yang kita dapatkan. Kemudian jika kita lihat detail salah satu issue seperti di bawah ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-20-mencatat-bug-dan-small-improvement-dengan-bitbucket-issue-03.jpg&#34; alt=&#34;Bitbucket issue detail&#34;&gt;&lt;/p&gt;
&lt;p&gt;Maka kita bisa melihat :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Siapa yang buat issue&lt;/li&gt;
&lt;li&gt;Ada komentar (kalau perlu mencatat detailnya)&lt;/li&gt;
&lt;li&gt;Kalau statusnya closed kelihatan siapa yang mengerjakan.&lt;/li&gt;
&lt;li&gt;Commit-commit yang berkaitan dengan issue ini, jika direferensikan pada commit message.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lebih keren, kan ya, dari pada mengandalkan catatan yang di file txt? Menurut saya, iya. :D&lt;/p&gt;
&lt;h3 id=&#34;input-issue-di-bitbucket&#34;&gt;Input Issue di Bitbucket&lt;/h3&gt;
&lt;p&gt;Pada saat kita klik &lt;strong&gt;Create Issue&lt;/strong&gt; pada Bitbucket, kita akan mendapatkan formulir seperti ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-20-mencatat-bug-dan-small-improvement-dengan-bitbucket-issue-04.jpg&#34; alt=&#34;Bitbucket create new Issue&#34;&gt;&lt;/p&gt;
&lt;p&gt;Berikut keterangannya :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Title&lt;/strong&gt; adalah judul issue, &lt;strong&gt;deskripsi singkat&lt;/strong&gt; tentang masalah/item pekerjaan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; adalah &lt;strong&gt;penjelasan&lt;/strong&gt; tentang masalah/item pekerjaan secara detail, agar mudah dipahami oleh orang yang akan ditugasi, deskripsi dapat ditulis dengan format &lt;a href=&#34;https://en.wikipedia.org/wiki/Markdown&#34;&gt;&lt;strong&gt;Markdown&lt;/strong&gt;&lt;/a&gt; dan dapat kita review terlebih dahulu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignee&lt;/strong&gt; adalah &lt;strong&gt;petugas&lt;/strong&gt; yang bertanggung jawab terhadap issue ini, baik developer atau penanggung jawab (PIC).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kind&lt;/strong&gt; adalah jenis issue. Bisa berupa &lt;strong&gt;Bug&lt;/strong&gt;, &lt;strong&gt;Enhancement&lt;/strong&gt;, &lt;strong&gt;Proposal&lt;/strong&gt;, atau &lt;strong&gt;Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;/strong&gt; adalah prioritas atau &lt;strong&gt;tingkat urgensi&lt;/strong&gt; masalah yang dilaporkan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attachment&lt;/strong&gt; adalah lampiran file pendukung untuk masalah tersebut, misalnya &lt;strong&gt;screenshot&lt;/strong&gt; software atau lainnya.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dengan pengisian yang lengkap dan jelas pada formulir ini, maka masalah yang dilaporkan akan mudah dipahami oleh penanggung jawab, atau bahkan oleh kita sendiri (untuk memastikan kita tidak lupa).&lt;/p&gt;
&lt;h3 id=&#34;manfaat-history-issue-bitbucket&#34;&gt;Manfaat History Issue Bitbucket&lt;/h3&gt;
&lt;p&gt;Ketika semua catatan hasil meeting dan laporan temuan bug dicatat pada fitur Issue private repo Bitbucket kita, otomatis semua catatan akan tersimpan kan ya? Ini sangat bermanfaat agar kita dapat :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;ldquo;Trace back&amp;rdquo; apa saja yang telah dikerjakan&lt;/li&gt;
&lt;li&gt;Mengetahui beberapa banyak bug yang kita tangani&lt;/li&gt;
&lt;li&gt;Mengetahui berapa banyak improvement yang diminta oleh User/Klien&lt;/li&gt;
&lt;li&gt;Review kapan kita menyelesaikan issue yang mana&lt;/li&gt;
&lt;li&gt;Review siapa yang menyelesaikan issue yang mana&lt;/li&gt;
&lt;li&gt;Evaluasi dari titik ketika project kita anggap selesai sampai project benar-benar selesai.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Baik, kita ambil kesimpulan dari artikel ini, yaitu jika kita menggunakan fitur bitbucket issue untuk mencatat item-item pekerjaan terkait bug dan small improvement dalam sebuah project, kita mendapatkan beberapa manfaat :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Catatan &lt;strong&gt;laporan problem terpusat&lt;/strong&gt; di satu tempat&lt;/li&gt;
&lt;li&gt;Catatan &lt;strong&gt;permintaan improvement&lt;/strong&gt; (feature request) &lt;strong&gt;terpusat&lt;/strong&gt; di satu tempat&lt;/li&gt;
&lt;li&gt;Memilah mana item pekerjaan yang &lt;strong&gt;sudah&lt;/strong&gt; dan &lt;strong&gt;belum dikerjakan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Memilah mana item pekerjaan yang harus dikerjakan duluan sesuai &lt;strong&gt;prioritasnya&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Evaluasi seberapa banyak &lt;strong&gt;bug&lt;/strong&gt; yang ditemukan oleh user/klien&lt;/li&gt;
&lt;li&gt;Evaluasi seberapa banyak &lt;strong&gt;small improvement&lt;/strong&gt; yang diminta oleh user/klien&lt;/li&gt;
&lt;li&gt;Minimalisir hilang catatan dan kata &amp;ldquo;saya lupa&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Satu catatan dari saya untuk pemanfaatan sarana ini (dari sudut pandang &lt;em&gt;freelancer&lt;/em&gt;). Sarana ini &lt;strong&gt;hanya cocok&lt;/strong&gt; untuk mencatat &lt;strong&gt;laporan bug&lt;/strong&gt; dan &lt;strong&gt;improvement kecil&lt;/strong&gt; untuk sebuah project, &lt;strong&gt;kurang cocok&lt;/strong&gt; jika digunakan untuk mencatat &lt;strong&gt;fitur-fitur utama&lt;/strong&gt; project atau pembagian tugas &lt;strong&gt;sejak awal project&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Karena jika digunakan sejak awal project, banyak waktu akan habis untuk menulis issue ini. Kecuali ada pertimbangan yang mungkin belum terpikir oleh saya.&lt;/p&gt;
&lt;p&gt;Tentunya manfaat-manfaat tersebut di atas bersifat subyektif berdasarkan opini saya pribadi. Jika teman-teman memiliki opini lain, silakan disampaikan pada komentar, agar saya mendapatkan pencerahan baru dari teman-teman.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya, semoga tulisan ini menjadi manfaat untuk kita semua. Aamiin..&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Tips untuk Workflow TDD</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-tips-untuk-workflow-tdd/</link>
       <pubDate>Fri, 05 Jan 2018 22:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-tips-untuk-workflow-tdd/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Ketika mengerjakan project Laravel dengan metode &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-test-driven-development/&#34;&gt;TDD&lt;/a&gt;, bisa jadi &lt;strong&gt;ada kejenuhan&lt;/strong&gt;. Misalnya kita &amp;ldquo;terpaksa&amp;rdquo; harus mengetik perintah &lt;code&gt;vendor/bin/phpunit&lt;/code&gt; di terminal setiap kali kita ingin menjalankan PHPUnit. &lt;em&gt;Well&lt;/em&gt;, jenuh juga mengetik perintah itu &lt;strong&gt;berulang-ulang&lt;/strong&gt;, atau kita bolak-balik ke terminal untuk menekan tombol &lt;code&gt;panah atas&lt;/code&gt; (history terminal), kemudian tekan tombol &lt;code&gt;Enter&lt;/code&gt; untuk menjalankan PHPUnit.&lt;/p&gt;
&lt;p&gt;Atau ketika kita menjalankan testing, kita &lt;strong&gt;menunggu testing berjalan&lt;/strong&gt; hingga sampai titik yang sedang dikerjakan, padahal (sebenarnya) &lt;strong&gt;hanya perlu&lt;/strong&gt; menjalankan testing untuk satu fitur yang sedang dikerjakan saja.&lt;/p&gt;
&lt;p&gt;Atau saat testing berjalan, prosesnya ada yang lambat, tetapi kita tidak tahu proses yang lambat itu pada Test Case atau Test method yang mana?&lt;/p&gt;
&lt;h3 id=&#34;problem&#34;&gt;Problem&lt;/h3&gt;
&lt;p&gt;Nah, problem seperti ini saya temukan di 1-6 bulan pertama saya belajar TDD :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menjalankan perintah PHPUnit &lt;strong&gt;berulang-ulang&lt;/strong&gt; (ini melanggar &lt;a href=&#34;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&#34;&gt;DRY&lt;/a&gt;, kan?).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menunggu jalannya testing&lt;/strong&gt; hingga sampai titik yang sedang dikerjakan (menunggu error muncul).&lt;/li&gt;
&lt;li&gt;Semua testing &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt;, tetapi prosesnya lambat, dan &lt;strong&gt;tidak tahu di titik mana testing yang lambat&lt;/strong&gt; itu terjadi (karena yang tampil di terminal hanya titik-titik saja).&lt;/li&gt;
&lt;li&gt;Problem di database, di mana data yang di-&lt;em&gt;generate&lt;/em&gt; oleh model factory (saat jalannya testing) dapat menjadikan hasil test yang berbeda.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dari beberapa problem tersebut, saya mencari tips dari artikel-artikel di internet untuk menemukan solusinya.&lt;/p&gt;
&lt;h3 id=&#34;solusi-dan-tips&#34;&gt;Solusi dan Tips&lt;/h3&gt;
&lt;p&gt;Berikut ini beberapa tips dan solusi yang bisa saya bagi ke teman-teman, mungkin ada yang belum tahu dan bisa menjadi referensi.&lt;/p&gt;
&lt;h6 id=&#34;run-test-on-file-change&#34;&gt;Run Test on file change&lt;/h6&gt;
&lt;p&gt;Solusi untuk problem pertama kita adalah &lt;a href=&#34;https://github.com/spatie/phpunit-watcher&#34;&gt;&lt;strong&gt;PHPUnit Watcher&lt;/strong&gt;&lt;/a&gt;. Ketika kita menjalankan perintah &lt;code&gt;phpunit-watcher watch&lt;/code&gt; pada project Laravel kita, maka dia akan menjalankan PHPUnit, kemudian menunggu perubahan file &lt;code&gt;.php&lt;/code&gt; yang ada di dalam direktori &lt;code&gt;app&lt;/code&gt; dan &lt;code&gt;tests&lt;/code&gt; dalam project Laravel kita.&lt;/p&gt;
&lt;p&gt;Yap, ketika phpunit-watcher ini &amp;ldquo;standby&amp;rdquo;, &lt;strong&gt;setiap ada file php yang di-save&lt;/strong&gt; pada kedua direktori tersebut, &lt;strong&gt;PHPUnit langsung dijalankan&lt;/strong&gt;, kemudian memberikan hasilnya (passed atau failed) dengan &lt;strong&gt;notifikasi desktop&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dampak positifnya, kita tidak perlu repot bolak balik terminal untuk menjalankan &lt;code&gt;vendor/bin/phpunit&lt;/code&gt;. Kita bisa fokus &lt;em&gt;&amp;ldquo;ngoding&amp;rdquo;&lt;/em&gt; di text-editor atau IDE kita. Ini sangat efektif dalam &lt;strong&gt;memangkas waktu development&lt;/strong&gt; kita dalam workflow TDD. Jika teman-teman ingin mencobanya, silakan langsung ikuti petunjuk instalasinya.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/spatie/phpunit-watcher&#34;&gt;https://github.com/spatie/phpunit-watcher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ini screenshot phpunit-watcher saat &amp;ldquo;standby&amp;rdquo; menunggu perubahan file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-06.jpg&#34; alt=&#34;phpunit-watcher in action&#34;&gt;&lt;/p&gt;
&lt;p&gt;Referensi:&lt;br&gt;
Saya dapat tips tentang tool ini dari video &lt;a href=&#34;https://www.youtube.com/watch?v=CF1UhUj9LG0&amp;amp;t=26m13s&#34;&gt;Laracon EU Amo Chohan&lt;/a&gt;. Kalau teman-teman ada waktu, silakan lihat videonya dari awal sampai selesai, tips-tipsnya sangat bermanfaat.&lt;/p&gt;
&lt;h6 id=&#34;menggunakan-trait-databasetransaction&#34;&gt;Menggunakan trait DatabaseTransaction&lt;/h6&gt;
&lt;p&gt;Trait &lt;code&gt;DatabaseTransaction&lt;/code&gt; pada Test Case class Laravel adalah alat bantu yang akan &lt;strong&gt;mengembalikan kondisi database&lt;/strong&gt; kita setiap sebuah test method selesai dijalankan. Dengan bantuan trait ini, kita tinggal melakukan persiapan data pada database khusus untuk testing (pada project yang bersangkutan).&lt;/p&gt;
&lt;p&gt;Script-script testing kita dapat menggunakan record-record pada database tersebut saat menjalankan test. &lt;strong&gt;Setiap satu testing method selesai, database dikembalikan seperti semula&lt;/strong&gt;. Trait ini sangat berguna saat kita ingin mulai membuat testing untuk project Laravel existing yang belum ada testingnya.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips:&lt;br&gt;
Jika ingin mulai membuat testing untuk project Laravel existing, jangan lupa memisahkan database yang digunakan untuk testing dengan database aplikasi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h6 id=&#34;mendeteksi-test-method-yang-lambat&#34;&gt;Mendeteksi test method yang lambat&lt;/h6&gt;
&lt;p&gt;Seperti yang kita bahas pada paragraf pembuka di atas, ada kalanya testing berjalan lambat, tapi kita tidak mengetahui pada test method mana yang prosesnya lambat. Solusi yang bisa kita gunakan adalah sebuah paket bernama &lt;a href=&#34;https://github.com/johnkary/phpunit-speedtrap&#34;&gt;&lt;strong&gt;phpunit-speedtrap&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/johnkary/phpunit-speedtrap&#34;&gt;https://github.com/johnkary/phpunit-speedtrap&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;SpeedTrap helps you identify slow tests but cannot tell you why those tests are slow.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jadi tool ini hanya &lt;strong&gt;memberi tahu&lt;/strong&gt; kita jika ada &lt;strong&gt;testing yang berjalan lambat&lt;/strong&gt; (satu test jalan lebih dari &lt;code&gt;500ms&lt;/code&gt;), tetapi dia tidak dapat memberitahu kenapa testingnya lambat. Tugas kita lah sebagai developer untuk menemukannya.&lt;/p&gt;
&lt;p&gt;Beberapa hal yang saya temukan dapat membuat testing lambat :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Terlalu banyak meng-&lt;em&gt;generate&lt;/em&gt; record yang &amp;ldquo;tidak perlu&amp;rdquo; melalui model factory. Karena itu kita perlu memperhatikan ini pada saat membuat model factory :&lt;br&gt;
&lt;a href=&#34;https://laravel.com/docs/5.5/database-testing#using-factories&#34;&gt;Using Factories -&amp;gt; Relationships -&amp;gt; Relations &amp;amp; Attribute Closures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Terdapat N+1 problem pada aplikasi controller/view yang sedang di-test. Apa itu N+1? Yaitu ada query ke database dalam sebuah loop. Referensinya lihat &lt;a href=&#34;https://laracasts.com/lessons/eager-loading&#34;&gt;di sini&lt;/a&gt; atau &lt;a href=&#34;https://laracasts.com/discuss/channels/general-discussion/what-is-the-meaning-of-the-n-1-problem&#34;&gt;di sini&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ada &lt;em&gt;batch insert&lt;/em&gt; record ke dalam database yang terlalu banyak dalam satu test.&lt;/li&gt;
&lt;li&gt;Terdapat API Request ke pihak ketiga, di mana request tersebut bergantung kepada koneksi internet PC/laptop kita.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jadi ketika sudah menggunakan &lt;a href=&#34;https://github.com/johnkary/phpunit-speedtrap&#34;&gt;&lt;strong&gt;phpunit-speedtrap&lt;/strong&gt;&lt;/a&gt; ini, kita mendapat &lt;strong&gt;kesempatan untuk me-refactor testing&lt;/strong&gt; kita agar lebih optimal. Contoh penggunaannya? Silakan coba install project &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;&lt;strong&gt;Free PMO&lt;/strong&gt;&lt;/a&gt; di localhost teman-teman, kemudian jalankan testingnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-08.jpg&#34; alt=&#34;PHPUnit SpeedTrap in action&#34;&gt;&lt;/p&gt;
&lt;h6 id=&#34;menggunakan-command-option---filter&#34;&gt;Menggunakan command option &amp;lsquo;&amp;ndash;filter&amp;rsquo;&lt;/h6&gt;
&lt;p&gt;Ketika testing kita sudah mulai banyak, pastinya kita akan menunggu jalannya testing lebih lama. Bandingkan testing untuk dua project berikut :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-01.jpg&#34; alt=&#34;Many Test Methods&#34;&gt;&lt;/p&gt;
&lt;p&gt;dengan&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-02.jpg&#34; alt=&#34;Few Test Methods&#34;&gt;&lt;/p&gt;
&lt;p&gt;Jika kita memiliki &lt;strong&gt;banyak test method&lt;/strong&gt; (yang dilambangkan dengan satu tanda titik), maka &lt;strong&gt;semakin lama&lt;/strong&gt; waktu yang diperlukan oleh PHPUnit untuk menyelesaikan seluruh test.&lt;/p&gt;
&lt;p&gt;Jika kita ingin membatasi agar PHPUnit menjalankan test &lt;strong&gt;hanya pada bagian tertentu&lt;/strong&gt; saja, maka kita bisa gunakan option command &lt;code&gt;--filter&lt;/code&gt;. Contoh :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit --filter ReceiptCollectionTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-03.jpg&#34; alt=&#34;Filter Tests&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;ReceiptCollectionTest&amp;rdquo;&lt;/strong&gt; adalah (semacam) kata kunci. Kata kunci ini dapat berupa (bagian dari) &lt;strong&gt;nama class TestCase&lt;/strong&gt; atau (bagian dari) &lt;strong&gt;nama test method&lt;/strong&gt;. Jadi hanya class test case atau test method itu saja yang akan dijalankan oleh PHPUnit (disesuaikan dengan fitur yang sedang kita kerjakan).&lt;/p&gt;
&lt;h6 id=&#34;menggunakan-command-option---stop-on-failure&#34;&gt;Menggunakan command option &amp;lsquo;&amp;ndash;stop-on-failure&amp;rsquo;&lt;/h6&gt;
&lt;p&gt;Langsung pada contohnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit --filter ReceiptCollectionTest --stop-on-failure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-04.jpg&#34; alt=&#34;Tests Stop on Failure&#34;&gt;&lt;/p&gt;
&lt;p&gt;Dari situ kita bisa lihat, command option &lt;code&gt;--stop-on-failure&lt;/code&gt; adalah perintah kepada PHPUnit agar segera menghentikan jalannya test ketika menemukan test yang gagal (ada pesan error). Tujuannya agar kita tidak perlu menunggu sampai testing selesai dijalankan untuk melihat pesan error yang tampil pada terminal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Btw, kita juga dapat memberikan command option ini pada saat menggunakan &lt;a href=&#34;#run-test-on-file-changes&#34;&gt;&lt;strong&gt;phpunit-watcher&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h6 id=&#34;menggunakan-script-hashsetrounds5&#34;&gt;Menggunakan script &amp;lsquo;Hash::setRounds(5)&amp;rsquo;&lt;/h6&gt;
&lt;p&gt;Nah, script &lt;code&gt;Hash::setRounds(5)&lt;/code&gt; ini benar-benar mengurangi durasi waktu test, utamanya jika script-script testing ada yang melibatkan function &lt;code&gt;bcrypt()&lt;/code&gt;. Umumnya jika dalam testing kita menggunakan &lt;strong&gt;fitur autentikasi&lt;/strong&gt; atau &lt;strong&gt;login user&lt;/strong&gt;, kemungkinan besar menggunakan &lt;code&gt;bcrypt()&lt;/code&gt; ini, yaitu pada &lt;strong&gt;factory&lt;/strong&gt; untuk model &lt;code&gt;User&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kita bisa menempatkan script &lt;code&gt;Hash::setRounds(5)&lt;/code&gt; ini pada class Base TestCase kita. Contoh penggunannya, kita bisa cek script ini digunakan pada trait &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/CreatesApplication.php#L26&#34;&gt;&lt;strong&gt;CreatesApplication.php&lt;/strong&gt;&lt;/a&gt; di project &lt;strong&gt;Free PMO&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Jika kita jalankan testnya:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-05.jpg&#34; alt=&#34;Tests with Hash::setRounds&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kemudian uncomment &lt;code&gt;Hash::setRounds(5)&lt;/code&gt; trait &lt;strong&gt;CreatesApplication.php&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// tests/createApplication.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createApplication&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $app &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;__DIR__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/../bootstrap/app.php&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $app&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;make&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Kernel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;bootstrap&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// \Hash::setRounds(5);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; $app;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jika kita jalankan testing lagi :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2018-01-05-testing-laravel-tips-untuk-workflow-tdd-07.jpg&#34; alt=&#34;Tests with out Hash::setRounds&#34;&gt;&lt;/p&gt;
&lt;p&gt;Nah kelihatan, kan? Lumayan selisih waktunya &lt;strong&gt;2x lipat lebih cepat&lt;/strong&gt;. Artinya script &lt;code&gt;Hash::setRounds(5)&lt;/code&gt; ini sangat berpengaruh pada kecepatan jalannya testing kita.&lt;/p&gt;
&lt;p&gt;Saya belum tahu persis apa makna/fungsi dari script ini. Silakan teman-teman cek artikel ini &lt;a href=&#34;https://driesvints.com/blog/two-tips-to-speedup-your-laravel-tests&#34;&gt;Two tips to speedup your Laravel tests&lt;/a&gt;.&lt;/p&gt;
&lt;h6 id=&#34;memanfaatkan-bash-aliases&#34;&gt;Memanfaatkan (Bash) Aliases&lt;/h6&gt;
&lt;p&gt;Saya menggunakan OS Ubuntu 16.04 untuk bekerja. Saya mendaftarkan alias perintah-perintah yang sering digunakan untuk mempercepat mengetik perintah di terminal. Beberapa yan saya gunakan untuk mempercepat workflow TDD Laravel :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# phpunit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias punit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;vendor/bin/phpunit&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias punitf&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;vendor/bin/phpunit --filter&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias punits&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;vendor/bin/phpunit --stop-on-failure&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias punitsf&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;vendor/bin/phpunit --stop-on-failure --filter&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# phpunit-watcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias wpunit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;phpunit-watcher watch&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias wpunitf&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;phpunit-watcher watch --filter&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias wpunits&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;phpunit-watcher watch --stop-on-failure&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias wpunitsf&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;phpunit-watcher watch --stop-on-failure --filter&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Nah demikian teman-teman, kita sudah membahas beberapa tips yang biasa saya gunakan dan manfaatkan untuk &lt;strong&gt;mempermudah&lt;/strong&gt;, &lt;strong&gt;mempercepat&lt;/strong&gt;, dan &lt;strong&gt;mengurangi kejenuhan&lt;/strong&gt; dalam menerapkan workflow Test-Driven Development dalam project Laravel. Mudah-mudahan bermanfaat menjadi referensi bagi teman-teman yang membutuhkan.&lt;/p&gt;
&lt;p&gt;Jika ada masukan terkait tips-tips ini, atau ada tips lain yang bisa teman-teman share, silakan disampaikan di komentar.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Apa Saja yang Perlu Dibuatkan Test?</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-apa-saja-yang-ditest/</link>
       <pubDate>Sat, 30 Dec 2017 15:20:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-apa-saja-yang-ditest/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Jika kita baru mulai menerapkan Test-Driven Development dalam mengerjakan project, mungkin awalnya kita bingung, bagian mana saja yang perlu dibuatkan testing? Oke lah, yang jelas fitur CRUD, lalu pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-refactor-controller-dengan-model-behaviour/&#34;&gt;artikel yang lalu&lt;/a&gt; kita sudah tahu tentang Model Behaviour, kita juga perlu membuat unit testing untuk itu. Lalu apa lagi yang perlu kita buat test selain itu? Baik kita bahas sama-sama bagian mana saja (yang menurut saya) harus kita buatkan &lt;em&gt;testing script&lt;/em&gt;nya.&lt;/p&gt;
&lt;p&gt;Di sini juga akan kita bahas pembagian level &lt;strong&gt;class Test Case&lt;/strong&gt; (class &lt;em&gt;testing script&lt;/em&gt;) dari yang saya pahami dan terapkan secara umum. Apakah sebuah Test Case masuk ke level &lt;strong&gt;Feature Test&lt;/strong&gt; atau ke level &lt;strong&gt;Unit Test&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;level-feature-test&#34;&gt;Level Feature Test&lt;/h3&gt;
&lt;p&gt;Pada bagian ini, class Test Case ditempatkan pada direktori &lt;code&gt;tests/Feature&lt;/code&gt; di project Laravel. Test Case yang masuk ke dalam Feature test adalah fitur-fitur utama dalam aplikasi, seperti entry data, edit data, hapus data dan API endpoint.&lt;/p&gt;
&lt;h5 id=&#34;1-fitur-crud&#34;&gt;1. Fitur CRUD&lt;/h5&gt;
&lt;p&gt;Pertama yang utama adalah fitur-fitur yang berinteraksi dengan &lt;strong&gt;perubahan record pada database&lt;/strong&gt;. Misalnya fitur entry artikel, edit artikel, hapus artikel, pengelolaan kategori artikel, dan fitur-fitur lain. Dalam Test Case ini kita definisikan fitur sesuai dengan spesifikasi kita.&lt;/p&gt;
&lt;p&gt;Misalnya, saat &lt;strong&gt;&amp;ldquo;create&amp;rdquo;&lt;/strong&gt; record, field-fieldnya apa saja, mana yang wajib diisi, mana yang &lt;em&gt;nullable&lt;/em&gt;. Kemudian saat &lt;strong&gt;&amp;ldquo;update&amp;rdquo;&lt;/strong&gt; record, mana yang wajib mana yang &lt;em&gt;nullable&lt;/em&gt;, dan saat &lt;strong&gt;&amp;ldquo;delete&amp;rdquo;&lt;/strong&gt; record, kondisi apa saya yang harus terpenuhi sehingga user boleh menghapus record tersebut dari database.&lt;/p&gt;
&lt;p&gt;Contoh class Test Case Fitur CRUD (silakan klik link untuk melihat source-code nya) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/free-pmo/tree/master/tests/Feature/Payments&#34;&gt;Fitur Pengelolaan Pembayaran&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/free-pmo/tree/master/tests/Feature/Partners&#34;&gt;Fitur Pengelolaan Customer dan Vendor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/tests/Feature/ManageProductsTest.php&#34;&gt;Fitur Pengelolaan Produk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/tests/Feature/TransactionEntryTest.php&#34;&gt;Fitur Input Transaksi Penjualan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/silsilah/blob/master/tests/Feature/UsersProfileTest.php&#34;&gt;Fitur Edit Profil User&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;2-api-endpoints&#34;&gt;2. API Endpoints&lt;/h5&gt;
&lt;p&gt;Jika pada sistem kita terdapat web service atau API, sebaiknya seluruh Endpoint API-nya dibuatkan test, untuk memastikan parameter yang dikirimkan ke endpoint, serta respons yang dihasilkan dari endpoint sudah sesuai dengan spesifikasi yang diinginkan.&lt;/p&gt;
&lt;p&gt;Mirip seperti Fitur CRUD pada point nomor 1 di atas, jika pada API Endpoint terdapat interaksi yang mengubah record pada database, sebaiknya pada Test Case untuk API Endpoint dibuatkan sesuai spesifikasi yang diinginkan.&lt;/p&gt;
&lt;p&gt;Contoh class Test Case Fitur API Endpoint :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Feature/Api/ApiEventsTest.php&#34;&gt;Fitur API Event Kalender&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/tests/Feature/Cart/SearchProductsTest.php&#34;&gt;Fitur Pencarian Produk dengan AJAX&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;level-unit-test&#34;&gt;Level Unit Test&lt;/h3&gt;
&lt;p&gt;Pada bagian ini, class-class Test Case kita akan masuk dalam direktori &lt;code&gt;tests/Unit&lt;/code&gt; pada project Laravel. Pertimbangannya adalah, karena kita &lt;strong&gt;menguji bagian-bagian&lt;/strong&gt; kecil dari sistem/aplikasi kita. Misalnya pengujian terhadap method-method khusus pada class Model (Model Behaviour), hak akses/otorisasi user terhadap sebuah model (record), pengujian &lt;em&gt;helper functions&lt;/em&gt;, dan pengujian untuk class-class PHP yang dibuat untuk membantu jalannya sistem.&lt;/p&gt;
&lt;h5 id=&#34;1-model-behaviour&#34;&gt;1. Model Behaviour&lt;/h5&gt;
&lt;p&gt;Seperti yang sempat kita bahas pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-refactor-controller-dengan-model-behaviour/&#34;&gt;artikel terdahulu&lt;/a&gt;, model behaviour adalah method-method khusus yang kita tambahkan pada class Model Laravel. Yang bertujuan untuk refactor method di controller, atau membuat source-code kita lebih &amp;ldquo;readable&amp;rdquo; karena mirip seperti pendelegasian tugas dan definisi &amp;ldquo;jobdeks&amp;rdquo; dari sebuah model.&lt;/p&gt;
&lt;p&gt;Termasuk di dalamnya pendefinisian relasi antar model (antar tabel) dan attribute model yang didefinisikan melalui &lt;a href=&#34;https://laravel.com/docs/5.5/eloquent-mutators#accessors-and-mutators&#34;&gt;Eloquent Accessor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contoh class Test Case Model Behaviour :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/Models/ProjectTest.php&#34;&gt;ProjectTest&lt;/a&gt;, untuk relationship dan method class model &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/Entities/Projects/Project.php&#34;&gt;Project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/Models/SubscriptionTest.php&#34;&gt;SubscriptionTest&lt;/a&gt;, untuk relationship dan method class model &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/Entities/Subscriptions/Subscription.php&#34;&gt;Subscription&lt;/a&gt; (langganan).&lt;/li&gt;
&lt;li&gt;Test Method &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/Models/JobTest.php#L39-L47&#34;&gt;a_job_has_progress_attribute&lt;/a&gt;, untuk menguji Eloquent Accessor atribute &amp;ldquo;progress&amp;rdquo; pada model &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/Entities/Projects/Job.php#L41-L44&#34;&gt;Job&lt;/a&gt;. Di mana &lt;strong&gt;nilai atribute progress&lt;/strong&gt; dihitung berdasarkan &lt;strong&gt;rata-rata progress task&lt;/strong&gt; pada job tersebut.&lt;/li&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/tests/Unit/Integration/ProductTest.php&#34;&gt;ProductTest&lt;/a&gt;, untuk class model &lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/app/Product.php&#34;&gt;Product&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/silsilah/blob/master/tests/Unit/PersonRelationsTest.php&#34;&gt;PersonRelationTest&lt;/a&gt;, untuk menguji hubungan antar (model) &lt;a href=&#34;https://github.com/nafiesl/silsilah/blob/master/app/User.php&#34;&gt;User&lt;/a&gt; para project Aplikasi Silsilah.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;2-model-policy&#34;&gt;2. Model Policy&lt;/h5&gt;
&lt;p&gt;Sedikit pengantar tentang &lt;a href=&#34;https://laravel.com/docs/5.5/authorization#writing-policies&#34;&gt;Model Policy&lt;/a&gt; Object pada Laravel, &lt;strong&gt;Model policy&lt;/strong&gt; adalah salah satu fitur Laravel yang (menurut saya) sangat bermanfaat untuk kebutuhan pengendalian akses user dalam sistem. Fitur ini benar-benar menghemat penggunaan fungsi &lt;strong&gt;&amp;ldquo;if&amp;rdquo;&lt;/strong&gt;, baik di view maupun di controller.&lt;/p&gt;
&lt;p&gt;Contoh kasusnya dalam sistem, misal halaman detail sebuah &amp;ldquo;project&amp;rdquo; dapat &lt;strong&gt;diakses oleh seluruh user&lt;/strong&gt;, tetapi &lt;strong&gt;&amp;ldquo;nilai project&amp;rdquo; hanya dapat dilihat&lt;/strong&gt; oleh user dengan role Project Manager dan Admin. Atau misal detail sebuah &amp;ldquo;job&amp;rdquo; dalam &amp;ldquo;project&amp;rdquo; &lt;strong&gt;hanya dapat di-edit&lt;/strong&gt; oleh project manager dan pekerja yang ditugaskan ke dalam project itu, petugas dengan job lain &lt;strong&gt;tidak boleh meng-edit&lt;/strong&gt;. Nah, model policy sangat bermanfaat untuk keperluan seperti ini.&lt;/p&gt;
&lt;p&gt;Contoh class Test Case Model Policy :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/silsilah/blob/master/tests/Unit/Policies/UserPolicyTest.php&#34;&gt;UserPolicyTest&lt;/a&gt;, untuk menguji class &lt;a href=&#34;https://github.com/nafiesl/silsilah/blob/master/app/Policies/UserPolicy.php&#34;&gt;UserPolicy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/Policies/CustomerPolicyTest.php&#34;&gt;CustomerPolicyTest&lt;/a&gt;, untuk menguji class &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/Policies/Partners/CustomerPolicy.php&#34;&gt;CustomerPolicy&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;4-service-class&#34;&gt;4. Service Class&lt;/h5&gt;
&lt;p&gt;Service class adalah class-class PHP yang kita buat pada project kita yang digunakan untuk membantu jalannya sistem. Misal aplikasi kita memiliki fitur &lt;strong&gt;Shopping Cart&lt;/strong&gt;, kemudian kita membuat sebuah class PHP bernama &lt;strong&gt;&amp;ldquo;Cart&amp;rdquo;&lt;/strong&gt; dengan berbagai method dan property didalamnya agar fitur Shopping Cart yang kita inginkan dapat berjalan sesuai spesifikasi.&lt;/p&gt;
&lt;p&gt;Untuk memastikan class &lt;strong&gt;&amp;ldquo;Cart&amp;rdquo;&lt;/strong&gt; (service class) tadi berjalan sesuai dengan target, maka kita membuatkan test case untuk class tersebut.&lt;/p&gt;
&lt;p&gt;Contoh class Test Case Service Class :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/tests/Unit/CartCollectionTest.php&#34;&gt;CartCollectionTest&lt;/a&gt;, untuk menguji service class &lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/app/Cart/CartCollection.php&#34;&gt;CartCollection&lt;/a&gt;. Service class ini digunakan pada fitur &lt;a href=&#34;https://github.com/nafiesl/grosir-obat#shopping-cart&#34;&gt;Shopping Cart atau Draft Transaksi&lt;/a&gt; untuk project Grosir Obat.&lt;/li&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/InvoiceDraftCollectionTest.php&#34;&gt;InvoiceDraftCollectionTest&lt;/a&gt;, untuk menguji service class &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/Services/InvoiceDraft/InvoiceDraftCollection.php&#34;&gt;InvoiceDraftCollection&lt;/a&gt;. Service class ini digunakan pada fitur Draft Invoice (Entry Invoice) untuk project Free PMO.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Contoh lain adalah ketika kita membuat sebuah service class untuk mengintegrasikan sistem kita dengan API dari luar, misal &lt;a href=&#34;https://developer.twitter.com/en/docs/tweets/post-and-engage/overview&#34;&gt;Twitter&lt;/a&gt;, &lt;a href=&#34;https://www.instagram.com/developer/endpoints&#34;&gt;Instagram&lt;/a&gt;, atau &lt;a href=&#34;https://rajaongkir.com/dokumentasi&#34;&gt;Raja Ongkir&lt;/a&gt;. Service class ini juga perlu kita buatkan Test Case untuk memastikan komunikasi dengan API dari pihak luar tersebut berjalan sesuai dengan spesifikasi kita. Tetapi kebetulan saya belum ada contoh source-code untuk yang ini.&lt;/p&gt;
&lt;h5 id=&#34;6-number-generators&#34;&gt;6. Number Generators&lt;/h5&gt;
&lt;p&gt;Kalau kita pernah membuat sebuah fitur penomoran atau kode otomatis untuk sistem kita, misal saat input invoice kemudian secara otomatis sistem memberi nomor urut invoice tersebut dengan pola tertentu, maka semestinya penomoran otomatis tersebut kita buatkan testing juga.&lt;/p&gt;
&lt;p&gt;Misal sistem membuat penomoran otomatis (number generator) berdasarkan pola berikut: &lt;code&gt;INV-aabbxxx&lt;/code&gt; di mana :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aa&lt;/code&gt; adalah tahun 2 digit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bb&lt;/code&gt; adalah bulan 2 digit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xxx&lt;/code&gt; adalah nomor urut invoice pada bulan tersebut&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maka seharusnya kita membuat testing untuk memastikan aplikasi kita meng-generate nomor urut yang benar setiap invoice dibuat.&lt;/p&gt;
&lt;p&gt;Contoh sederhana &lt;em&gt;testing script&lt;/em&gt; untuk menguji penomoran otomatis invoice seperti ini : &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/Models/InvoiceTest.php#L38-L46&#34;&gt;it_generates_its_own_number&lt;/a&gt;. Test method ini pada dasarnya digunakan untuk menguji model behaviour pada &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/Entities/Invoices/Invoice.php#L36-L50&#34;&gt;model Invoice&lt;/a&gt;, tetapi contoh penggunaanya ada pada &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/database/factories/InvoiceFactory.php#L13&#34;&gt;model factory invoice&lt;/a&gt;-nya.&lt;/p&gt;
&lt;p&gt;Hmm.. terlihat agak repot ya. Kebetulan perihal &amp;ldquo;testing number generator&amp;rdquo; ini saya baru dapat ilmunya sekitar 2 bulan yang lalu, bahwa fitur-fitur yang menggunakan number generator itu (seharusnya) dibuatkan &lt;em&gt;testing script&lt;/em&gt;nya. Saat artikel ini ditulis, belum ada contoh lain yang bisa saya sampaikan. Asumsi saya pribadi, testing number generator ini harus dibuatkan class Test Case class sendiri. Untuk memastikan semua kemungkinan/kondisi dapat diakomodir oleh &lt;em&gt;testing script&lt;/em&gt;nya.&lt;/p&gt;
&lt;p&gt;Insyaallah bagian ini akan saya update jika sudah ada contoh untuk testing number generator.&lt;/p&gt;
&lt;h3 id=&#34;test-case-tambahan-optional&#34;&gt;Test Case Tambahan (Optional)&lt;/h3&gt;
&lt;p&gt;Item-item yang sudah kita bahas di atas (menurut saya) adalah item-item yang harus dibuatkan test (prioritas utama), karena posisinya sangat vital pada sistem/aplikasi. Ada beberapa item lagi yang biasanya saya buatkan test case, sebagai pendukung.&lt;/p&gt;
&lt;h5 id=&#34;1-helper-function&#34;&gt;1. Helper Function&lt;/h5&gt;
&lt;p&gt;Ketika kita membuat beberapa &lt;strong&gt;function helper&lt;/strong&gt;, entah untuk mempersingkat script, atau agar beberapa baris &lt;em&gt;script&lt;/em&gt; dapat &amp;ldquo;reusable&amp;rdquo; dalam source-code kita (prinsip &lt;a href=&#34;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&#34;&gt;DRY&lt;/a&gt;), ada baiknya function-function helper tersebut kita buatkan &lt;em&gt;testing script&lt;/em&gt; juga. Sekedar memastikan bahwa function tersebut bekerja dengan baik pada versi Laravel/versi PHP yang kita gunakan sekarang.&lt;/p&gt;
&lt;p&gt;Salah satu contoh function helper yang dibuatkan test case :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test Case &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/tests/Unit/Helpers/AppLogoImageTest.php&#34;&gt;AppLogoImageTest&lt;/a&gt;, untuk menguji function helper &lt;a href=&#34;https://github.com/nafiesl/free-pmo/blob/master/app/helpers.php#L217-L236&#34;&gt;appLogoImage()&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sementara baru satu contoh itu, mudah-mudahan jika nanti ada contoh lain, bagian ini bisa saya update.&lt;/p&gt;
&lt;h5 id=&#34;2-model-factory&#34;&gt;2. Model Factory&lt;/h5&gt;
&lt;p&gt;Item pendukung lainnya yang bisa dibuatkan Test Case adalah &lt;a href=&#34;https://laravel.com/docs/5.5/database-testing#writing-factories&#34;&gt;Model Factory&lt;/a&gt;. Biasanya testing diperlukan untuk model factory yang memiliki beberapa &lt;code&gt;state&lt;/code&gt; atau &lt;code&gt;defineAs&lt;/code&gt; (seperti contoh &lt;a href=&#34;https://github.com/nafiesl/silsilah/blob/master/database/factories/ModelFactory.php#L18-L34&#34;&gt;model factory ini&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Kita membuat testing untuk model factory untuk memastikan record yang di-generate oleh model factory sesuai dengan kebutuhan (umumnya untuk keperluan automated testing).&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Baik, dengan pembahasan diatas, kita tarik beberapa kesimpulan tentang &amp;ldquo;Apa saja yang perlu dibuatkan test pada project Laravel?&amp;rdquo;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fitur utama yang &lt;strong&gt;harus&lt;/strong&gt; dibuatkan test adalah &lt;strong&gt;fitur CRUD&lt;/strong&gt;, yaitu saat fitur tersebut &lt;strong&gt;berinteraksi dengan perubahan record&lt;/strong&gt; pada database.&lt;/li&gt;
&lt;li&gt;**Feature Test Case class &lt;strong&gt;dibuat terlebih&lt;/strong&gt; dahulu saat kita bekerja dengan metode TDD.&lt;/li&gt;
&lt;li&gt;Unit Test Case class &lt;strong&gt;dibuat sebagai pendukung&lt;/strong&gt; bagian-bagian kecil dari sebuah fitur (yang diuji dengan Feature Test).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hal-hal yang kita bahas di atas merupakan pendapat saya pribadi, bisa jadi tidak sesuai dengan pendapat teman-teman sekalian, dan bisa jadi akan berubah menyesuaikan kebutuhan di masa datang.&lt;/p&gt;
&lt;p&gt;Jika ada masukan pendapat dari teman-teman pembaca, saya akan sangat berterima kasih sekali. Setidaknya harapan saya, mudah-mudahan pembahasan kali ini dapat menjadi referensi ketika kita jika masih ada pertanyaan :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Apa saja/bagiam mana yang harus dibuatkan test dalam project Laravel saya?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktu teman-teman sudah berkenan membaca. :)&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Setup Codeship CI untuk Private Project</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-setup-codeship-ci-untuk-private-project/</link>
       <pubDate>Thu, 28 Dec 2017 15:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-setup-codeship-ci-untuk-private-project/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Kali ini kita menyambung pembahasan seputar Continuous Integration lagi. Sebelumnya kita sudah sempat membahas cara &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-setup-continuous-integration-dengan-travis-ci/&#34;&gt;setup layanan Travis CI&lt;/a&gt; untuk project open-source. Nah, karena karena kebanyakan project kita berupa private repo, maka kali ini kita bahas tentang Setup &lt;a href=&#34;https://blog.inweeks.com/tool/testing-laravel-tentang-continuous-integration/#codeship&#34;&gt;Codeship CI&lt;/a&gt; untuk private project juga (dengan hosting source-code di BitBucket).&lt;/p&gt;
&lt;p&gt;Sebagaimana yang kita bahas sebelumnya, layanan Codeship CI ini sangat cukup untuk kebutuhan freelance web developer (utamanya yang &lt;em&gt;single fighter&lt;/em&gt;). Untuk akun gratisnya (Codeship Basic), kita mendapatkan &lt;strong&gt;100 builds per bulan&lt;/strong&gt; dengan &lt;strong&gt;jumlah project unlimited&lt;/strong&gt;. Artinya, jika setiap hari kita melakukan &lt;strong&gt;push&lt;/strong&gt; ke BitBucket &lt;strong&gt;2 kali&lt;/strong&gt; (misal siang dan sore). Maka &lt;strong&gt;sehari&lt;/strong&gt; kita akan men-trigger &lt;strong&gt;2 build&lt;/strong&gt;, atau lebih kurang 60 build per bulan. Cukup kan? :)&lt;/p&gt;
&lt;p&gt;Baik, pada artikel ini ada 4 langkah setup Codeship CI untuk private project Laravel di Bitbucket:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Push source-code ke BitBucket&lt;/li&gt;
&lt;li&gt;Login ke Codeship.com dengan akun BitBucket&lt;/li&gt;
&lt;li&gt;Buat project baru pada Codeship untuk project kita&lt;/li&gt;
&lt;li&gt;Trigger &amp;ldquo;First Build&amp;rdquo; layanan Codeship CI&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;kita-mulai&#34;&gt;Kita mulai&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Jika belum memiliki project untuk praktek, silakan teman-teman clone project &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;&lt;strong&gt;Laravel-TDD&lt;/strong&gt;&lt;/a&gt; ini ke localhost, kemudian buat project private baru di BitBucket, push source-code nya ke BitBucket.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;1-push-source-code-project-ke-private-repo-bitbucket&#34;&gt;1. Push source-code Project ke Private repo Bitbucket&lt;/h5&gt;
&lt;p&gt;Pertama, pastikan source-code project laravel kita sudah disetor ke BitBucket dengan &lt;strong&gt;Access level&lt;/strong&gt; private repository. Seperti yang tampil pada gambar di bawah ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-01.jpg&#34; alt=&#34;Private Repo on BitBucket&#34;&gt;&lt;/p&gt;
&lt;p&gt;Seperti kita lihat, pada list commit ini, di paling kanan terdapat kolom &lt;strong&gt;Builds&lt;/strong&gt;. Kolom itu yang nanti akan terisi ketika layanan Codeship mendapatkan hasil &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt; atau &lt;code class=&#34;test-red&#34;&gt;failed&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;2-login-ke-situs-codeshipcom-dengan-akun-bitbucket&#34;&gt;2. Login ke situs Codeship.com dengan akun BitBucket&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Kunjungi situs &lt;a href=&#34;https://codeship.com&#34;&gt;codeship.com&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;&amp;ldquo;SIGN UP FOR FREE&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Login dengan akun &lt;strong&gt;BitBucket&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-02.jpg&#34; alt=&#34;Sign up codeship.com&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ikuti langkah selanjutnya hingga kita mendapatkan tampilan seperti gambar di bawah (menu &lt;strong&gt;Projects&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-03.jpg&#34; alt=&#34;List Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;3-buat-project-baru-pada-codeship&#34;&gt;3. Buat project baru pada Codeship&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Klik tombol &lt;strong&gt;&amp;ldquo;New Project&amp;rdquo;&lt;/strong&gt; pada halaman &lt;strong&gt;Projects&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik icon &lt;strong&gt;&amp;ldquo;Connect to Bitbucket&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-04.jpg&#34; alt=&#34;New Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Masukkan &lt;strong&gt;url git repo&lt;/strong&gt; BitBucket kita, contoh di saya: &lt;code&gt;git@bitbucket.org:nafiesl/laravel-tdd.git&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;&amp;ldquo;Connect&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-05.jpg&#34; alt=&#34;New Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;&amp;ldquo;Select Basic project&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-06.jpg&#34; alt=&#34;New Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kita lanjutkan dengan mengisi form &lt;strong&gt;Setup Commands&lt;/strong&gt; dengan &lt;em&gt;script&lt;/em&gt; berikut :&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-07.jpg&#34; alt=&#34;New Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;Silakan copy &lt;em&gt;script&lt;/em&gt; nya :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;phpenv local 7.0
echo &amp;#34;memory_limit = 512M&amp;#34; &amp;gt;&amp;gt; /home/rof/.phpenv/versions/$(phpenv version-name)/etc/php.ini
# install dependencies
COMPOSER_HOME=${HOME}/cache/composer
composer install --prefer-dist --no-interaction
# set up environment variables
touch .env
echo &amp;#34;APP_ENV=testing&amp;#34; &amp;gt;&amp;gt; .env
echo &amp;#34;APP_DEBUG=true&amp;#34; &amp;gt;&amp;gt; .env
echo &amp;#34;APP_KEY=base64:sQPFP80eWJQGo0SDPc+M2Tib+GLUocRYRw4RLsfM27I=&amp;#34; &amp;gt;&amp;gt; .env
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kemudian isikan &lt;strong&gt;Test Commands&lt;/strong&gt; dengan perintah PHPUnit : &lt;code&gt;vendor/bin/phpunit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-08.jpg&#34; alt=&#34;New Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;Klik &lt;strong&gt;Save and go to dashboard&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-09.jpg&#34; alt=&#34;New Project codeship.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip, sampai di sini &lt;strong&gt;selesai proses Setup&lt;/strong&gt; project Codeship CI. Saat ini codeship &lt;strong&gt;standby menunggu commit&lt;/strong&gt; baru yang dipush ke repo BitBucket kita.&lt;/p&gt;
&lt;h5 id=&#34;4-trigger-first-build&#34;&gt;4. Trigger &amp;ldquo;First Build&amp;rdquo;&lt;/h5&gt;
&lt;p&gt;Untuk membuat layanan Codeship CI mulai bekerja, kita coba membuat commit pada repo dengan cara meng-edit file &lt;code&gt;README.md&lt;/code&gt; langsung di BitBucket. Pada repo project ini, sebelumnya kita menggunakan &lt;strong&gt;badge status Travis CI&lt;/strong&gt; pada file &lt;code&gt;README.md&lt;/code&gt;, kita coba &lt;strong&gt;hapus saja bagian badge&lt;/strong&gt; tersebut. Kemudian langsung commit perubahannya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-10.jpg&#34; alt=&#34;Commit untuk trigger Codeship CI&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sekarang kita lihat layanan Codeship CI langsung bekerja untuk menjalankan build dan test hingga selesai.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-11.jpg&#34; alt=&#34;Codeship CI Bekerja&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip, proses Build dan Test selesai dan &lt;code class=&#34;test-green&#34;&gt;SUCCESS&lt;/code&gt;. Kemudian kita bisa lihat source-code kita di BitBucket menu list commit. Di kolom &lt;strong&gt;Builds&lt;/strong&gt; paling kanan kita melihat &lt;strong&gt;1 of 1 passed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-28-testing-laravel-setup-codeship-ci-untuk-private-project-12.jpg&#34; alt=&#34;Build pass pada commit&#34;&gt;&lt;/p&gt;
&lt;p&gt;Selesai praktek kita setup Codeship CI untuk Private Project Laravel di BitBucket.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Kita coba simpulkan pembahasan kita pada artikel ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Layanan Codeship CI yang gratis (Codeship Basic) sangat cukup untuk kebutuhan freelance web developer yang ingin menggunakan Coontinuous Integration pada project-project privatenya.&lt;/li&gt;
&lt;li&gt;Cara setup Codeship CI agak berbeda dengan setup layanan Travis CI.&lt;/li&gt;
&lt;li&gt;Cara kerja layanan Codeship CI serupa dengan Travis CI, yaitu bekerja setiap menerima push dan pull-request di repo BitBucket.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, demikian teman-teman, mudahan bermanfaat pembahasan kita tentang setup Codeship CI untuk Private Project. Jika ada yang ingin didiskusikan, silakan tuliskan di kolom komentar.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Refactor Controller dengan Model Behaviour</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-refactor-controller-dengan-model-behaviour/</link>
       <pubDate>Wed, 27 Dec 2017 22:45:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-refactor-controller-dengan-model-behaviour/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel sebelumnya kita sudah membahas tentang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-toggle-status-task-dengan-form-button/&#34;&gt;toggle status task&lt;/a&gt;, kali ini kita melakukan refactor pada method &lt;code&gt;TasksController@toggle&lt;/code&gt; untuk fitur tersebut. Sekarang coba teman-teman lihat potongan &lt;em&gt;script&lt;/em&gt; berikut :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method destroy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggle&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;save&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian kita bandingkan dengan ini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method destroy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggle&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;toggleStatus&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kira-kira lebih &lt;em&gt;&amp;ldquo;readable&amp;rdquo;&lt;/em&gt; mana? Pasti potongan &lt;em&gt;script&lt;/em&gt; yang kedua, kan ya? Dengan &lt;em&gt;script&lt;/em&gt; yang kedua, ibarat :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TasksController&lt;/code&gt; adalah seorang &lt;strong&gt;manager&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Task&lt;/code&gt; model adalah &lt;strong&gt;staff&lt;/strong&gt; (dari manager) untuk mengurus record-record tabel task.&lt;/li&gt;
&lt;li&gt;Method &lt;code&gt;toggleStatus()&lt;/code&gt; adalah jobdesk untuk staff agar mengubah nilai &lt;code&gt;is_done&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Manager memberi perintah kepada staffnya dengan memanggil method &lt;code&gt;toggleStatus()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Staff melakukan tugasnya sesuai perintah dan jobdesk yang sudah didefinisikan.&lt;/li&gt;
&lt;li&gt;Setelah staff selesai bekerja, manager kembali melanjutkan tugasnya, yaitu &lt;code&gt;return back();&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Insyaallah mudah dipahami ya? Inilah yang saya pahami dari cara kerja &lt;strong&gt;Object Oriented Programming&lt;/strong&gt;, di mana ada interaksi antar object (class), dan setiap  object akan bekerja sesuai dengan tugas dan tujuannya.&lt;/p&gt;
&lt;h3 id=&#34;kita-mulai&#34;&gt;Kita mulai&lt;/h3&gt;
&lt;p&gt;Baik, seperti biasa, sebelum mulai edit sana-sini, kita jalankan PHPUnit dulu, sekedar memastikan kita dapat &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seharusnya kita tetap dapat &lt;code class=&#34;test-green&#34;&gt;OK (8 tests, 47 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Baik, kita lanjutkan dengan membuka file &lt;code&gt;TasksController&lt;/code&gt;, kemudian kita edit method &lt;code&gt;toggle&lt;/code&gt; sesuai dengan keperluan kita.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method destroy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggle&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// if ($task-&amp;gt;is_done == 1) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//     $task-&amp;gt;is_done = 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// } else {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//     $task-&amp;gt;is_done = 1;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// $task-&amp;gt;save();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;toggleStatus&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, dan jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A request to [http://localhost/tasks/1/toggle] failed. Received status code [500]
...
Caused by
BadMethodCallException: Call to undefined method App\Task::toggleStatus() ...
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum memiliki method &lt;code&gt;toggleStatus()&lt;/code&gt; pada model &lt;code&gt;App\Task&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat method &lt;code&gt;toggleStatus()&lt;/code&gt; pada model &lt;code&gt;App\Task&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Database\Eloquent\Model&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;protected&lt;/span&gt; $fillable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggleStatus&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-1&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Unable to find row in database table [tasks] that matched attributes
[{&amp;#34;id&amp;#34;:1,&amp;#34;is_done&amp;#34;:0}].
Failed asserting that 0 is greater than 0.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-1&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Method &lt;code&gt;toggleStatus()&lt;/code&gt; pada model &lt;code&gt;App\Task&lt;/code&gt; belum melakukan apa-apa.&lt;/p&gt;
&lt;h5 id=&#34;solusi-1&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita definisikan &lt;em&gt;script&lt;/em&gt; untuk toggle status &lt;code&gt;is_done&lt;/code&gt; pada method &lt;code&gt;toggleStatus()&lt;/code&gt; di model &lt;code&gt;App\Task&lt;/code&gt;. Di sini serupa dengan kita mendifinisikan &amp;ldquo;jobdesk&amp;rdquo; atau tugas agar model &lt;code&gt;App\Task&lt;/code&gt; mengubah status &lt;code&gt;is_done&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;membuat-unit-test-untuk-model-apptask&#34;&gt;Membuat unit test untuk model &amp;lsquo;App\Task&amp;rsquo;&lt;/h3&gt;
&lt;p&gt;Untuk mendefinisikan tugas model ini, mari kita buat &lt;strong&gt;Unit Test&lt;/strong&gt; untuk model &lt;code&gt;App\Task&lt;/code&gt;, untuk memastikan method ini berjalan sesuai dengan keinginan kita (yaitu mengubah nilai &lt;code&gt;is_done&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:test --unit Models/TaskTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Laravel akan membuat test class baru &lt;code&gt;tests/Unit/Models/TaskTest.php&lt;/code&gt;. Sekarang kita edit file tersebut.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Unit\Models&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Task&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TaskTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;task_model_has_toggle_status_method&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Panggil method `toggleStatus()` pada model `App\Task`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;toggleStatus&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kolom is_done pada record task berubah menjadi 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;is_done&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Panggil method `toggleStatus()` pada model `App\Task` (lagi)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;toggleStatus&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kolom is_done pada record task berubah menjadi 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;is_done&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Secara umum, struktur method test ini mirip seperti &lt;strong&gt;Feature Test&lt;/strong&gt; untuk toggle status &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-toggle-status-task-dengan-form-button/#membuat-failing-test&#34;&gt;pada artikel sebelumnya&lt;/a&gt;, tetapi disini tidak ada submit form, kita hanya menguji method &lt;code&gt;toggleStatus()&lt;/code&gt; dari model &lt;code&gt;App\Task&lt;/code&gt; saja, maka dari itu testing ini kita golongkan sebagai &lt;strong&gt;Unit Test&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Baik, pastikan simpan file ini dan jalankan PHPUnit. Tetapi kali ini kita hanya menjalankan PHPUnit untuk satu class saja, yaitu &lt;code&gt;TaskTest&lt;/code&gt;, sehingga kita tambahkan parameter &lt;code&gt;--filter TaskTest&lt;/code&gt; pada perintah PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit --filter TaskTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-2&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Unable to find row in database table [tasks] that matched attributes
[{&amp;#34;id&amp;#34;:1,&amp;#34;is_done&amp;#34;:0}].
Failed asserting that 0 is greater than 0.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-2&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Method &lt;code&gt;toggleStatus()&lt;/code&gt; pada model &lt;code&gt;App\Task&lt;/code&gt; belum melakukan apa-apa (ini mirip seperti &lt;a href=&#34;#hasil-error-1&#34;&gt;hasil error sebelumnya&lt;/a&gt; ya).&lt;/p&gt;
&lt;h5 id=&#34;solusi-2&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita definisikan &lt;em&gt;script&lt;/em&gt; untuk toggle status &lt;code&gt;is_done&lt;/code&gt; pada method &lt;code&gt;toggleStatus()&lt;/code&gt; di model &lt;code&gt;App\Task&lt;/code&gt;. &lt;em&gt;Script&lt;/em&gt; nya bisa kita tiru dari &lt;em&gt;script&lt;/em&gt; di method &lt;code&gt;TasksController@toggle&lt;/code&gt;, tetapi variabel &lt;code&gt;$task&lt;/code&gt; kita ganti dengan &lt;code&gt;$this&lt;/code&gt;, karena saat ini kita sedang meng-edit class &lt;code&gt;App\Task&lt;/code&gt; itu sendiri.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Database\Eloquent\Model&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;protected&lt;/span&gt; $fillable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggleStatus&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;save&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; $this;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baik kita jalankan lagi PHPUnit dengan &lt;code&gt;--filter TaskTest&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit --filter TaskTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasilnya :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-27-testing-laravel-refactor-controller-dengan-model-behaviour-01.jpg&#34; alt=&#34;toggleStatus method test passed&#34;&gt;{:id=&amp;ldquo;toggleStatus-method-test-passed&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Sip kita sudah dapat &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt; untuk testing model &lt;code&gt;TaskTest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sekarang kita jalankan PHPUnit untuk keseluruhan testingnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasilnya :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-27-testing-laravel-refactor-controller-dengan-model-behaviour-02.jpg&#34; alt=&#34;All tests passed&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (9 tests, 49 assertions)&lt;/code&gt;. Yap, secara otomatis semua &lt;em&gt;testing script passed&lt;/em&gt;. Mengapa? Karena testing yang failed (error) pada &lt;a href=&#34;#hasil-error-1&#34;&gt;tahap #3&lt;/a&gt; ini, disebabkan oleh &lt;strong&gt;&amp;ldquo;perkara yang sama&amp;rdquo;&lt;/strong&gt; dengan testing yang failed pada &lt;a href=&#34;#hasil-error-2&#34;&gt;tahap #4&lt;/a&gt;, yaitu karena kita &lt;strong&gt;belum mendefinisikan tugas&lt;/strong&gt; dari method &lt;code&gt;toggleStatus()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ketika method &lt;code&gt;toggleStatus()&lt;/code&gt; sudah dibuat sesuai tugasnya (mengubah nilai &lt;code&gt;is_done&lt;/code&gt;), dan testing &lt;strong&gt;&lt;a href=&#34;#toggleStatus-method-test-passed&#34;&gt;tahap #5&lt;/a&gt; passed&lt;/strong&gt;, maka &lt;a href=&#34;#hasil-error-1&#34;&gt;&lt;strong&gt;tahap #3&lt;/strong&gt;&lt;/a&gt; ini juga akan &lt;strong&gt;passed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dengan demikian &lt;strong&gt;refactor&lt;/strong&gt; yang kita lakukan untuk method &lt;code&gt;TasksController@toggle&lt;/code&gt; ini &lt;strong&gt;berjalan sukses&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Baik, sampai disini kita simpulkan manfaat dari refactor controller ke sebuah method pada model, karena kemungkinan diantara teman-teman ada yang bertanya :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Mengapa repot-repot merefactor method &lt;code&gt;TasksController@toggle&lt;/code&gt; ini? Kan method ini tidak terlalu sulit dipahami, ya? Lalu dibuatkan &lt;strong&gt;unit testing&lt;/strong&gt; pula, kenapa?&amp;rdquo;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jawabannya kita buat kesimpulan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Method dari controller menjadi &lt;strong&gt;lebih ramping&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Script&lt;/em&gt; pada controller &lt;strong&gt;menjadi &lt;em&gt;&amp;ldquo;readable&amp;rdquo;&lt;/em&gt;&lt;/strong&gt; (lebih mudah dipahami).&lt;/li&gt;
&lt;li&gt;Controller (sebagai manager) &lt;strong&gt;tinggal memerintahkan&lt;/strong&gt; model (sebagai staffnya) sesuai dengan &amp;ldquo;jobdesk&amp;rdquo;-nya.&lt;/li&gt;
&lt;li&gt;Method &lt;code&gt;toggleStatus()&lt;/code&gt; pada model &lt;code&gt;App\Task&lt;/code&gt; adalah &lt;em&gt;model behaviour&lt;/em&gt; atau perilaku model.&lt;/li&gt;
&lt;li&gt;Unit testing untuk model &lt;strong&gt;memastikan&lt;/strong&gt; bahwa &lt;em&gt;model behaviour&lt;/em&gt; &lt;strong&gt;bekerja sesuai spesifikasi&lt;/strong&gt;, atau bisa dikatakan, model berperilaku sebagaimana yang kita inginkan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bisa dibayangkan jika pada project-project aplikasi yang kita buat, kita dapat me-refactor method-method pada controller ke dalam method-method model, agar method-method pada controller kita tidak &amp;ldquo;gendut&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Hal ini juga akan membuat &lt;em&gt;source-code&lt;/em&gt; kita menjadi &lt;strong&gt;lebih &lt;em&gt;&amp;ldquo;readable&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;, baik &lt;strong&gt;untuk orang lain&lt;/strong&gt; yang melihat/me-review &lt;em&gt;source-code&lt;/em&gt; yang kita kerjakan, maupun &lt;strong&gt;untuk diri kita sendiri&lt;/strong&gt; (jika melihat &lt;em&gt;source-code&lt;/em&gt; ini &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-latar-belakang/#contoh-kasus&#34;&gt;beberapa bulan setelah project selesai&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Baik teman-teman, demikian pembahasan kita tentang &amp;ldquo;refactor controller dengan &lt;em&gt;model behaviour&lt;/em&gt;&amp;rdquo;. Mudah-mudahan pembahasan pada artikel ini dapat menjadi inspirasi bagi teman-teman dalam melakukan refactor controller.&lt;/p&gt;
&lt;p&gt;Semua perubahan &lt;em&gt;script&lt;/em&gt; project Testing-TDD pada artikel ini bisa dilihat pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/c2feb569db040090e2d2307790e939349328f1c1&#34;&gt;commit ini&lt;/a&gt; (dengan sedikit &lt;em&gt;clean-up&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Terima kasih teman-teman atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Toggle Status Task dengan Form Button</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-toggle-status-task-dengan-form-button/</link>
       <pubDate>Tue, 26 Dec 2017 15:24:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-toggle-status-task-dengan-form-button/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Kalau teman-teman ingat, pada artikel saat &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#solusi-14&#34;&gt;mendapatkan passed test&lt;/a&gt;, kita membuat file migration untuk tabel &lt;code&gt;tasks&lt;/code&gt; dengan kolom &lt;code&gt;is_done&lt;/code&gt; untuk menyatakan status task yang bersangkutan. Dari kemarin-kemarin kita belum melakukan apa-apa terhadap kolom tersebut karena secara default dia bernilai &lt;code&gt;0&lt;/code&gt;. Nah sekarang kita akan mencoba memanfaatkan kolom tersebut untuk mengubah status task.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jika teman-teman sudah mengikuti artikel Testing Laravel ini dari awal, silakan menggunakan projectnya. Saya akan mulai dari &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/803b65150750356ff7cf50c5bf3577dda874d78b&#34;&gt;commit ini&lt;/a&gt; pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;repo Laravel-TDD ini&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seperti biasa, sebelum mulai kita jalankan testing dulu untuk memastikan project kita dalam kondisi &amp;ldquo;sehat&amp;rdquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seharusnya kita tetap dapat hasil &lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 36 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;membuat-failing-test&#34;&gt;Membuat Failing Test&lt;/h3&gt;
&lt;p&gt;Baik, kita lanjutkan dengan membuat test method untuk fitur toggle status task ini. Pertama kita buka file &lt;code&gt;tests/Feature/ManageTasksTest.php&lt;/code&gt;, kemudian kita tambahkan satu test method baru &lt;code&gt;user_can_toggle_task_status&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_create_a_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_browse_tasks_index_page()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_edit_an_existing_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_delete_an_existing_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_toggle_task_status&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita buat &lt;em&gt;PHP Comment line&lt;/em&gt; untuk membantu kita membuat &lt;em&gt;testing script&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_toggle_task_status&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User tekan tombol dengan id=&amp;#34;toggle_task_1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke halaman daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kolom is_done pada record task berubah menjadi 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User tekan tombol dengan id=&amp;#34;toggle_task_1&amp;#34; (lagi)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// untuk mengembalikan status task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke halaman daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kolom is_done pada record task berubah menjadi 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita buat &lt;em&gt;testing script&lt;/em&gt;-nya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_toggle_task_status&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User tekan tombol dengan id=&amp;#34;toggle_task_1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Dimana angka 1 adalah id dari $task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;press&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;toggle_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke halaman daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kolom is_done pada record task berubah menjadi 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;is_done&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User tekan tombol dengan id=&amp;#34;toggle_task_1&amp;#34; (lagi)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// untuk mengembalikan status task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;press&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;toggle_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke halaman daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kolom is_done pada record task berubah menjadi 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;is_done&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cukup panjang ya, karena di sini kita menguji &amp;ldquo;toggle&amp;rdquo;, ketika tombol yang sama ditekan, maka statusnya akan kembali ke status sebelumnya.&lt;/p&gt;
&lt;h3 id=&#34;mendapatkan-passed-test&#34;&gt;Mendapatkan Passed Test&lt;/h3&gt;
&lt;p&gt;Baik, simpan file, kita mulai jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;InvalidArgumentException: Could not find a form that has
submit button [toggle_task_1].
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum memiliki &lt;code&gt;form&lt;/code&gt; yang memiliki tombol &lt;code&gt;toggle_task_1&lt;/code&gt;. Di mana &lt;code&gt;toggle_task_1&lt;/code&gt; bisa berupa &lt;strong&gt;tulisan&lt;/strong&gt; atau atribut &lt;strong&gt;value&lt;/strong&gt; pada tombol submit, bisa juga berupa atribut &lt;strong&gt;id&lt;/strong&gt; dari tombol submit tersebut.&lt;/p&gt;
&lt;h5 id=&#34;solusi-membuat-form-button&#34;&gt;Solusi (Membuat Form Button)&lt;/h5&gt;
&lt;p&gt;Pada view &lt;code&gt;tasks.index&lt;/code&gt; bagian daftar Task (di bawah form delete task) kita buat &lt;code&gt;form&lt;/code&gt; dengan tombol &lt;code&gt;toggle_task_1&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @foreach ($tasks as $task) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34; class=&amp;#34;pull-right&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        onsubmit=&amp;#34;return confirm(&amp;#39;Are U sure to delete this task?&amp;#39;)&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;delete&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;delete_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; class=&amp;#34;btn btn-link btn-xs&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}?action=edit&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt;id={% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            id=&amp;#34;edit_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id.&amp;#39;/toggle&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;patch&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Toggle&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;toggle_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @endforeach --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Di sini kita membuat sebuah &lt;strong&gt;form&lt;/strong&gt; dengan action &lt;code&gt;&#39;tasks/1/toggle&#39;&lt;/code&gt; (angka &lt;strong&gt;1&lt;/strong&gt; adalah &lt;strong&gt;id&lt;/strong&gt; dari task yang bersangkutan), yang di dalamnya langsung kita berikan &lt;code&gt;csrf_field()&lt;/code&gt; dan &lt;code&gt;method_field(&#39;patch&#39;)&lt;/code&gt;, kemudian ada &lt;strong&gt;tombol submit&lt;/strong&gt; dengan &lt;code&gt;id=&amp;quot;toggle_task_1&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Simpan, kemudian jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-1&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A request to [http://localhost/tasks/1/toggle] failed. Received status code [404]
...
Caused by
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-1&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Request yang dikirimkan ke &lt;code&gt;tasks/1/toggle&lt;/code&gt;, belum route yang melayaninya.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita tambahkan route untuk melayani requestnya di file &lt;code&gt;routes/web.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@store&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;patch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks/{task}&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@update&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;delete&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks/{task}&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@destroy&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;patch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks/{task}/toggle&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@toggle&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-2&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A request to [http://localhost/tasks/1/toggle] failed. Received status code [500]
...
Caused by
BadMethodCallException: Method [toggle] does not exist.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-2&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Yap, sudah diduga, belum ada method &lt;code&gt;toggle&lt;/code&gt; di &lt;code&gt;TasksController&lt;/code&gt; kita.&lt;/p&gt;
&lt;h5 id=&#34;solusi-1&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat method &lt;code&gt;TasksController@toggle&lt;/code&gt; untuk melayani request ini. Method tersebut langsung kita isi dengan &lt;em&gt;script&lt;/em&gt; untuk mengupdate kolom &lt;code&gt;is_done&lt;/code&gt; dan redirect kembali ke halaman sebelumnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method destroy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggle&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;save&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-3&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Unable to find row in database table [tasks] that matched attributes
[{&amp;#34;id&amp;#34;:1,&amp;#34;is_done&amp;#34;:0}].
Failed asserting that 0 is greater than 0.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-3&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada method &lt;code&gt;TasksController@toggle&lt;/code&gt; kita hanya mengeset &lt;code&gt;$task-&amp;gt;is_done = 1&lt;/code&gt; padahal seharusnya (yang kita inginkan) : jika kolom &lt;code&gt;is_done&lt;/code&gt; bernilai &lt;code&gt;0&lt;/code&gt; maka jadikan &lt;code&gt;1&lt;/code&gt;. Sebaliknya, jika saat ini kolom &lt;code&gt;is_done&lt;/code&gt; bernilai &lt;code&gt;1&lt;/code&gt; maka jadikan &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-2&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat method &lt;code&gt;TasksController@toggle&lt;/code&gt; untuk melakukan toggle kolom &lt;code&gt;is_done&lt;/code&gt; dengan nilai &lt;code&gt;1&lt;/code&gt; dan &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method destroy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;toggle&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;is_done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;save&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-26-testing-laravel-toggle-status-task-dengan-form-button-01.jpg&#34; alt=&#34;Passed Toggle Task Status&#34;&gt;&lt;/p&gt;
&lt;p&gt;Alhamdulillah, sekarang kita sudah dapat &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt;. Sekarang kita melihat tampilan &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#mencoba-fitur-input-task-pada-browser&#34;&gt;melalui browser&lt;/a&gt; untuk melihat hasilnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-26-testing-laravel-toggle-status-task-dengan-form-button-02.jpg&#34; alt=&#34;Tampilan Toggle Task Status&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hmmm, kurang bagus ya. Sebenarnya fitur tombol &amp;ldquo;toggle&amp;rdquo;-nya sudah bekerja, hanya saya tidak ada perubahan tampilan yang bisa kita lihat di browser. Tidak apa-apa sekarang kita perbaiki tampilannya.&lt;/p&gt;
&lt;h3 id=&#34;mempercantik-tampilan&#34;&gt;Mempercantik Tampilan&lt;/h3&gt;
&lt;p&gt;Kita buka view &lt;code&gt;tasks.index&lt;/code&gt;, kemudian kita ubah menjadi seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @foreach ($tasks as $task) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item {% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;is_done ? &amp;#39;task-done&amp;#39; : &amp;#39;&amp;#39; }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34; class=&amp;#34;pull-right&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        onsubmit=&amp;#34;return confirm(&amp;#39;Are U sure to delete this task?&amp;#39;)&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;delete&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;delete_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; class=&amp;#34;btn btn-link btn-xs&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}?action=edit&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt;id={% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            id=&amp;#34;edit_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id.&amp;#39;/toggle&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;patch&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            id=&amp;#34;toggle_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            class=&amp;#34;btn btn-link no-padding&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @endforeach --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kalau teman-teman perhatikan. bagian yang diubah adalah :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;li class=&amp;quot;list-group-item {% raw&amp;quot; &amp;gt;}}{{ $task-&amp;gt;is_done ? &#39;task-done&#39; : &#39;&#39; }}{% endraw&amp;quot; &amp;gt;}}&amp;quot;&amp;gt;&lt;/code&gt;. Jika &lt;code&gt;is_done&lt;/code&gt; bernilai &lt;code&gt;true&lt;/code&gt; atau &lt;code&gt;1&lt;/code&gt;, maka ditambahkan class &amp;ldquo;task-done&amp;rdquo; pada tag &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; tersebut.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tombol submit Toggle&lt;/strong&gt; menjadi nama task masing-masing. Sehingga nama masing-masing task akan berperan sebagai toggle status task tersebut.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tombol submit Toggle&lt;/strong&gt; ditambahkan class=&amp;ldquo;btn btn-link no-padding&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Di sini ada 2 &lt;strong&gt;class css&lt;/strong&gt; yang kita buat, yaitu &lt;strong&gt;&amp;ldquo;task-done&amp;rdquo;&lt;/strong&gt; pada &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; dan &lt;strong&gt;&amp;ldquo;no-padding&amp;rdquo;&lt;/strong&gt; pada &lt;strong&gt;tombol submit Toggle&lt;/strong&gt;. Sekarang kita buat style untuk kedua class tambahan ini.&lt;/p&gt;
&lt;p&gt;Buka view &lt;code&gt;layouts.app&lt;/code&gt;, tambahkan tag &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; pada bagian &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/layouts/app.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Styles --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ asset(&amp;#39;css/app.css&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; rel=&amp;#34;stylesheet&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .&lt;span style=&#34;color:#a6e22e&#34;&gt;task-done&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;background-color&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#dff0d8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;text-decoration&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;line-through&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;#3c763d&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .&lt;span style=&#34;color:#a6e22e&#34;&gt;btn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;no-padding&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;padding&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nah, sekarang simpan dan kita lagi di browser, hasilnya kurang lebih begini :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-26-testing-laravel-toggle-status-task-dengan-form-button-03.jpg&#34; alt=&#34;Tampilan Toggle Task Status&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oke, sudah lumayan bagus ya. Jadi ketika kita &lt;strong&gt;klik nama task&lt;/strong&gt;, maka akan menjadi &amp;ldquo;toggle&amp;rdquo; status task. Background hijau dan tulisan &lt;del&gt;strikethrough&lt;/del&gt; untuk task dengan &lt;code&gt;is_done&lt;/code&gt; = 1.&lt;/p&gt;
&lt;p&gt;Terakhir, kita jalankan PHPUnit untuk memastikan perubahan di view tidak merusak fitur toggle status task kita.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seharusnya kita tetap dapat hasil &lt;code class=&#34;test-green&#34;&gt;OK (8 tests, 47 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Baik teman-teman sampai disini pembahasan kita tentang form button untuk toggle status task. Semua perubahan script pada artikel ini bisa teman-teman lihat pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/4d28f50962657e84a4e380be38437f3ed1b31ff1&#34;&gt;commit ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Insyaallah pada artikel berikutnya kita akan bahas tentang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-refactor-controller-dengan-model-behaviour/&#34;&gt;refactor di controller dengan model behaviour&lt;/a&gt; (perilaku kelas model) khusus untuk method &lt;code&gt;TasksController@toggle&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Setup CI dengan Travis CI</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-setup-continuous-integration-dengan-travis-ci/</link>
       <pubDate>Thu, 21 Dec 2017 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-setup-continuous-integration-dengan-travis-ci/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel sebelumnya kita sudah membahas tentang &lt;a href=&#34;https://blog.inweeks.com/tool/testing-laravel-tentang-continuous-integration/#kenapa-perlu-continuous-integration&#34;&gt;manfaat&lt;/a&gt; layanan Continuous Integration untuk project kita, dan sudah mengetahui beberapa layanan yang gratis. Jika kita memiliki repositori project Laravel open-source yang dihosting di github, setup Continuous Integration yang paling mudah adalah Travis CI.&lt;/p&gt;
&lt;p&gt;Secara umum, berikut langkah yang akan kita lakukan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Membuat file &lt;code&gt;.travis.yml&lt;/code&gt; untuk definisi konfigurasi dan &lt;em&gt;script&lt;/em&gt; yang dijalankan oleh Travis CI.&lt;/li&gt;
&lt;li&gt;Login pada &lt;a href=&#34;https://travis-ci.org&#34;&gt;Travis CI&lt;/a&gt; dengan akun Github.&lt;/li&gt;
&lt;li&gt;Pilih dan aktifkan repositori yang akan menggunakan layanan Travis CI.&lt;/li&gt;
&lt;li&gt;Buat commit baru untuk men-triger layanan Travis CI untuk pertama kali.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Selanjutnya kita bahas langkah detail setup Travis CI untuk project Laravel di github.&lt;/p&gt;
&lt;h3 id=&#34;membuat-file-travisyml&#34;&gt;Membuat file &amp;ldquo;.travis.yml&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;File &lt;code&gt;.travis.yml&lt;/code&gt; adalah file yang berisi konfigurasi layanan CI dan script-script build dan test yang akan dijalankan Travis CI. Baik, kita buat file bernama &lt;code&gt;.travis.yml&lt;/code&gt; pada project root, kemudian isikan file tersebut dengan script berikut ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;language&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;php&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;7.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;before_script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;travis_retry composer self-update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;travis_retry composer install --prefer-source --no-interaction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;cp .env.example .env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;php artisan key:generate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;vendor/bin/phpunit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-01.jpg&#34; alt=&#34;Login Travis CI&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;login-pada-travis-ci-dengan-akun-github&#34;&gt;Login pada Travis CI dengan akun Github&lt;/h3&gt;
&lt;p&gt;Kemudian buka website &lt;a href=&#34;https://travis-ci.org&#34;&gt;Travis CI&lt;/a&gt;, klik &lt;strong&gt;&amp;ldquo;Sign in with GitHub&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-02.jpg&#34; alt=&#34;Login Travis CI&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ikuti langkahnya hingga kita mendapatkan tampilan seperti gambar di bawah ini. Klik tombol &lt;strong&gt;&amp;ldquo;Sync account&amp;rdquo;&lt;/strong&gt; untuk menampilkan daftar repository yang ada pada akun github kita.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-03.jpg&#34; alt=&#34;Travis CI Sync Account&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;aktifkan-repository-project&#34;&gt;Aktifkan Repository Project&lt;/h3&gt;
&lt;p&gt;Klik &lt;strong&gt;&amp;ldquo;switch&amp;rdquo;&lt;/strong&gt; disamping &lt;strong&gt;nama repository&lt;/strong&gt; untuk mengaktifkan layanan Travis CI untuk project tersebut. Kemudian klik &lt;strong&gt;Nama Repository&lt;/strong&gt; (dalam kasus saya: &lt;a href=&#34;https://travis-ci.org/nafiesl/Laravel-TDD&#34;&gt;nafiesl/Laravel-TDD&lt;/a&gt;) untuk masuk ke halaman detail build repository tersebut.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-04.jpg&#34; alt=&#34;Halaman Travis CI Project&#34;&gt;&lt;/p&gt;
&lt;p&gt;Nah, sampai disini kita sudah selesai mengaktifkan layanan Travis CI untuk project kita. Travis akan &amp;ldquo;standby&amp;rdquo; untuk menunggu commit berikutnya agar dapat mulai build untuk pertama kalinya.&lt;/p&gt;
&lt;h3 id=&#34;buat-commit-untuk-men-trigger-build&#34;&gt;Buat commit untuk men-trigger build&lt;/h3&gt;
&lt;p&gt;Sekarang kita buat commit baru untuk men-trigger build dari Travis CI. Misalnya kita ingin menampilkan build badge seperti ini &lt;a href=&#34;https://travis-ci.org/nafiesl/Laravel-TDD&#34;&gt;&lt;img src=&#34;https://travis-ci.org/nafiesl/Laravel-TDD.svg?branch=master&#34; alt=&#34;Build Status&#34;&gt;&lt;/a&gt; pada file &lt;code&gt;README.md&lt;/code&gt;. Langkah kerjanya seperti ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Klik badge build status pada halaman Travis CI project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pilih branch &lt;strong&gt;master&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pilih &lt;strong&gt;Markdown&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy script badge status build untuk kita paste ke file &lt;code&gt;README.md&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-05.jpg&#34; alt=&#34;Buat badge build&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit (atau buat) file &lt;code&gt;README.md&lt;/code&gt; pada repo project di github, &lt;strong&gt;tambahkan&lt;/strong&gt; script badge status build dari Travis CI tadi. Misal seperti ini.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Laravel TDD Project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;![Build Status&lt;/span&gt;](&lt;span style=&#34;color:#a6e22e&#34;&gt;https://travis-ci.org/nafiesl/Laravel-TDD.svg?branch=master&lt;/span&gt;)](https://travis-ci.org/nafiesl/Laravel-TDD)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## About
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;Source code laravel testing pada blog https://blog.nafies.id/tags/#testing.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;File &lt;code&gt;README.md&lt;/code&gt; langsung dibuat/edit pada github.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-06.jpg&#34; alt=&#34;Buat badge build README.md&#34;&gt;&lt;/p&gt;
&lt;p&gt;Maka seketika itu juga, kita melihat pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commits/master&#34;&gt;&lt;strong&gt;list commit&lt;/strong&gt;&lt;/a&gt; dari repo project ini, layanan &lt;strong&gt;Travis CI langsung bekerja&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-07.jpg&#34; alt=&#34;Travis CI Started&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kita dapat melihat proses kerjanya pada halaman &lt;a href=&#34;https://travis-ci.org/nafiesl/Laravel-TDD&#34;&gt;Travis CI project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-08.jpg&#34; alt=&#34;Travis CI On Progress&#34;&gt;&lt;/p&gt;
&lt;p&gt;Silakan tunggu hingga prosesnya selesai.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-09.jpg&#34; alt=&#34;Travis CI Selesai&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-10.jpg&#34; alt=&#34;Travis CI Selesai&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oke, proses build dan testing nya &lt;strong&gt;sudah selesai&lt;/strong&gt;. Jika kita kembali ke &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commits/master&#34;&gt;&lt;strong&gt;list commit&lt;/strong&gt;&lt;/a&gt; repo tersebut, kita akan melihat tanda &lt;code class=&#34;test-green&#34;&gt;Centang Hijau&lt;/code&gt; yang menandakan bahwa proses build dan testing oleh travis CI untuk commit tersebut berjalan dengan baik. Seperti gambar di bawah ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-11.jpg&#34; alt=&#34;Commit Travis CI Selesai&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;selesai-setup&#34;&gt;Selesai Setup&lt;/h3&gt;
&lt;p&gt;Sampai disini kita sudah berhasil melakukan setup layanan Travis CI untuk project opensource &lt;a href=&#34;https://blog.inweeks.com/tags/testing&#34;&gt;Testing Laravel&lt;/a&gt; kita. Sebagaimana kita bahas sebelumnya, Travis CI akan otomatis berjalan setiap kita melakukan commit baru dan pull-request dari contributor.&lt;/p&gt;
&lt;h3 id=&#34;travis-ci-untuk-paket-composer&#34;&gt;Travis CI untuk Paket Composer&lt;/h3&gt;
&lt;p&gt;Oh ya, proses build layanan Travis CI ini &lt;strong&gt;tidak hanya&lt;/strong&gt; untuk sebuah project aplikasi, lho. Layanan ini juga kita bisa gunakan untuk build dan testing paket composer. Misal paket &lt;a href=&#34;https://github.com/nafiesl/SimpleCrudGenerator&#34;&gt;Simple CRUD Generator&lt;/a&gt; untuk Laravel. Paket ini dikembangkan untuk mempermudah dan mempercepat workflow TDD dalam membangun sebuah project dengan Laravel (untuk versi 5.3 s/d 5.5), karena selain menggenerate &lt;em&gt;Controller&lt;/em&gt;, &lt;em&gt;Model&lt;/em&gt; dan &lt;em&gt;View&lt;/em&gt;-nya, paket ini juga menggenerate &lt;strong&gt;Feature Test&lt;/strong&gt; dan beberapa &lt;strong&gt;Unit Test&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Travis CI dapat digunakan untuk &lt;strong&gt;menjalankan test&lt;/strong&gt; yang digenerate oleh paket tadi. Temen-temen bisa lihat disini kita bisa mendefinisikan perintah &lt;code&gt;php artisan&lt;/code&gt; juga pada file &lt;code&gt;.travis.yml&lt;/code&gt;. Hasilnya:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-21-testing-laravel-setup-continuous-integration-dengan-travis-ci-12.jpg&#34; alt=&#34;Pengujuan SimpleCRUDGenerator pada laravel 5.3&#34;&gt;&lt;/p&gt;
&lt;p&gt;Karena paket tersebut awalnya dibuat untuk Laravel 5.5, Travis CI juga digunakan &lt;strong&gt;untuk menguji paket&lt;/strong&gt; tersebut di laravel versi sebelumnya dan beberapa versi PHP. Apakah testing yang digenerate oleh paket tersebut tersebut dapat berjalan dengan baik untuk &lt;strong&gt;Laravel 5.3 pada php 5.6&lt;/strong&gt;? Dan juga berjalan pada &lt;strong&gt;Laravel 5.4 pada php 7.0&lt;/strong&gt;? Travis CI sangat membantu untuk kebutuhan ini.&lt;/p&gt;
&lt;p&gt;Sample projectnya bisa dilihat pada &lt;a href=&#34;https://github.com/nafiesl/simple-crud-generator-example/tree/laravel5.4&#34;&gt;repo ini&lt;/a&gt; (lihat branch &lt;strong&gt;laravel5.3&lt;/strong&gt; dan branch &lt;strong&gt;laravel5.4&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Demikian teman-teman, mudah-mudahan bisa memberi inspirasi tentang cara Setup Travis CI untuk project open-source laravel di github. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Tentang Continuous Integration</title>
       <link>https://blog.inweeks.com/tool/testing-laravel-tentang-continuous-integration/</link>
       <pubDate>Tue, 12 Dec 2017 18:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/tool/testing-laravel-tentang-continuous-integration/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Baik, karena kita sudah memiliki sebuah &lt;a href=&#34;https://blog.inweeks.com/tags/testing&#34;&gt;mini-project Laravel&lt;/a&gt; yang dilengkapi dengan &lt;em&gt;automated testing&lt;/em&gt;, kita bisa mencoba yang namanya &lt;em&gt;Continuous Integration&lt;/em&gt;. Bagi teman-teman yang belum mengetahui &lt;strong&gt;apa itu Continuous Integration&lt;/strong&gt; (atau kita singkat &lt;strong&gt;&amp;ldquo;CI&amp;rdquo;&lt;/strong&gt;), kurang lebih yang saya pahami seperti ini:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Continuous Integration&lt;/strong&gt; adalah layanan yang melakukan build dan pengujian otomatis, yang terintegrasi dengan hosting repository source code (seperti Github, Gitlab, atau Bitbucket). Di mana setiap kita melakukan &lt;em&gt;push commit-commit&lt;/em&gt; baru, atau ada pull request ke dalam repository project, layanan ini langsung menjalankan build dan test, sehingga jika ada error atau kegagalan test akan segera ketahuan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;small&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: untuk yang lebih lengkap, silakan teman-teman coba googling &amp;ldquo;continuous integration adalah&amp;rdquo;.&lt;/small&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sebelum kita melakukan setup &lt;em&gt;Continuous Integration&lt;/em&gt; pada project Testing Laravel ini, sebaiknya kita pahami dulu apa &lt;a href=&#34;#kenapa-perlu-continuous-integration&#34;&gt;&lt;strong&gt;manfaat&lt;/strong&gt; Continuous Integration&lt;/a&gt; untuk project kita, serta beberapa &lt;a href=&#34;#layanan-ci-gratis&#34;&gt;layanan CI &lt;strong&gt;gratis&lt;/strong&gt;&lt;/a&gt; yang bisa kita gunakan untuk project kita.&lt;/p&gt;
&lt;h3 id=&#34;kenapa-perlu-continuous-integration&#34;&gt;Kenapa perlu Continuous Integration?&lt;/h3&gt;
&lt;p&gt;Seperti biasa, sebelum kita mempelajari/menggunakan suatu alat bantu, kita harus tahu dulu manfaatnya untuk kita. Dari situ kita bisa memutuskan apakah kita memang perlu atau tidak.&lt;/p&gt;
&lt;h5 id=&#34;untuk-single-fighter&#34;&gt;Untuk Single Fighter&lt;/h5&gt;
&lt;p&gt;Jika kita &lt;strong&gt;mengerjakan project sendirian&lt;/strong&gt;, tanpa kolaborasi dengan programmer lain, satu alasan mengapa kita perlu CI, yaitu untuk memastikan bahwa testing aplikasi tidak hanya &lt;em&gt;passed&lt;/em&gt; di localhost saja.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Testing hanya passed di localhost saja? kok begitu?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ya, kalau kita kerja sendirian, kita tahunya di tempat kita (localhost) semua berjalan lancar, tapi kita belum tahu nanti ketika kita &lt;em&gt;build&lt;/em&gt; ke server produksi (apakah lancar atau tidak?), karena pasti ada perbedaan spesifikasi hardware dan software pendukung antara localhost dengan server produksi (nanti).&lt;/p&gt;
&lt;p&gt;Nah, CI dapat membantu kita untuk memastikan, proses langkah yang dilakukan saat kita &lt;em&gt;build&lt;/em&gt; aplikasi ke server sudah benar dan testingnya &lt;em&gt;passed&lt;/em&gt;, sebagaimana di locahost kita. Disamping itu, jika suatu saat ada programmer lain meneruskan project ini tanpa keterlibatan kita, atau jika ada yang bergabung, project kita sudah siap untuk digarap secara kolaborasi.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;small&gt;&lt;strong&gt;Catatan&lt;/strong&gt;: &amp;ldquo;build&amp;rdquo; yang dimaksud disini adalah proses deploy atau installasi aplikasi pada server.&lt;/small&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Gambar dibawah adalah contoh &lt;em&gt;&lt;strong&gt;commit push&lt;/strong&gt;&lt;/em&gt; yang langsung dicek oleh Travis CI dan Style CI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-12-testing-laravel-tentang-continuous-integration-01.jpg&#34; alt=&#34;CI Check pada Commit Push&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;untuk-kolaborasi&#34;&gt;Untuk Kolaborasi&lt;/h5&gt;
&lt;p&gt;Untuk project yang dibangun dengan cara kolaborasi, ada &lt;strong&gt;PM&lt;/strong&gt; (Project Manager/Maintainer) dan &lt;strong&gt;kolaborator&lt;/strong&gt; yang terlibat, ada manfaat lain yang didapatkan (selain manfaat untuk &lt;em&gt;single fighter&lt;/em&gt; di atas), yaitu :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Setiap kolaborator melakukan &lt;em&gt;push commit&lt;/em&gt; atau &lt;em&gt;pull request&lt;/em&gt;, CI langsung melakukan &lt;em&gt;build&lt;/em&gt; dan test untuk &lt;strong&gt;memastikan&lt;/strong&gt; semua fitur berjalan lancar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing yang &lt;strong&gt;sudah &lt;em&gt;passed&lt;/em&gt;&lt;/strong&gt; di localhost seorang kolaborator, &lt;strong&gt;bisa jadi &lt;em&gt;failed&lt;/em&gt;&lt;/strong&gt; di CI dengan &lt;strong&gt;berbagai sebab&lt;/strong&gt; (ini akan jadi bahan diskusi dan ilmu tambahan untuk kolaborator).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menghindarkan problem jika: Testing &lt;em&gt;passed&lt;/em&gt; di &lt;strong&gt;localhost kolaborator&lt;/strong&gt;, tetapi &lt;em&gt;failed&lt;/em&gt; di &lt;strong&gt;localhost PM&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Meringankan beban PM (Project Manager/Maintainer).&lt;br&gt;
Kalau seorang PM harus : &lt;em&gt;git pull&lt;/em&gt; kemudian &lt;em&gt;build&lt;/em&gt; di localhostnya dulu, &lt;strong&gt;untuk memastikan&lt;/strong&gt; semua testing &lt;em&gt;passed&lt;/em&gt;, kemudian baru melakukan &lt;strong&gt;code review&lt;/strong&gt;. Kan lumayan makan waktu, ya?&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dengan dibantu CI ini, PM tinggal bilang:&lt;br&gt;
&amp;ldquo;Bro, silakan bikin testingnya passed dulu sebelum ane review kerjaan ente.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apakah ini meringankan pekerjaan PM? Tentu saja.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gambar dibawah adalah contoh &lt;em&gt;&lt;strong&gt;pull request&lt;/strong&gt;&lt;/em&gt; yang langsung dicek oleh layanan CI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-12-testing-laravel-tentang-continuous-integration-02.jpg&#34; alt=&#34;CI Check pada Pull Request&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;layanan-ci-gratis&#34;&gt;Layanan CI Gratis&lt;/h3&gt;
&lt;p&gt;Ada beberapa layanan CI yang saya ketahui dan coba gunakan untuk project open-source maupun private. Umumnya layanan CI selalu gratis untuk project-project open-source. Sedangkan untuk project private, biasanya berbayar, tapi ada juga yang gratis.&lt;/p&gt;
&lt;h5 id=&#34;1-travis-ci&#34;&gt;1. Travis CI&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;https://travis-ci.org/&#34;&gt;Travis CI&lt;/a&gt; adalah layanan CI yang mendukung banyak bahasa pemrograman dan banyak digunakan untuk project-project open-source di Github. Saya juga menggunakan Travis CI untuk beberapa project &lt;a href=&#34;https://travis-ci.org/nafiesl&#34;&gt;open-source&lt;/a&gt; yang saya kembangkan. Layanan ini berbayar kita gunakan untuk project private.&lt;/p&gt;
&lt;p&gt;Berikut contoh hasil build dan test di Travis CI, bisa coba klik link &lt;a href=&#34;https://travis-ci.org/nafiesl/free-pmo/jobs/314005133&#34;&gt;15.1&lt;/a&gt; untuk melihat detailnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-12-testing-laravel-tentang-continuous-integration-03.jpg&#34; alt=&#34;Layanan Travis CI&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;2-codeship&#34;&gt;2. Codeship&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;http://codeship.com&#34;&gt;Codeship&lt;/a&gt; adalah layanan CI yang menyediakan akun &lt;strong&gt;gratis untuk project private&lt;/strong&gt; dengan batasan tertentu. Batasannya (saya rasa) sangat cukup untuk kebutuhan freelance web developer. Saya sendiri menggunakan codeship ini untuk project-project private di Bitbucket. Kita bisa melihat perbandingan akun basic dengan akun pro pada &lt;a href=&#34;https://codeship.com/features&#34;&gt;halaman web ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-12-testing-laravel-tentang-continuous-integration-04.jpg&#34; alt=&#34;Layanan Codeship CI&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;3-bitbucket-pipeline&#34;&gt;3. Bitbucket Pipeline&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;https://bitbucket.org/product/features/pipelines&#34;&gt;Bitbucket Pipeline&lt;/a&gt; adalah layanan CI milik Bitbucket, paket akun usernya mengikuti paket akun Bitbucket yang kita miliki. Gratis dengan batasan jumlah user (5 orang). Jika kita menggunakan Bitbucket untuk hosting source code private, kita bisa langsung menggunakan layanan ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-12-testing-laravel-tentang-continuous-integration-05.jpg&#34; alt=&#34;Layanan Bitbucket Pipeline&#34;&gt;&lt;/p&gt;
&lt;h5 id=&#34;4-gitlab-ci&#34;&gt;4. Gitlab CI&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;https://about.gitlab.com/features/gitlab-ci-cd&#34;&gt;Gitlab CI&lt;/a&gt; serupa dengan pipeline milik Bitbucket, yang ini adalah layanan milik Gitlab. Kebetulan saya belum pernah mencoba layanan ini di Gitlab.&lt;/p&gt;
&lt;h3 id=&#34;layanan-ci-standarisasi-sintax&#34;&gt;Layanan CI Standarisasi Sintax&lt;/h3&gt;
&lt;p&gt;Nah, layanan CI yang ini berbeda dengan keempat layanan di atas, ini diluar urusan testing. Yang ini adalah layanan untuk mengecek &lt;em&gt;sintax/script&lt;/em&gt; yang kita tulis pada project. Misal kita menggunakan bahasa pemrograman PHP, maka dia akan mengecek apakah gaya &lt;em&gt;&amp;ldquo;coding&amp;rdquo; (sintax)&lt;/em&gt; yang kita tulis sudah sesuai dengan &lt;a href=&#34;http://www.php-fig.org/psr/&#34;&gt;standar&lt;/a&gt; atau tidak.&lt;/p&gt;
&lt;h5 id=&#34;1-style-ci&#34;&gt;1. Style CI&lt;/h5&gt;
&lt;p&gt;&lt;a href=&#34;http://styleci.io&#34;&gt;Style CI&lt;/a&gt; ini salah satu layanan CI untuk pengecekan &lt;em&gt;sintax&lt;/em&gt; itu. Jadi dengan Style CI ini, kita dibantu mengecek seluruh &lt;em&gt;script&lt;/em&gt; di file-file PHP yang ada. Jika ditemukan &lt;strong&gt;sintax yang tidak sesuai standar&lt;/strong&gt;, maka Style CI &lt;strong&gt;menyatakan &amp;ldquo;tidak lolos uji&amp;rdquo;&lt;/strong&gt;, dan Style CI akan menawarkan &lt;em&gt;Pull Request&lt;/em&gt; untuk memperbaikinya.&lt;/p&gt;
&lt;p&gt;Contohnya seperti &lt;a href=&#34;https://github.com/nafiesl/free-pmo&#34;&gt;project Free PMO&lt;/a&gt;, sintaxnya ternyata banyak yang tidak standar, ada &lt;a href=&#34;https://styleci.io/analyses/XlovkN&#34;&gt;151 file&lt;/a&gt; yang diperbaiki melalui &lt;a href=&#34;https://github.com/nafiesl/free-pmo/pull/3/files&#34;&gt;Pull Request&lt;/a&gt; oleh Style CI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-12-testing-laravel-tentang-continuous-integration-06.jpg&#34; alt=&#34;Layanan Style CI&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sayangnya layanan ini gratis hanya untuk project open-source, untuk private repo berbayar.&lt;/p&gt;
&lt;h5 id=&#34;2-nitpick-ci&#34;&gt;2. Nitpick CI&lt;/h5&gt;
&lt;p&gt;Layanan serupa Style CI adalah &lt;a href=&#34;https://nitpick-ci.com&#34;&gt;Nitpick CI&lt;/a&gt;, gratis untuk project open-source dan berbayar untuk project private. Nitpick CI khusus untuk bahasa PHP dan &lt;a href=&#34;http://www.php-fig.org/psr/psr-2&#34;&gt;PSR-2&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;p&gt;Setelah pembahasan di atas, coba kita simpulkan manfaat dari layanan Continuous Integration.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CI membantu memastikan bahwa &lt;em&gt;automated testing&lt;/em&gt; project kita &lt;em&gt;passed&lt;/em&gt; diluar localhost (ini penting).&lt;/li&gt;
&lt;li&gt;CI sangat membantu dalam project kolaborasi yang dikerjakan oleh banyak developer.&lt;/li&gt;
&lt;li&gt;CI mempermudah kerja Project Maintainer, dalam membantu memastikan semua perubahan yang baru tidak &amp;ldquo;merusak&amp;rdquo; fitur-fitur yang telah ada.&lt;/li&gt;
&lt;li&gt;CI yang berkaitan dengan &lt;em&gt;sintax&lt;/em&gt; membantu kolaborator belajar standarisasi &lt;em&gt;sintax&lt;/em&gt; dan membantu agar kita lebih fokus kepada proses bisnis dan logika bisnis dalam project, &lt;del&gt;ketimbang berdebat tentang gaya menulis kode&lt;/del&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, lebih kurang itu manfaat yang kita dapatkan dari penggunaan layanan &lt;em&gt;Continuous Integration&lt;/em&gt; dalam membangun sebuah project. Saya &lt;strong&gt;mohon koreksi&lt;/strong&gt; dari teman-teman jika ada pemahaman saya yang keliru terkait &lt;em&gt;Continuous Integration&lt;/em&gt; ini.&lt;/p&gt;
&lt;p&gt;Satu lagi, &lt;em&gt;Continuous Integration&lt;/em&gt; &lt;strong&gt;tidak hanya digunakan saat development saja&lt;/strong&gt;, pada saat &lt;strong&gt;maintenance&lt;/strong&gt; dan &lt;strong&gt;improvement&lt;/strong&gt; pun &lt;em&gt;Continuous Integration&lt;/em&gt; akan tetap kita gunakan. Karena manfaat yang didapatkan dengan adanya &lt;em&gt;Continuous Integration&lt;/em&gt; ini bisa kita gunakan untuk jangka panjang. Mungkin itu salah satu sebab kenapa dinamakan &amp;ldquo;Integrasi secara terus menerus&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Selanjutnya insyaallah kita mencoba &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-setup-continuous-integration-dengan-travis-ci/&#34;&gt;&lt;strong&gt;setup Continuous Integration&lt;/strong&gt;&lt;/a&gt; menggunakan &lt;strong&gt;Travis CI&lt;/strong&gt; pada project &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;Testing Laravel&lt;/a&gt;. Terima kasih teman-teman atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Menghapus dengan Form Button</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-menghapus-dengan-form-button/</link>
       <pubDate>Thu, 07 Dec 2017 16:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-menghapus-dengan-form-button/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Kali ini kita akan membuat fitur hapus task. Pada &lt;strong&gt;Route Resource&lt;/strong&gt; Laravel, ada method request http khusus untuk melayani aktifitas penghapusan record, yaitu &lt;strong&gt;method &amp;ldquo;DELETE&amp;rdquo;&lt;/strong&gt;. Method &amp;ldquo;DELETE&amp;rdquo; ini dapat dilayani oleh aplikasi laravel jika kita mengirimkan request dari submit form, padahal biasanya kita melakukan submit form kan untuk fungsi &lt;strong&gt;create&lt;/strong&gt; dan &lt;strong&gt;update&lt;/strong&gt; ya? Sedangkan fungsi delete atau hapus record ini hanya berupa &lt;strong&gt;aksi satu tombol&lt;/strong&gt;, seperti halnya fungsi link atau &lt;em&gt;anchor tag&lt;/em&gt;. Misal tombol &amp;ldquo;Hapus Item&amp;rdquo;. Ketika tombol diklik, maka record dihapus dari sistem dan user diberi respons redirect ke halaman tertentu.&lt;/p&gt;
&lt;p&gt;Dari yang saya ketahui, ada 2 cara untuk mengirimkan request &amp;ldquo;delete&amp;rdquo; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Membuat &lt;strong&gt;form&lt;/strong&gt; dengan &lt;strong&gt;action&lt;/strong&gt; menuju method delete, yang hanya berisi &lt;strong&gt;tombol &amp;ldquo;Hapus&amp;rdquo;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Membuat &lt;strong&gt;tag anchor&lt;/strong&gt; (&lt;code&gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;/code&gt;) yang dapat &lt;strong&gt;dikonversi&lt;/strong&gt; dengan javascript agar berubah &lt;strong&gt;menjadi form&lt;/strong&gt; (&lt;a href=&#34;https://gist.github.com/JeffreyWay/5112282&#34;&gt;seperti ini&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yang biasa saya terapkan adalah cara pertama, karena lebih familiar dan dapat dijangkau oleh paket browserkit-testing Laravel. Cara yang kedua saya dapatkan dari mempelajari &lt;em&gt;source code&lt;/em&gt; sebuah package bernama &lt;a href=&#34;https://github.com/antoniputra/ngeblog&#34;&gt;Ngeblog&lt;/a&gt;, dan berdiskusi dengan authornya mas &lt;a href=&#34;https://github.com/antoniputra&#34;&gt;Antoni Putra&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nah, pada artikel ini kita akan menggunakan cara pertama dengan form. Cara ini biasa saya sebut dengan &lt;strong&gt;&amp;ldquo;Form Button&amp;rdquo;&lt;/strong&gt;, karena dia berupa sebuah form yang hanya berisi satu tombol.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Artikel ini adalah lanjutan dari artikel &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-form-edit-task/&#34;&gt;Testing Laravel: Form Edit Task&lt;/a&gt;. Jika teman-teman sudah mengikuti project TDD ini sampai artikel tersebut, silakan menggunakan projectnya. Saya mulai dari &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD&#34;&gt;repo Laravel-TDD&lt;/a&gt; pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/c6a5c7c646be7b495e45cdc7f14cee5c7d8e9545&#34;&gt;commit ini&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik, kita mulai dengan menjalankan PHPUnit untuk memastikan project kita tidak ada &lt;code class=&#34;test-red&#34;&gt;Failed&lt;/code&gt; test.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 31 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;membuat-method-test-untuk-hapus-task&#34;&gt;Membuat Method Test untuk Hapus Task&lt;/h3&gt;
&lt;p&gt;Kita kembali meng-edit file &lt;code&gt;tests/Feature/ManageTasksTest.php&lt;/code&gt; dan mulai mengerjakan method &lt;code&gt;user_can_delete_an_existing_task&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_create_a_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_browse_tasks_index_page()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_edit_an_existing_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_delete_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Buat &lt;em&gt;PHP comment line&lt;/em&gt; dulu untuk mempermudah kita membuat &lt;em&gt;testing script&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_delete_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User tekan tombol &amp;#34;Hapus Task&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke halaman daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Record task hilang dari database
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita buat &lt;em&gt;testing script&lt;/em&gt;-nya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_delete_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User tekan tombol &amp;#34;Hapus Task&amp;#34; (tombol dengan id=&amp;#34;edit_task_1&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Dimana angka 1 adalah id dari $task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;press&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;delete_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke halaman daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Record task hilang dari database
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dontSeeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, kemudian jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;InvalidArgumentException: Could not find a form that has
submit button [delete_task_1].
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum memiliki &lt;code&gt;form&lt;/code&gt; yang memiliki tombol &lt;code&gt;delete_task_1&lt;/code&gt;. Di mana &lt;code&gt;delete_task_1&lt;/code&gt; bisa berupa  &lt;strong&gt;tulisan&lt;/strong&gt; atau atribut &lt;strong&gt;value&lt;/strong&gt; pada tombol submit, bisa juga berupa atribut &lt;strong&gt;id&lt;/strong&gt; dari tombol submit tersebut.&lt;/p&gt;
&lt;h5 id=&#34;solusi-membuat-form-button&#34;&gt;Solusi (Membuat Form Button)&lt;/h5&gt;
&lt;p&gt;Pada view &lt;code&gt;tasks.index&lt;/code&gt; bagian daftar Task kita buat &lt;code&gt;form&lt;/code&gt; dengan tombol &lt;code&gt;delete_task_1&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @foreach ($tasks as $task) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;delete_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; class=&amp;#34;btn btn-xs&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}?action=edit&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt;id={% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        id=&amp;#34;edit_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        class=&amp;#34;pull-right&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @endforeach --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, kemudian jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-1&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A request to [http://localhost/tasks/1] failed. Received status code [405].
...
Caused by
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-1&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Request yang dikirimkan berupa &amp;ldquo;POST&amp;rdquo; ke &lt;code&gt;tasks/1&lt;/code&gt;, seharusnya kita mengirim request berupa &amp;ldquo;DELETE&amp;rdquo;.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Pada form berisi tombol delete di view &lt;code&gt;tasks.index&lt;/code&gt; kita tambahkan &lt;code&gt;{% raw&amp;quot; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;quot; &amp;gt;}}&lt;/code&gt; dan &lt;code&gt;{% raw&amp;quot; &amp;gt;}}{{ method_field(&#39;delete&#39;) }}{% endraw&amp;quot; &amp;gt;}}&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @foreach ($tasks as $task) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;delete&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;delete_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; class=&amp;#34;btn btn-xs&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}?action=edit&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt;id={% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        id=&amp;#34;edit_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        class=&amp;#34;pull-right&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @endforeach --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sebelum jalan PHPUnit, kita tambahkan dulu route untuk melayani requestnya di file &lt;code&gt;routes/web.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@store&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;patch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks/{task}&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@update&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;delete&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks/{task}&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@destroy&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-2&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BadMethodCallException: Method [destroy] does not exist.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-2&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Belum ada method &lt;code&gt;destroy&lt;/code&gt; di &lt;code&gt;TasksController&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-1&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat method &lt;code&gt;TasksController@destroy&lt;/code&gt; sekaligus dengan &lt;em&gt;script&lt;/em&gt; action untuk menghapus recordnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method update
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;destroy&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;delete&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;redirect&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-07-testing-laravel-menghapus-dengan-form-button-01.jpg&#34; alt=&#34;Passed Delete Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yayy.. &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt;. Sekarang lebih cepet ya dapat &lt;code class=&#34;test-green&#34;&gt;hijau&lt;/code&gt;? Iya, begitulah TDD. Semakin sering metode ini digunakan, maka semakin cepat kita menyelesaikan pekerjaan.&lt;/p&gt;
&lt;p&gt;Baik sekarang kita coba &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#mencoba-fitur-input-task-pada-browser&#34;&gt;buka browser&lt;/a&gt; untuk melihat hasilnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-07-testing-laravel-menghapus-dengan-form-button-02.jpg&#34; alt=&#34;Posisi Delete Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Posisi tombol hapusnya kurang pas ya, kita perbaiki sedikit posisi tampilannya. Kira-kira begini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @foreach ($tasks as $task) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$task-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34; class=&amp;#34;pull-right&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        onsubmit=&amp;#34;return confirm(&amp;#39;Are U sure to delete this task?&amp;#39;)&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;delete&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;delete_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; class=&amp;#34;btn btn-link btn-xs&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}?action=edit&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt;id={% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            id=&amp;#34;edit_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- @endforeach --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ada tambahan class bootstrap pada form dan tombol hapus, &lt;strong&gt;Link Edit&lt;/strong&gt; kita masukkan ke dalam form, dan ada tambahan &lt;strong&gt;dialog konfirmasi&lt;/strong&gt; javascript ketika akan menghapus task.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-07-testing-laravel-menghapus-dengan-form-button-03.jpg&#34; alt=&#34;Tombol Delete Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Baik, sekarang kita jalankan lagi PHPUnit untuk memastikan tidak ada masalah setelah perubahan view barusan.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seharusnya kita tetap dapat hasil &lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 36 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tapi ada pertanyaan&lt;/strong&gt; : Itu &lt;em&gt;kan&lt;/em&gt; ada &lt;strong&gt;&amp;ldquo;dialog konfirmasi&amp;rdquo;&lt;/strong&gt; di browser pada saat kita menghapus task, kenapa tidak ada perubahan di sisi testingnya untuk mengkonfirmasi dialog itu? &lt;em&gt;Yap&lt;/em&gt;, bagian itu (afaik) memang &lt;strong&gt;tidak dapat &amp;ldquo;dijangkau&amp;rdquo;&lt;/strong&gt; oleh Browserkit Testing Laravel. Sebagaimana yang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-testing-validasi-form/#perbedaan-this-submitform-dengan-this-post&#34;&gt;sebelumnya pernah kita bahas&lt;/a&gt;, Browserkit dibantu oleh &lt;a href=&#34;https://github.com/symfony/dom-crawler&#34;&gt;DOM Crawler Symfony&lt;/a&gt;, hanya dapat mendeteksi elemen html yang di-&lt;em&gt;render&lt;/em&gt; pada browser, sehingga tidak bisa berinteraksi dengan javascript.&lt;/p&gt;
&lt;p&gt;Jika ingin memiliki paket testing yang lengkap hingga interaksi dengan javascript, teman-teman bisa mencoba &lt;a href=&#34;https://laravel.com/docs/5.5/dusk&#34;&gt;Browser Test - Laravel Dusk&lt;/a&gt; milik Laravel. Akan tetapi dalam waktu dekat kita tidak akan membahas Laravel Dusk di sini, karena saya sendiri belum familiar dengan paket browser test tersebut. :)&lt;/p&gt;
&lt;p&gt;Baik, sampai disini artikel menghapus task dengan Form Button. Jika teman-teman ada yang mempraktekkan dan mengalami permasalahan, silakan disampaikan melalui komentar.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita akan membahas &lt;a href=&#34;https://blog.inweeks.com/tool/testing-laravel-tentang-continuous-integration/&#34;&gt;tentang Continuous Integration&lt;/a&gt; dan &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-setup-continuous-integration-dengan-travis-ci/&#34;&gt;setup Continuous Integration&lt;/a&gt; dengan Travis CI pada project ini. Teman-teman juga boleh langsung lompat ke artikel &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-toggle-status-task-dengan-form-button/&#34;&gt;toggle status task dengan form button&lt;/a&gt; jika tidak belum berminat dengan Continuous Integration.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Form Edit Task</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-form-edit-task/</link>
       <pubDate>Tue, 05 Dec 2017 10:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-form-edit-task/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim.&lt;/p&gt;
&lt;p&gt;Pada artikel sebelumnya kita sudah membuat &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-menggunakan-model-factory/#solusi-1&#34;&gt;link untuk melakukan edit task&lt;/a&gt;, tetapi link tersebut belum bekerja. Link tersebut akan kita gunakan untuk menampilkan &lt;strong&gt;form edit task&lt;/strong&gt; pada halaman yang sama (view &lt;code&gt;tasks.index&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Jika teman-teman sudah mengikuti artikel &lt;a href=&#34;https://blog.inweeks.com/tags/testing&#34;&gt;Testing Laravel ini sejak awal&lt;/a&gt;, silakan menggunakan projectnya. Jika tidak, silakan menggunakan &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/48b8d6eeadffe56a418a87315aa57e49c991f6af&#34;&gt;commit pada repo ini&lt;/a&gt; (sampai update artikel sebelumnya).&lt;/p&gt;
&lt;p&gt;Baik, seperti biasa, kita mulai kerja dengan menjalankan testing dulu.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 22 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Untuk membuat &lt;strong&gt;form edit task&lt;/strong&gt;, kita lakukan dengan meng-edit file &lt;code&gt;tests/Feature/ManageTasksTest.php&lt;/code&gt;. Pada file ini kita perhatikan method &lt;code&gt;user_can_edit_an_existing_task&lt;/code&gt;. Kita akan bekerja dari sini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_create_a_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_browse_tasks_index_page()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_edit_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_delete_an_existing_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baik, kita buat &lt;em&gt;PHP comment line&lt;/em&gt; yang menjadi panduan kita.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_edit_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Klik tombol edit task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat URL yang dituju sesuai dengan target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Tampil form Edit Task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User submit form berisi nama dan deskripsi task yang baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke URL sesuai dengan target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Record pada database berubah sesuai dengan nama dan deskripsi baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oke sekarang kita buat &lt;em&gt;script testing&lt;/em&gt; sesuai dengan langkah kerja di atas.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_edit_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 1 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Klik tombol edit task (link dengan id=&amp;#34;edit_task_1&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Dimana angka 1 adalah id dari $task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;click&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat URL yang dituju sesuai dengan target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks?action=edit&amp;amp;id=&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Tampil form Edit Task, kita cek apakah ada form dengan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// id=&amp;#34;edit_task_1&amp;#34; dan action=&amp;#34;tasks/1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeElement&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;form&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;action&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User submit form berisi nama dan deskripsi task yang baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;submitForm&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Update Task&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Updated Task&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Updated task description.&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat halaman web ter-redirect ke URL sesuai dengan target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// yaitu &amp;#39;/tasks&amp;#39;, kembali ke daftar task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Record pada database berubah sesuai nama dan deskripsi baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Updated Task&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Updated task description.&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, kemudian jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Failed asserting that the page contains the element [form] with the attributes
{&amp;#34;id&amp;#34;:&amp;#34;edit_task_1&amp;#34;,&amp;#34;action&amp;#34;:&amp;#34;http:\/\/localhost\/tasks\/1&amp;#34;}.
Please check the content above.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum memiliki &lt;code&gt;&amp;lt;form id=&amp;quot;edit_task_1&amp;quot; action=&amp;quot;http://localhost/tasks/1&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Pada view &lt;code&gt;tasks.index&lt;/code&gt; kita buat &lt;code&gt;&amp;lt;form id=&amp;quot;edit_task_1&amp;quot; action=&amp;quot;http://localhost/tasks/1&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;edit_task_1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks/1&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- form create task --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-1&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;InvalidArgumentException: Could not find a form that has submit button
[Update Task].
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;stop&#34;&gt;Stop!!&lt;/h4&gt;
&lt;p&gt;Kalau kita perhatikan, di sini progress kita berlanjut, karena error yang kita dapatkan sudah berubah (artinya error sebelumnya sudah &lt;em&gt;solved&lt;/em&gt;). &lt;strong&gt;Sebenarnya belum&lt;/strong&gt;, karena pada &lt;em&gt;script testing&lt;/em&gt; di bawah ini kita hanya menguji apakah &lt;strong&gt;form&lt;/strong&gt; dengan kriteria :&lt;br&gt;
&lt;code&gt;id=&amp;quot;edit_task_1&amp;quot; action=&amp;quot;{% raw&amp;quot; &amp;gt;}}{{ url(&#39;tasks/1&#39;) }}{% endraw&amp;quot; &amp;gt;}}&amp;quot;&lt;/code&gt; &lt;strong&gt;tampil&lt;/strong&gt; di halaman web.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_edit_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Tampil form Edit Task, kita cek apakah ada form dengan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// id=&amp;#34;edit_task_1&amp;#34; dan action=&amp;#34;tasks/1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeElement&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;form&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;action&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Padahal kita masih menggunakan sintaks html statis &lt;code&gt;&amp;lt;form id=&amp;quot;edit_task_1&amp;quot; action=&amp;quot;{% raw&amp;quot; &amp;gt;}}{{ url(&#39;tasks/1&#39;) }}{% endraw&amp;quot; &amp;gt;}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&lt;/code&gt;. Artinya kita harus membuat &lt;strong&gt;angka 1&lt;/strong&gt; disini menjadi &lt;strong&gt;dinamis&lt;/strong&gt; sesuai dengan id dari task yang akan kita edit.&lt;/p&gt;
&lt;p&gt;Untuk membuat angka 1 tersebut menjadi dinamis, kita kerjakan mulai dari controllernya. Buka &lt;code&gt;TasksController&lt;/code&gt;, kemudian buat blok if untuk mengecek apakah terdapat &lt;em&gt;query string&lt;/em&gt; &lt;strong&gt;id&lt;/strong&gt; dan &lt;strong&gt;action=edit&lt;/strong&gt; pada &lt;strong&gt;request&lt;/strong&gt;. Ini sesuai dengan link edit task yang kita buat pada view &lt;code&gt;tasks.index&lt;/code&gt; pada artikel sebelumnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $tasks &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;all&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $editableTask &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;action&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $editableTask &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;find&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks.index&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;compact&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;editableTask&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method store
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Penambahan script di atas dimaksudkan agar &lt;strong&gt;ketika&lt;/strong&gt; ada &lt;em&gt;query string&lt;/em&gt; &lt;strong&gt;id&lt;/strong&gt; dan &lt;strong&gt;action=edit&lt;/strong&gt;, kita buat variabel &lt;code&gt;$editableTask&lt;/code&gt; berisi record model Task yang ingin kita edit.&lt;/p&gt;
&lt;p&gt;Oke, selanjutnya kita edit view &lt;code&gt;tasks.index&lt;/code&gt; dengan menambahkan blok if untuk mengecek apakah variabel &lt;code&gt;$editabelTask&lt;/code&gt; &lt;strong&gt;tidak&lt;/strong&gt; bernilai &lt;code&gt;null&lt;/code&gt; dan terdapat &lt;code&gt;action=edit&lt;/code&gt; pada &lt;strong&gt;request&lt;/strong&gt;, serta menyesuaikan &lt;strong&gt;angka id form edit&lt;/strong&gt; task.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @if (! is_null($editableTask) &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; request(&amp;#39;action&amp;#39;) == &amp;#39;edit&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;edit_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $editableTask-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; action=&amp;#34;{% raw&amp;#34; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$editableTask-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- form create task --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baik sekarang jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-2&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;InvalidArgumentException: Could not find a form that has submit button
[Update Task].
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oke, hasil error ini tetap sama dengan hasil error pada &lt;a href=&#34;#hasil-error-1&#34;&gt;tahap sebelumnya&lt;/a&gt;, sebelum kita membuat variabel &lt;code&gt;$editableTask&lt;/code&gt; di controller dan view barusan.&lt;/p&gt;
&lt;p&gt;Baik kita lanjutkan untuk memperbaiki error ini.&lt;/p&gt;
&lt;h5 id=&#34;penyebab-1&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum memiliki tombol submit &lt;strong&gt;Update Task&lt;/strong&gt; pada form edit task.&lt;/p&gt;
&lt;h5 id=&#34;solusi-1&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat tombol submit &lt;strong&gt;Update Task&lt;/strong&gt; pada form edit task.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @if (! is_null($editableTask) &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; request(&amp;#39;action&amp;#39;) == &amp;#39;edit&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;edit_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $editableTask-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; action=&amp;#34;{% raw&amp;#34; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$editableTask-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Update Task&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-primary&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- form create task --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-3&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;InvalidArgumentException: Unreachable field &amp;#34;name&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-2&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum input text &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-2&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat input text &lt;code&gt;name&lt;/code&gt; pada edit task. Error yang serupa juga akan muncul untuk input &lt;code&gt;description&lt;/code&gt;, maka kita buat sekalian saja. Kita jua membuat &lt;code&gt;{% raw&amp;quot; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;quot; &amp;gt;}}&lt;/code&gt; dan &lt;code&gt;{% raw&amp;quot; &amp;gt;}}{{ method_field(&#39;patch&#39;) }}{% endraw&amp;quot; &amp;gt;}}&lt;/code&gt; karena proses ini adalah proses update record.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @if (! is_null($editableTask) &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; request(&amp;#39;action&amp;#39;) == &amp;#39;edit&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;edit_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $editableTask-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; action=&amp;#34;{% raw&amp;#34; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$editableTask-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;patch&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Name&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Description&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Update Task&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-primary&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- form create task --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-4&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A request to [http://localhost/tasks/1] failed. Received status code [404].
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-3&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita belum membuat route untuk melayani action update record task.&lt;/p&gt;
&lt;h5 id=&#34;solusi-3&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Tambahkan route &lt;code&gt;Route::patch(&#39;tasks/{task}&#39;, &#39;TasksController@update&#39;)&lt;/code&gt; pada &lt;code&gt;routes/web.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@store&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;patch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks/{task}&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@update&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Selanjutnya buat method &lt;code&gt;TasksController@update&lt;/code&gt; langsung dengan script &lt;strong&gt;update record task&lt;/strong&gt; dan redirect ke halaman &lt;code&gt;/tasks&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method store
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// dd(request()-&amp;gt;all());
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;only&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;redirect&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-04-testing-laravel-form-edit-task-01.jpg&#34; alt=&#34;Passed Edit Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yeyy.. &lt;code class=&#34;test-green&#34;&gt;Hijauuuu!!&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Baik. sampai di sini karena sudah dapat &lt;code class=&#34;test-green&#34;&gt;Hijau&lt;/code&gt;, kita coba tambahkan validasi dan &lt;em&gt;refactor&lt;/em&gt; sedikit controllernya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method store
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $taskData &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;validate&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|max:255&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|max:255&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $task&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;update&lt;/span&gt;($taskData);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;redirect&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seharusnya kita tetap dapat hasil &lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 31 assertions)&lt;/code&gt;. Sekarang kita coba &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#mencoba-fitur-input-task-pada-browser&#34;&gt;lihat melalui browser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-04-testing-laravel-form-edit-task-02.jpg&#34; alt=&#34;Tampilan Edit Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hmmm.. sepertinya perlu sedikit kita perbaiki. Bagaimana kalau kita buat seperti ini?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @if (count($errors) &amp;gt; 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alert alert-danger&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-unstyled&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    @foreach ($errors-&amp;gt;all() as $error)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;{% raw&amp;#34; &amp;gt;}}{{ $error }}{% endraw&amp;#34; &amp;gt;}}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    @endforeach
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @if (! is_null($editableTask) &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; request(&amp;#39;action&amp;#39;) == &amp;#39;edit&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;Edit Task {% raw&amp;#34; &amp;gt;}}{{ $editableTask-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;edit_task_{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ $editableTask-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; action=&amp;#34;{% raw&amp;#34; &amp;gt;}}{{ url(&amp;#39;tasks/&amp;#39;.$editableTask-&amp;gt;id) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {% raw&amp;#34; &amp;gt;}}{{ method_field(&amp;#39;patch&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Name&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ old(&amp;#39;name&amp;#39;, $editableTask-&amp;gt;name) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Description&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt;&amp;gt;{% raw&amp;#34; &amp;gt;}}{{ old(&amp;#39;description&amp;#39;, $editableTask-&amp;gt;description) }}{% endraw&amp;#34; &amp;gt;}}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Update Task&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-primary&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; class=&amp;#34;btn btn-default&amp;#34;&amp;gt;Cancel&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @else
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Name&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ old(&amp;#39;name&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Description&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt;&amp;gt;{% raw&amp;#34; &amp;gt;}}{{ old(&amp;#39;description&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-primary&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasilnya seperti di bawah ini, dimana form &lt;strong&gt;Create Task&lt;/strong&gt; tidak muncul saat edit task.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-12-04-testing-laravel-form-edit-task-03.jpg&#34; alt=&#34;Perbaikan Daftar Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Terakhir, jalankan PHPUnit untuk memastikan tidak ada yang &amp;ldquo;rusak&amp;rdquo; setelah kita mengubah form view tadi.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seharusnya kita tetap dapat hasil &lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 31 assertions)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Baik sampai di sini kita membuat form edit task dengan bantuan Testing Laravel. Pada project ini kita menampilkan halaman edit form pada view &lt;code&gt;tasks.index&lt;/code&gt;. Teman-teman bebas jika ingin membuat halaman sendiri untuk form create dan edit tasknya.&lt;/p&gt;
&lt;p&gt;Jika ada yang kurang dipahami pada artikel kali ini, silakan teman-teman sampaikan dikomentar. Selanjutnya kita akan membahas tentang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-menghapus-dengan-form-button/&#34;&gt;menghapus task dengan &lt;strong&gt;Form Button&lt;/strong&gt;&lt;/a&gt;. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Menggunakan Model Factory</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-menggunakan-model-factory/</link>
       <pubDate>Wed, 29 Nov 2017 22:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-menggunakan-model-factory/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim&lt;/p&gt;
&lt;p&gt;Di beberapa artikel sebelumnya kita masih bicara seputar satu fitur, yaitu &lt;strong&gt;Input Task&lt;/strong&gt;. Sekarang kita akan membuat testing agar user dapat &lt;strong&gt;melihat daftar Task&lt;/strong&gt; yang ada. Sebenarnya fitur ini secara tidak langsung sudah ada pada tahap pengerjaan fitur sebelumnya, kita sudah dapat melihat daftar task. Tetapi kali ini kita membuat task tanpa harus input task dari form. Kita akan memanfaatkan &lt;a href=&#34;https://laravel.com/docs/5.5/database-testing#writing-factories&#34;&gt;&lt;strong&gt;Model Factory Laravel&lt;/strong&gt;&lt;/a&gt; untuk meng-&lt;em&gt;generate&lt;/em&gt; beberapa task pada testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model Factory&lt;/strong&gt; adalah fitur yang berfungsi untuk membuat &lt;em&gt;instance&lt;/em&gt; dari kelas model laravel dengan atribut-atribut yang sesuai dengan kolom-kolom tabel yang sesuai pada database. Setiap penggunaan model factory akan menghasilkan &lt;em&gt;instance&lt;/em&gt; model atau collection (list) dari beberapa model yang sama.&lt;/p&gt;
&lt;p&gt;Pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-definisi-fitur-dan-first-failing-test/#membuat-method-test&#34;&gt;artikel Definisi Fitur&lt;/a&gt;, kita sudah membuat sebuah test method untuk artikel ini, yaitu &lt;code&gt;user_can_browse_tasks_index_page&lt;/code&gt;. Isinya hanya &lt;code&gt;$this-&amp;gt;assertTrue(true);&lt;/code&gt;, sebuah assert sederhana agar test method ini &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt; (untuk sementara waktu). Kita akan bekerja pada method test ini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_create_a_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_browse_tasks_index_page&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_edit_an_existing_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_delete_an_existing_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sebelum mulai kerja, kita jalankan dulu PHPUnit, untuk memastikan aplikasi tidak ada masalah.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 13 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;membuat-test-method&#34;&gt;Membuat Test Method&lt;/h3&gt;
&lt;p&gt;Sekarang kita lanjut mendefinisikan langkah dalam testing method tersebut (dalam bentuk &lt;em&gt;PHP comment line&lt;/em&gt;) sesuai yang kita inginkan. Seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_browse_tasks_index_page&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 3 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User melihat ketiga task tampil pada halaman.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User melihat link untuk edit task pada masing-masing item task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baik, itu misinya, sekarang kita buat &lt;em&gt;script&lt;/em&gt; untuk memenuhi langkah tersebut.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Task&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan ini
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_create_a_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_browse_tasks_index_page&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Generate 3 record task pada table `tasks`.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $tasks &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User membuka halaman Daftar Task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User melihat ketiga task tampil pada halaman.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;see&lt;/span&gt;($tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;see&lt;/span&gt;($tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;see&lt;/span&gt;($tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User melihat link untuk edit task pada masing-masing item task.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;lt;a href=&amp;#34;/tasks?action=edit&amp;amp;id=1&amp;#34; id=&amp;#34;edit_task_1&amp;#34;&amp;gt;edit&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeElement&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;href&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks?action=edit&amp;amp;id=&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;lt;a href=&amp;#34;/tasks?action=edit&amp;amp;id=2&amp;#34; id=&amp;#34;edit_task_2&amp;#34;&amp;gt;edit&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeElement&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;href&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks?action=edit&amp;amp;id=&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;lt;a href=&amp;#34;/tasks?action=edit&amp;amp;id=3&amp;#34; id=&amp;#34;edit_task_3&amp;#34;&amp;gt;edit&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeElement&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;edit_task_&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;href&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks?action=edit&amp;amp;id=&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$tasks[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Jangan lupa &lt;code&gt;use App\Task;&lt;/code&gt; di atas kelas ManageTasksTest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oke, kita jalankan PHPUnit untuk mendapatkan error pertama.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;InvalidArgumentException: Unable to locate factory with name [default] [App\Task].
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita &lt;strong&gt;belum memiliki model factory&lt;/strong&gt; untuk model &lt;code&gt;App\Task&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita belum buat model factory untuk model &lt;code&gt;App\Task&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;membuat-model-factory-apptask&#34;&gt;Membuat Model Factory &amp;ldquo;App\Task&amp;rdquo;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:factory TaskFactory --model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;Task
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Laravel akan membuat &lt;code&gt;database/factories/TaskFactory.php&lt;/code&gt;. Kita edit file tersebut dan tambahkan atribut &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt; untuk model &lt;code&gt;App\Task&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Faker\Generator&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Faker&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$factory&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;define&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;App\Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;Faker&lt;/span&gt; $faker) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $faker&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;word&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; $faker&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;sentence&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-1&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Failed asserting that the page contains the element [a] with the attributes
{&amp;#34;id&amp;#34;:&amp;#34;edit_task_1&amp;#34;,&amp;#34;href&amp;#34;:&amp;#34;http:\/\/localhost\/tasks?action=edit&amp;amp;id=1&amp;#34;}.
Please check the content above.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab-1&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kita &lt;strong&gt;belum membuat link&lt;/strong&gt; untuk edit masing-masing task.&lt;/p&gt;
&lt;h5 id=&#34;solusi-1&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Buka view &lt;code&gt;tasks.index&lt;/code&gt; atau file &lt;code&gt;resources/views/tasks/index.blade.php&lt;/code&gt;, kita buat link untuk edit masing-masing task.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- resources/views/tasks/index.blade.php --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;Tasks&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            @foreach ($tasks as $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}?action=edit&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;amp;&lt;/span&gt;id={% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        id=&amp;#34;edit_task_{% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;id }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        class=&amp;#34;pull-right&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            @endforeach
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan PHPUnit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 22 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sip, sekarang sudah dapat &lt;code class=&#34;test-green&#34;&gt;Hijau&lt;/code&gt;. Artinya ketiga task yang kita &lt;em&gt;generate&lt;/em&gt; dengan model factory tadi sudah muncul pada halaman web, beserta link edit nya masing-masing.&lt;/p&gt;
&lt;p&gt;Sekarang coba kita &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#mencoba-fitur-input-task-pada-browser&#34;&gt;buka aplikasi melalui browser&lt;/a&gt;, kita lihat tampilannya setelah ditambahkan link edit seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-29-testing-laravel-menggunakan-model-factory-01.jpg&#34; alt=&#34;Link Edit Task&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sampai di sini proses TDD kita untuk fitur &lt;strong&gt;melihat daftar Task&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Kita lanjut bahas sedikit tentang beberapa method assert yang kita gunakan di atas.&lt;/p&gt;
&lt;h3 id=&#34;method-this-see&#34;&gt;Method &amp;ldquo;$this-&amp;gt;see()&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Method &lt;code&gt;$this-&amp;gt;see()&lt;/code&gt; adalah method assert browserkit &lt;strong&gt;untuk melihat teks&lt;/strong&gt; pada halaman html. Method ini kita gunakan untuk melihat teks apapun yang kita ingin lihat pada halaman web, baik di dalam tag heading, paragraf, form, label, div, dan lain-lain.&lt;/p&gt;
&lt;h5 id=&#34;contoh&#34;&gt;Contoh&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$this-&amp;gt;see(&amp;#39;123&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;akan &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt; jika di dalam halaman terdapat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;Rp. 123.000&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;Testing 123&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;badge&amp;#34;&lt;/span&gt;&amp;gt;Status 123&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;method-this-seeelement&#34;&gt;Method &amp;ldquo;$this-&amp;gt;seeElement()&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Method &lt;code&gt;$this-&amp;gt;seeElement()&lt;/code&gt; adalah method assert browserkit &lt;strong&gt;untuk melihat element&lt;/strong&gt; pada halaman html. Method ini kita gunakan untuk melihat apakah terdapat elemen tersebut (beserta atributnya) dalam halaman html.&lt;/p&gt;
&lt;h5 id=&#34;contoh-passed&#34;&gt;Contoh Passed&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$this-&amp;gt;seeElement(&amp;#39;h1&amp;#39;, [&amp;#39;class&amp;#39; =&amp;gt; &amp;#39;page-header&amp;#39;, &amp;#39;id&amp;#39; =&amp;gt; &amp;#39;judul-halaman&amp;#39;]);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;akan &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt; jika di dalam halaman terdapat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page-header&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;judul-halaman&amp;#34;&lt;/span&gt;&amp;gt;Rp. 123.000&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page-header&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;judul-halaman&amp;#34;&lt;/span&gt;&amp;gt;Judul Halaman&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$this-&amp;gt;seeElement(&amp;#39;button&amp;#39;, [&amp;#39;class&amp;#39; =&amp;gt; &amp;#39;btn btn-info&amp;#39;]);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;akan &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt; jika di dalam halaman terdapat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-info&amp;#34;&lt;/span&gt;&amp;gt;Submit&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;button&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-info&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;judul-halaman&amp;#34;&lt;/span&gt;&amp;gt;Simpan&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;contoh-failed&#34;&gt;Contoh Failed&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$this-&amp;gt;seeElement(&amp;#39;h1&amp;#39;, [&amp;#39;class&amp;#39; =&amp;gt; &amp;#39;page-header&amp;#39;, &amp;#39;id&amp;#39; =&amp;gt; &amp;#39;judul-halaman&amp;#39;]);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;akan &lt;code class=&#34;test-red&#34;&gt;failed&lt;/code&gt; jika di dalam halaman &lt;strong&gt;hanya&lt;/strong&gt; terdapat :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page-header&amp;#34;&lt;/span&gt;&amp;gt;Rp. 123.000&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;judul-halaman&amp;#34;&lt;/span&gt;&amp;gt;Judul Halaman&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oke, mudah-mudahan teman-teman yang mencoba praktek artikel ini mendapatkan hasil yang sesuai dengan proses di atas. Jika menemui kendala atau ada keliru dalam proses di atas, silakan disampaikan melalui komentar.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita akan mengerjakan &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-form-edit-task/&#34;&gt;Form Edit Task&lt;/a&gt; dari link edit yang sudah dibuat di atas. Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Testing Validasi Form</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-testing-validasi-form/</link>
       <pubDate>Mon, 27 Nov 2017 07:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-testing-validasi-form/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim&lt;/p&gt;
&lt;p&gt;Kita lanjutkan membuat validasi form input task. Mungkin teman-teman sudah melihat, ketika membuka aplikasi pada url &lt;code&gt;/tasks&lt;/code&gt;, kemudian langsung tekan tombol &lt;strong&gt;Create Task&lt;/strong&gt; (submit form) tanpa mengisi field &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt;, kita dapatkan error seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-27-testing-laravel-testing-validasi-form-01.jpg&#34; alt=&#34;Error SQL tanpa validasi&#34;&gt;&lt;/p&gt;
&lt;p&gt;Error ini disebabkan karena kolom &lt;code&gt;name&lt;/code&gt; tidak boleh bernilai &lt;strong&gt;null&lt;/strong&gt; saat diinput ke database. Sebagaimana file migration untuk table &lt;code&gt;tasks&lt;/code&gt; : xxxxx_create_tasks_table.php, &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt; tidak diset &lt;strong&gt;nullable&lt;/strong&gt;. Error ini juga akan terjadi jika kolom &lt;code&gt;description&lt;/code&gt; kosong.&lt;/p&gt;
&lt;p&gt;Solusinya, kita harus buat validasi form input task ini, untuk memastikan user menginput data dengan benar. Karena misi kita menerapkan TDD, maka kita juga buat testing sebelum membuat validasi form.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Di sini starting point saya berasal dari &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/dbf82362ae6ff105b1790643e5653108edcd1718&#34;&gt;commit repo ini&lt;/a&gt; pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mempercantik-tampilan-web/&#34;&gt;artikel sebelumnya&lt;/a&gt;. Teman-teman silakan teruskan project sendiri jika sudah mengikuti artikel ini dari awal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;membuat-testing-untuk-menguji-validasi-form&#34;&gt;Membuat Testing untuk menguji validasi form&lt;/h3&gt;
&lt;p&gt;Seperti biasa sebelum mulai kerja, kita pastikan semua testing passed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (6 tests, 13 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sip, kita lanjutkan. Buka file &lt;code&gt;tests/Feature/ManageTasksTest.php&lt;/code&gt;, tambahkan method test baru seperti berikut :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Kelas ManageTasksTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... user_can_create_a_task()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;task_entry_must_pass_validation&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Submit form untuk membuat task baru
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// dengan field name description kosong
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek pada session apakah ada error untuk field nama dan description
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertSessionHasErrors&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Session missing key: errors
Failed asserting that false is true.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Belum muncul error (dari validasi) pada session, karena kita belum membuat validasi pada &lt;code&gt;TasksController@store&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Tambahkan script validasi Laravel untuk field &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;store&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;validate&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|max:255&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;required|max:255&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;only&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&#34;test-green&#34;&gt;OK (7 tests, 16 assertions)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sip. Kita sudah dapat hijau lagi. Sekarang kita coba &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/#mencoba-fitur-input-task-pada-browser&#34;&gt;buka aplikasi dari browser&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;menampilkan-error-validasi-form&#34;&gt;Menampilkan error validasi form&lt;/h3&gt;
&lt;p&gt;Kita coba klik tombol &lt;strong&gt;Create Task&lt;/strong&gt; (submit form). Nah, error SQL sebelumnya sudah hilang. Kita sudah redirect ke halaman sebelumnya, tetapi belum ada tampilan pesan (error) validasi form. Oke, kita tambahkan script untuk menampilkan error validasinya pada view &lt;code&gt;tasks.index&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @if (count($errors) &amp;gt; 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alert alert-danger&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-unstyled&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    @foreach ($errors-&amp;gt;all() as $error)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;{% raw&amp;#34; &amp;gt;}}{{ $error }}{% endraw&amp;#34; &amp;gt;}}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    @endforeach
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simpan, kita kembali ke browser dan coba klik &lt;strong&gt;Create Task&lt;/strong&gt; lagi. Seharusnya kita dapatkan tampilan seperti ini, pesan dari validasi form sudah muncul.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-27-testing-laravel-testing-validasi-form-03.jpg&#34; alt=&#34;Tampil error validasi&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sekarang kita coba jalankan PHPUnit, untuk memastikan tidak ada yang error/kerusakan dari perubahan barusan.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-27-testing-laravel-testing-validasi-form-04.jpg&#34; alt=&#34;Testing tetap passed setelah ditambahkan validasi form&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ok, sampai di sini selesai penambahan fitur validasi untuk form Input Task.&lt;/p&gt;
&lt;p&gt;Mungkin sebagian teman-teman ada yang bertanya, kenapa kita menggunakan &lt;code&gt;$this-&amp;gt;post()&lt;/code&gt; saat &lt;strong&gt;menguji validasi form&lt;/strong&gt;, bukan menggunakan &lt;code&gt;$this-&amp;gt;submitForm()&lt;/code&gt; seperti saat testing input task.&lt;/p&gt;
&lt;h4 id=&#34;perbedaan-this-submitform-dengan-this-post&#34;&gt;Perbedaan &amp;ldquo;$this-&amp;gt;submitForm()&amp;rdquo; dengan &amp;ldquo;$this-&amp;gt;post()&amp;rdquo;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pada &lt;code&gt;$this-&amp;gt;submitForm()&lt;/code&gt;&lt;br&gt;
Paket &lt;a href=&#34;https://github.com/Laravel/browser-kit-testing&#34;&gt;browserkit testing&lt;/a&gt; berinteraksi dengan halaman web, dia mendeteksi halaman web dengan bantuan &lt;a href=&#34;https://github.com/symfony/dom-crawler&#34;&gt;DOM Crawler Symfony&lt;/a&gt;. Yaitu mencari komponen html berupa tag &lt;code&gt;form&lt;/code&gt; yang didalamnya ada tombol submit dengan tulisan &lt;strong&gt;Create Task&lt;/strong&gt;, mencari input field bernama &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt;, kemudian melakukan submit form seolah-olah menekan tombol submit &lt;strong&gt;Create Task&lt;/strong&gt; tadi. Method &lt;code&gt;$this-&amp;gt;submitForm()&lt;/code&gt; ini juga dapat menerima respons saat aplikasi redirect ke halaman lain.&lt;/p&gt;
&lt;p&gt;Kekurangan dari method &lt;code&gt;$this-&amp;gt;submitForm()&lt;/code&gt; ini, dia &lt;strong&gt;tidak mendeteksi isi session&lt;/strong&gt; Laravel. Sehingga pesan validasi form yang ingin kita cek (di testing) pada session Laravel tidak terlihat. (Mohon koreksi jika saya keliru paham tentang ini).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada &lt;code&gt;$this-&amp;gt;post()&lt;/code&gt;&lt;br&gt;
Paket browserkit testing berinteraksi dengan HTTP Request langsung ke URL yang dituju (misal &lt;code&gt;/tasks&lt;/code&gt;) dengan method &lt;code&gt;post&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Method &lt;code&gt;$this-&amp;gt;post()&lt;/code&gt; ini tidak &lt;del&gt;perduli&lt;/del&gt; berinteraksi dengan halaman web, dia langsung mengirim request ke URL tujuan (dengan method yang sesuai). Method ini &lt;strong&gt;dapat berinteraksi dengan session&lt;/strong&gt; Laravel, karenanya kita dapat melihat session yang berisi pesan (error) validasi form.&lt;/p&gt;
&lt;p&gt;Kekurangan dari method &lt;code&gt;$this-&amp;gt;post()&lt;/code&gt; ini, dia mengabaikan form yang kita buat di view. Ketika kita melakukan perubahan field di view, misal nama field &lt;code&gt;description&lt;/code&gt; diubah menjadi &lt;code&gt;deskripsi_task&lt;/code&gt; (tetapi pada testing tidak disesuaikan), method ini tidak perduli dengan perubahan itu (testing tetap &lt;code class=&#34;test-green&#34;&gt;passed&lt;/code&gt;), karena dia langsung melakukan request ke URL yang dituju.&lt;/p&gt;
&lt;p&gt;Sedangkan method &lt;code&gt;$this-&amp;gt;submitForm()&lt;/code&gt;, dia akan berpengaruh terhadap perubahan ini. Testing akan &lt;code class=&#34;test-red&#34;&gt;fail&lt;/code&gt; karena &lt;strong&gt;nama field&lt;/strong&gt; di view &lt;strong&gt;berbeda&lt;/strong&gt; dengan yang di script testing.&lt;/p&gt;
&lt;p&gt;BTW, selain &lt;code&gt;$this-&amp;gt;post()&lt;/code&gt;, ada juga &lt;code&gt;$this-&amp;gt;get()&lt;/code&gt;, &lt;code&gt;$this-&amp;gt;patch()&lt;/code&gt;, &lt;code&gt;$this-&amp;gt;put()&lt;/code&gt;, dan &lt;code&gt;$this-&amp;gt;delete()&lt;/code&gt;. Masing-masing method ini akan berinteraksi dengan method yang sesuai saat kita mendifinisikan Route pada file &lt;code&gt;routes/web.php&lt;/code&gt;, misal &lt;code&gt;Route::get()&lt;/code&gt;, &lt;code&gt;Route::post()&lt;/code&gt;, &lt;code&gt;Route::patch()&lt;/code&gt;, &lt;code&gt;Route::put()&lt;/code&gt;, dan &lt;code&gt;Route::delete()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jadi antara kedua metode submit form tersebut, saya pribadi lebih sering menggunakan &lt;code&gt;$this-&amp;gt;submitForm()&lt;/code&gt; dalam menguji sebuah fitur CRUD, karena dia beriteraksi dengan halaman web dan elemen-elemen form. Supaya ketika kita mengutak-atik form di view, tetapi &lt;strong&gt;lupa&lt;/strong&gt; menyesuaikan testingnya, testing akan &lt;code class=&#34;test-red&#34;&gt;fail&lt;/code&gt; (segera ketahuan). Jadi hasilnya lebih pasti dan meyakinkan. :)&lt;/p&gt;
&lt;p&gt;Baik teman-teman, semoga artikel ini mudah dimengerti. Jika ada yang belum dipahami atau kurang jelas. Silakan disampaikan di komentar. Perubahan script di atas dapat dilihat pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/511ba2cd745ea1b5ddb64c7c3db55877b6bec47a&#34;&gt;commit repo ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih sudah berkenan membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Mempercantik Tampilan Web</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-mempercantik-tampilan-web/</link>
       <pubDate>Sun, 26 Nov 2017 06:13:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-mempercantik-tampilan-web/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim&lt;/p&gt;
&lt;p&gt;Setelah mendapatkan &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/&#34;&gt;passed test&lt;/a&gt;, kita mendapatkan tampilan plain html, karena tahap awal kita fokus ke fungsional/fitur yang berjalan sesuai keinginan. Kita lanjutkan untuk mengerjakan tampilan webnya. Pada Laravel sudah &lt;em&gt;built-in&lt;/em&gt; file css dan js &lt;a href=&#34;https://getbootstrap.com/docs/3.3&#34;&gt;Bootstrap 3&lt;/a&gt; dengan modifikasi sedikit warna. Kita akan menggunakannya untuk mempercantik tampilan aplikasi kita.&lt;/p&gt;
&lt;h3 id=&#34;edit-view-tasksindex&#34;&gt;Edit View &amp;ldquo;tasks.index&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Untuk mendapatkan template tersebut, sebenarnya kita cukup menggunakan file &lt;code&gt;public/css/app.css&lt;/code&gt; dan &lt;code&gt;public/js/app.js&lt;/code&gt; ke view &lt;code&gt;tasks.index&lt;/code&gt;. Tetapi &lt;em&gt;best practice&lt;/em&gt;-nya, kita perlu membuat sebuah file &lt;strong&gt;layout&lt;/strong&gt; sebagai &lt;strong&gt;master template&lt;/strong&gt; halaman web, kemudian view &lt;code&gt;tasks.index&lt;/code&gt; meng-&lt;em&gt;extend&lt;/em&gt; master template/layout tersebut. Nah untuk mempercepat kerja, kita gunakan &lt;em&gt;command&lt;/em&gt; &lt;code&gt;make:auth&lt;/code&gt; untuk &lt;em&gt;generate&lt;/em&gt; file-file view default autentikasi Laravel.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:auth
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Authentication scaffolding generated successfully.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Laravel membuatkan beberapa file untuk kita, termasuk view &lt;code&gt;layouts.app&lt;/code&gt; atau file &lt;code&gt;resources/views/layouts/app.blade.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kita edit view &lt;code&gt;tasks.index&lt;/code&gt; meng-extend view &lt;code&gt;layouts.app&lt;/code&gt; tersebut. Ganti seluruh konten view &lt;code&gt;tasks.index&lt;/code&gt; menjadi seperti di bawah ini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@extends(&amp;#39;layouts.app&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@section(&amp;#39;content&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;page-header text-center&amp;#34;&lt;/span&gt;&amp;gt;Tasks Management&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;row&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4 col-md-offset-2&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;Tasks&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            @foreach ($tasks as $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list-group-item&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            @endforeach
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;New Task&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Name&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-group&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;for&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;control-label&amp;#34;&lt;/span&gt;&amp;gt;Description&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;form-control&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;btn btn-primary&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@endsection
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasilnya kurang lebih seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-26-testing-laravel-mempercantik-tampilan-web-01.jpg&#34; alt=&#34;tasks.index setelah diperbaiki&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;edit-view-layoutsapp&#34;&gt;Edit View &amp;ldquo;layouts.app&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Kita lanjutkan untuk menyesuaikan &lt;strong&gt;navbar&lt;/strong&gt; dengan aplikasi kita. Edit file view &lt;code&gt;layouts.app&lt;/code&gt; atau file &lt;code&gt;resources/views/layouts/app.blade.php&lt;/code&gt;, ubah beberapa baris seperti di bawah ini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Baris ke 11, tag title--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;Tasks Management&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Baris ke 30 - 33, Navbar Brand--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;navbar-brand&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;/&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tasks Management
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Baris ke 37 - 40, Navbar link kiri --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nav navbar-nav&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34;&amp;gt;Tasks&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Baris ke 74, bagian yield content --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;@yield(&amp;#39;content&amp;#39;)&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasilnya bisa kita lihat di bagian navbar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-26-testing-laravel-mempercantik-tampilan-web-02.jpg&#34; alt=&#34;Navbar setelah layouts.app diubah&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sekarang kita jalankan PHPUnit untuk mengecek apakah yang kita kerjakan membuat &lt;em&gt;kerusakan&lt;/em&gt;?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-11-26-testing-laravel-mempercantik-tampilan-web-03.jpg&#34; alt=&#34;Testing masih passed setelah tasks.index diperbaiki&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip. Mestinya testing kita tetap &lt;code class=&#34;test-green&#34;&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/code&gt;. Jika teman-teman mendapatkan hasil testing &lt;code class=&#34;test-red&#34;&gt;&amp;ldquo;Merah&amp;rdquo;&lt;/code&gt;, silakan cek kembali view &lt;code&gt;tasks.index&lt;/code&gt; dan &lt;code&gt;layouts.app&lt;/code&gt; tadi, mungkin ada yang keliru di sana. Update kedua file ini dapat teman-teman lihat pada &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/dbf82362ae6ff105b1790643e5653108edcd1718&#34;&gt;commit repo ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Baik sampai di sini kita sudah mengubah tampilan web menjadi lebih bagus tanpa meninggalkan failing test. Selanjutnya insyaallah kita bahas tentang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-testing-validasi-form/&#34;&gt;Testing Validasi Form&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktu teman-teman. Mudah-mudahan bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Mendapatkan Passed Test</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/</link>
       <pubDate>Sat, 14 Oct 2017 13:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim&lt;/p&gt;
&lt;p&gt;Pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-test-driven-development/#konsep-penerapan-tdd&#34;&gt;artikel terdahulu&lt;/a&gt;, kita sudah membahas dan memahami konsep penerapan Test-Driven Development, 5 tahap yang kita kerjakan :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buat Kode Pengujian (&lt;em&gt;&lt;strong&gt;Add Test&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Jalankan test, hasilnya pasti &lt;em&gt;fail&lt;/em&gt; (&lt;em&gt;&lt;strong&gt;Watch Test Fail&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Tulis Kode Fitur Sistem (&lt;em&gt;&lt;strong&gt;Write Code&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Jalankan test (&lt;em&gt;&lt;strong&gt;Run Tests&lt;/strong&gt;&lt;/em&gt;) hingga testing &lt;em&gt;&lt;strong&gt;passed&lt;/strong&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Refactor&lt;/em&gt; Kode Fitur Sistem (&lt;em&gt;&lt;strong&gt;Refactor&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;empat-langkah-perulangan&#34;&gt;Empat Langkah Perulangan&lt;/h3&gt;
&lt;p&gt;Berdasarkan konsep itu, pada artikel sebelumnya kita mengerjakan &lt;strong&gt;tahap pertama&lt;/strong&gt;, yaitu &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-setup-project-baru-dengan-testing/&#34;&gt;membuat Kode Pengujian (Failing Test)&lt;/a&gt;. Kali ini kita akan mengerjakan &lt;strong&gt;tahap ke 2&lt;/strong&gt; dan &lt;strong&gt;ke 3&lt;/strong&gt;, dengan melakukan 4 langkah berikut secara berulang-ulang :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jalankan &lt;code&gt;vendor/bin/phpunit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error&lt;/strong&gt; tampil&lt;/li&gt;
&lt;li&gt;Temukan &lt;strong&gt;Penyebab&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tentukan &lt;strong&gt;Solusi&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keempat langkah ini dilakukan setiap kita menemukan error baru yang ditampilkan oleh PHPUnit. Setiap ekseksusi PHPUnit pada artikel ini kita berikan &lt;em&gt;hashtag (#)&lt;/em&gt; angka. Saya menghitung ada 19 proses yang dilakukan dari awal sampai kita mendapatkan &lt;code class=&#34;test-green&#34;&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;oke-kita-mulai&#34;&gt;Oke, kita mulai&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;A request to [http://localhost/tasks] failed. Received status code [404].&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Pada artikel sebelumnya kita sampai di sini.&lt;/em&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Belum ada &lt;em&gt;route&lt;/em&gt; untuk melayani request ke URL &lt;code&gt;/tasks&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Buat route untuk melayani request ke &lt;code&gt;/tasks&lt;/code&gt; pada file &lt;code&gt;routes/web.php&lt;/code&gt;. Tambahkan route &lt;code&gt;get&lt;/code&gt; ke url &lt;code&gt;tasks&lt;/code&gt; dengan &lt;code&gt;controller&lt;/code&gt; dan &lt;code&gt;method&lt;/code&gt; yang melayani requestnya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;welcome&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan route dan actionnya (controller dan method)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-1&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;A request to [http://localhost/tasks] failed. Received status code [500].&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Caused by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ReflectionException: Class App&lt;span style=&#34;color:#ae81ff&#34;&gt;\H&lt;/span&gt;ttp&lt;span style=&#34;color:#ae81ff&#34;&gt;\C&lt;/span&gt;ontrollers&lt;span style=&#34;color:#ae81ff&#34;&gt;\T&lt;/span&gt;asksController does not exist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;penyebab-1&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;TasksController&lt;/code&gt; belum ada.&lt;/p&gt;
&lt;h5 id=&#34;solusi-1&#34;&gt;Solusi&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:controller TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-2&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;A request to [http://localhost/tasks] failed. Received status code [500].&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Caused by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BadMethodCallException: Method &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;index&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; does not exist.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;penyebab-2&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada &lt;code&gt;TasksController&lt;/code&gt; belum ada method &lt;code&gt;index&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-2&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Tambahkan method &lt;code&gt;index&lt;/code&gt; pada &lt;code&gt;app/Http/Controllers/TasksController.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Http\Request&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TasksController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-3&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;InvalidArgumentException: Could not find a form that has submit button [Create Task].&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-3&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Ini karena pada &lt;code&gt;TasksController&lt;/code&gt; method &lt;code&gt;index&lt;/code&gt;, kita tidak return &lt;code&gt;view&lt;/code&gt;, sehingga hanya tampil halaman web kosong.&lt;/p&gt;
&lt;h5 id=&#34;solusi-3&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita &lt;code&gt;return view&lt;/code&gt; pada method &lt;code&gt;index&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Http\Request&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TasksController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks.index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-4&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;InvalidArgumentException: View [tasks.index] not found.&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-4&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;File &lt;code&gt;index.blade.php&lt;/code&gt; tidak ditemukan pada direktori &lt;code&gt;resources/views/tasks&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-4&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat file &lt;code&gt;index.blade.php&lt;/code&gt; pada direktori &lt;code&gt;resources/views/tasks&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;http-equiv&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X-UA-Compatible&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;IE=edge&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;Tasks Management&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-5&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;InvalidArgumentException: Could not find a form that has submit button [Create Task].&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-5&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada file &lt;code&gt;resources/views/tasks/index.blade.php&lt;/code&gt; atau disebut juga view &lt;code&gt;tasks.index&lt;/code&gt; tidak ditemukan Tombol Submit &lt;code&gt;Create Task&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-5&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat file &lt;code&gt;form&lt;/code&gt; dengan tombol submit &lt;code&gt;Create Task&lt;/code&gt; pada view &lt;code&gt;tasks.index&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;http-equiv&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X-UA-Compatible&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;IE=edge&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;Tasks Management&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-6&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;InvalidArgumentException: Unreachable field &amp;quot;name&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-6&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada view &lt;code&gt;tasks.index&lt;/code&gt; tidak ditemukan input text field dengan nama &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-6&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Dalam form pada view &lt;code&gt;tasks.index&lt;/code&gt; tambahkan input text dengan nama &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- /body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-7&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;InvalidArgumentException: Unreachable field &amp;quot;description&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-7&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada view &lt;code&gt;tasks.index&lt;/code&gt; tidak ditemukan input textarea field dengan nama &lt;code&gt;description&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-7&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Pada view &lt;code&gt;tasks.index&lt;/code&gt; kita buat input textarea dengan nama &lt;code&gt;description&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- /body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-8&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;A request to [http://localhost/tasks] failed. Received status code [405].&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Caused by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Symfony&lt;span style=&#34;color:#ae81ff&#34;&gt;\C&lt;/span&gt;omponent&lt;span style=&#34;color:#ae81ff&#34;&gt;\H&lt;/span&gt;ttpKernel&lt;span style=&#34;color:#ae81ff&#34;&gt;\E&lt;/span&gt;xception&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;ethodNotAllowedHttpException
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;penyebab-8&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada route sudah ada route &lt;code&gt;tasks&lt;/code&gt; yang kita buat, tetapi ini untuk method &lt;code&gt;get&lt;/code&gt;, sedangkan saat kita submit form, kita mengirimkan method &lt;code&gt;POST&lt;/code&gt; artinnya kita perlu route juga untuk melayani method &lt;code&gt;POST&lt;/code&gt; ini.&lt;/p&gt;
&lt;h5 id=&#34;solusi-8&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Pada &lt;code&gt;routes/web.php&lt;/code&gt;, buat route untuk melayani method &lt;code&gt;POST&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;welcome&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan route dan actionnya (controller dan method)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;post&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TasksController@store&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-9&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;A request to [http://localhost/tasks] failed. Received status code [500].&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Caused by
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BadMethodCallException: Method &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;store&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; does not exist.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;penyebab-9&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada &lt;code&gt;TasksController&lt;/code&gt; belum ada method &lt;code&gt;store&lt;/code&gt;.&lt;/p&gt;
&lt;h5 id=&#34;solusi-9&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita buat methodnya, buka &lt;code&gt;app/Http/Controllers/TasksController.php&lt;/code&gt;. Tambahkan method &lt;code&gt;store&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Http\Request&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TasksController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks.index&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;store&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-10&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;PDOException: SQLSTATE[HY000]: General error: 1 no such table: tasks&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-10&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Belum ada tabel &lt;code&gt;tasks&lt;/code&gt; di database.&lt;/p&gt;
&lt;h5 id=&#34;solusi-10&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Nah sekarang kita berurusan dengan database, kita buat model &lt;code&gt;Task&lt;/code&gt; dengan file &lt;code&gt;migrations&lt;/code&gt; untuk tabel &lt;code&gt;tasks&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Membuat model `Task` beserta file database migrationnya&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:model Task -m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-11&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;PDOException: SQLSTATE[HY000]: General error: 1 no such table: tasks&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-11&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Kok Errornya masih sama? Yap, PHPUnit belum tahu &lt;code&gt;file migration&lt;/code&gt; yang barusan dibuat bersama model &lt;code&gt;Task&lt;/code&gt; itu harus diapakan.&lt;/p&gt;
&lt;h5 id=&#34;solusi-11&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Solusinya kita gunakan Trait &lt;code&gt;RefreshDatabase&lt;/code&gt; pada kelas &lt;code&gt;tests\Feature\ManageTasksTest.php&lt;/code&gt; agar setiap PHPUnit jalan, dia melakukan database migration.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RefreshDatabase&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan baris ini
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_create_a_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-12&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;Unable to find row in database table [tasks] that matched attributes [{&amp;quot;name&amp;quot;:&amp;quot;My First Task&amp;quot;, ...&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-12&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Belum ada action yang dilakukan pada method &lt;code&gt;store&lt;/code&gt; untuk mengisi database dengan data yang telah diinput melalui form.&lt;/p&gt;
&lt;h5 id=&#34;solusi-12&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita kerjakan kode pembuatan record task yang diproses dari form pada method &lt;code&gt;store&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Task&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan ini
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Http\Request&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TasksController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;store&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;only&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Jangan lupa &lt;code&gt;use App\Task;&lt;/code&gt; di atas class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-13&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;Illuminate\Database\Eloquent\MassAssignmentException: name&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-13&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;MassAssignmentException&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;solusi-13&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita tambahkan protected property &lt;code&gt;$fillable&lt;/code&gt; pada model &lt;code&gt;Task&lt;/code&gt; untuk kolom &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Database\Eloquent\Model&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;protected&lt;/span&gt; $fillable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-14&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;PDOException: SQLSTATE[HY000]: General error: 1 table tasks has no column named name&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-14&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Tidak ditemukan kolom &lt;code&gt;name&lt;/code&gt; pada tabel &lt;code&gt;task&lt;/code&gt; di database.&lt;/p&gt;
&lt;h5 id=&#34;solusi-14&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Edit file &lt;code&gt;xxxxx_create_tasks_table&lt;/code&gt; kemudian tambahkan attribute &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, dan &lt;code&gt;is_done&lt;/code&gt;;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CreateTasksTable&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Migration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;up&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Schema&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;Blueprint&lt;/span&gt; $table) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $table&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;increments&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $table&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $table&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $table&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;boolean&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;is_done&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;default&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $table&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;timestamps&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-15&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Tests&lt;span style=&#34;color:#ae81ff&#34;&gt;\F&lt;/span&gt;eature&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;anageTasksTest::user_can_create_a_task
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InvalidArgumentException: The current node list is empty.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/nafies/www/lv/riset/laravel-tdd/tests/Feature/ManageTasksTest.php:35
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ERRORS!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tests: 2, Assertions: 7, Errors: 1.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;penyebab-15&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;The current node list is empty&lt;/code&gt;, artinya PHPUnit tidak menemukan apa-apa di halaman webnya, hanya berupa halaman kosong. Ini karena kita &lt;strong&gt;belum&lt;/strong&gt; memberikan &lt;strong&gt;return&lt;/strong&gt; apa-apa pada method &lt;code&gt;store&lt;/code&gt; nya.&lt;/p&gt;
&lt;h5 id=&#34;solusi-15&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita berikan kode &lt;code&gt;return back();&lt;/code&gt; pada method store, agar Laravel mengembalikan kita ke halaman sebelumnya (index tasks).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... TasksController
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;store&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;only&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;back&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 17&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-error-16&#34;&gt;Hasil: Error&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;Failed asserting that the page contains the HTML [My First Task].&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&#34;penyebab-16&#34;&gt;Penyebab&lt;/h5&gt;
&lt;p&gt;Pada halaman view &lt;code&gt;tasks.index&lt;/code&gt; kita belum menampilkan daftar Task yang ada di dalam tabel &lt;code&gt;tasks&lt;/code&gt; di database.&lt;/p&gt;
&lt;h5 id=&#34;solusi-16&#34;&gt;Solusi&lt;/h5&gt;
&lt;p&gt;Kita edit &lt;code&gt;TasksController&lt;/code&gt; agar mengambil record task dari database, kemudian kita tampilkan di view &lt;code&gt;tasks.index&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Task&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Tambahkan ini
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Http\Request&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TasksController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $tasks &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Task&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;all&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks.index&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;compact&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ... method store
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Jangan lupa &lt;code&gt;use App\Task;&lt;/code&gt; di atas class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kemudian pada view &lt;code&gt;tasks.index&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;Tasks Management&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @foreach ($tasks as $task)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;name }}{% endraw&amp;#34; &amp;gt;}} &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;br&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {% raw&amp;#34; &amp;gt;}}{{ $task-&amp;gt;description }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        @endforeach
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- /body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;hasil-passed&#34;&gt;Hasil: Passed&lt;/h5&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-13-testing-laravel-mendapatkan-passed-test-01.jpg&#34; alt=&#34;Failing Test Passed&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Yeeyyy&amp;hellip; akhirnya setelah perjalanan panjang, kita dapat &lt;code  class=&#34;test-green&#34;&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/code&gt; &lt;code&gt;:)&lt;/code&gt; Ini artinya testing kita pada &lt;code&gt;ManageTasksTest&lt;/code&gt; method &lt;code&gt;user_can_create_a_task()&lt;/code&gt; sudah berhasil.&lt;/p&gt;
&lt;h3 id=&#34;mencoba-fitur-input-task-pada-browser&#34;&gt;Mencoba Fitur Input Task pada Browser&lt;/h3&gt;
&lt;p&gt;Asumsinya, kita belum mencoba untuk membuka aplikasi ini dengan browser. Sekarang kita coba aplikasinya melalui browser, kira-kira seperti apa bentuknya?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan serve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Laravel development server started: &amp;lt;http://127.0.0.1:8000&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Buka URL di browser : &lt;code&gt;http://127.0.0.1:8000/tasks&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-13-testing-laravel-mendapatkan-passed-test-02.jpg&#34; alt=&#34;Open in Browser after Passed Test 01&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kok error, ya? Iya, karena kita belum melakukan konfigurasi database di sisi aplikasi, kita baru setting database di . Silakan teman-teman &lt;strong&gt;buat database&lt;/strong&gt; pada MySQL atau SQLite, kemudian konfigurasikan databasenya pada file &lt;code&gt;.env&lt;/code&gt;. Di PC saya konfigurasinya menggunakan SQLite :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=sqlite

BROADCAST_DRIVER=log
CACHE_DRIVER=file
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Matikan development server (artisan serve) tadi. Kemudian migrasikan database :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan migrate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Migrating: 2017_10_14_051259_create_tasks_table
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Migrated:  2017_10_14_051259_create_tasks_table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan serve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Laravel development server started: &amp;lt;http://127.0.0.1:8000&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasil di browser :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-13-testing-laravel-mendapatkan-passed-test-03.jpg&#34; alt=&#34;Open in Browser after Passed Test 02&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hehe.. masih jelek ya, tidak apa-apa sekarang silakan &lt;strong&gt;coba input data task&lt;/strong&gt; nya. Tapi ternyata belum bisa &amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-13-testing-laravel-mendapatkan-passed-test-04.jpg&#34; alt=&#34;Passed Test Before CSRF Field&#34;&gt;&lt;/p&gt;
&lt;p&gt;Masalahnya adalah hidden field &lt;strong&gt;CSRF Token&lt;/strong&gt; belum ada pada form. Sekarang kita tambahkan &lt;code&gt;{% raw&amp;quot; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;quot; &amp;gt;}}&lt;/code&gt; persis di bawah tag &lt;code&gt;form&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{% raw&amp;#34;&lt;/span&gt; &amp;gt;}}{{ url(&amp;#39;tasks&amp;#39;) }}{% endraw&amp;#34; &amp;gt;}}&amp;#34; method=&amp;#34;post&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {% raw&amp;#34; &amp;gt;}}{{ csrf_field() }}{% endraw&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;textarea&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create Task&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;form&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- /body --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jalankan lagi phpunit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 19&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-13-testing-laravel-mendapatkan-passed-test-05.jpg&#34; alt=&#34;Passed Test After CSRF Field&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Sip, no problem, kita masih dapat &lt;code  class=&#34;test-green&#34;&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/code&gt;. Kita coba input Task dan Deskripsi lagi, seharusnya sudah bisa berhasil.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-13-testing-laravel-mendapatkan-passed-test-06.jpg&#34; alt=&#34;Uji Coba Input Record Manual&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oke berhasil input task. Sampai di sini proses TDD untuk pembangunan sub-fitur &lt;strong&gt;Input Task&lt;/strong&gt; sudah selesai. Silakan teman-teman berkreasi untuk menambakan validasi form, atau mempercantik tampilan pada browser.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan&#34;&gt;Kesimpulan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Dalam penerapan TDD, &lt;strong&gt;testing memandu kita&lt;/strong&gt; membangun fitur (atau sub-fitur) dengan cara memperbaiki error yang tampil.&lt;/li&gt;
&lt;li&gt;Empat langkah berulang dalam TDD Laravel :
&lt;ol&gt;
&lt;li&gt;Jalankan &lt;code&gt;vendor/bin/phpunit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error&lt;/strong&gt; tampil&lt;/li&gt;
&lt;li&gt;Temukan &lt;strong&gt;Penyebab&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tentukan &lt;strong&gt;Solusi&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Jika &lt;strong&gt;setiap perubahan&lt;/strong&gt; yang kita lakukan di kode aplikasi &lt;strong&gt;membuat error yang berbeda&lt;/strong&gt; pada PHPUnit, berarti &lt;strong&gt;progress kita ada kemajuan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Proses TDD hanya berfokus untuk pembangunan fitur sistem, &lt;strong&gt;tidak terpengaruh&lt;/strong&gt; bagaimana tampilan yang muncul pada browser.&lt;/li&gt;
&lt;li&gt;Selama perubahan yang dilakukan tidak &amp;ldquo;merusak&amp;rdquo; fitur pada kode aplikasi, testing akan tetap menghasilkan &lt;code  class=&#34;test-green&#34;&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/code&gt;. Salah satunya telah kita buktikan saat kita menambahkan &lt;code&gt;csrf_field()&lt;/code&gt; pada form tadi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pada artikel berikutnya insyaallah kita akan &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mempercantik-tampilan-web/&#34;&gt;mempercantik tampilan view &lt;code&gt;tasks.index&lt;/code&gt;&lt;/a&gt;, agar ketika melanjutkan proses TDD pada fitur berikutnya, kita sudah memiliki tampilan yang bagus.&lt;/p&gt;
&lt;p&gt;Jika teman-teman ada yang mencoba praktek dan menemui kendala atau &lt;em&gt;&lt;strong&gt;stuck&lt;/strong&gt;&lt;/em&gt; di salah satu langkah, atau mendapatkan pesan error yang berbeda dengan proses di atas, silakan tuliskan di kolom komentar, kita bahas sama-sama.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Definisi Fitur dan First Failing Test</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-definisi-fitur-dan-first-failing-test/</link>
       <pubDate>Wed, 11 Oct 2017 08:00:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-definisi-fitur-dan-first-failing-test/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim&lt;/p&gt;
&lt;p&gt;Sebelumnya kita membahas &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-setup-project-baru-dengan-testing/&#34;&gt;setup project baru laravel dengan testing&lt;/a&gt;, sekarang kita lanjutkan membuat definisi dari fitur yang akan kita buat. Pada tutorial TDD ini, ceritanya kita akan membuat Fitur &lt;strong&gt;CRUD Task&lt;/strong&gt; atau &lt;em&gt;Create, Read, Update, and Delete Task&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pada penerapan TDD, proses yang kita lakukan saat membuat sebuah fitur kurang lebih seperti ini (mulai perencanaan hingga implementasi) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mendefinisikan fitur.&lt;/li&gt;
&lt;li&gt;Memprioritas sub-fitur.&lt;/li&gt;
&lt;li&gt;Membuat kelas &lt;strong&gt;TestCase&lt;/strong&gt; fitur.&lt;/li&gt;
&lt;li&gt;Membuat &lt;strong&gt;method test&lt;/strong&gt; untuk masing-masing sub-fitur.&lt;/li&gt;
&lt;li&gt;Mulai membuat &lt;strong&gt;failing test&lt;/strong&gt; untuk method test.&lt;/li&gt;
&lt;li&gt;Mulai kerjakan (menulis kode) fitur pada aplikasi sampai &lt;strong&gt;failing test&lt;/strong&gt; menjadi &lt;strong&gt;passed test&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ulangi langkah 4 s/d 6 hingga fitur selesai dibuat.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;1-definisi-fitur&#34;&gt;1. Definisi Fitur&lt;/h2&gt;
&lt;p&gt;Mendefinisikan sama dengan menentukan/menyusun spesifikasi dari fitur yang kita ingin buat. Kali ini kita akan membuat fitur &lt;strong&gt;CRUD Task&lt;/strong&gt; dengan spesifikasi sebagai berikut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Record pada database disimpan dalam tabel &lt;code&gt;tasks&lt;/code&gt; dengan atribut &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, dan &lt;code&gt;is_done&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Atribut &lt;code&gt;is_done&lt;/code&gt; : &lt;strong&gt;0&lt;/strong&gt; belum dikerjakan, &lt;strong&gt;1&lt;/strong&gt; sudah dikerjakan.&lt;/li&gt;
&lt;li&gt;User dapat melihat daftar Task&lt;/li&gt;
&lt;li&gt;User dapat menginput Task baru&lt;/li&gt;
&lt;li&gt;User dapat meng-edit Task&lt;/li&gt;
&lt;li&gt;User dapat menghapus Task&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-menyusun-prioritas-sub-fitur&#34;&gt;2. Menyusun Prioritas Sub-fitur&lt;/h2&gt;
&lt;p&gt;Berikutnya kita susun prioritas pengerjaan fitur/sub-fitur mana yang kita kerjakan duluan dari spesifikasi di atas, dilengkapi dengan rencana konsep pengoperasian oleh user.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Input Task&lt;br&gt;
Untuk melakukan Input Task baru, user membuka halaman Daftar Task, kemudian mengisi form &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt;, klik tombol &amp;ldquo;Create Task&amp;rdquo;. Setelah berhasil, record Task tersimpan ke database, user redirect ke halaman Daftar Task, dan melihat Task yang telah diinput tampil pada halaman webnya.&lt;/li&gt;
&lt;li&gt;Lihat Daftar Task&lt;br&gt;
Jika ada record Task di dalam database, kemudian user membuka halaman Daftar Task. Muncul nama dan deskripsi Task yang ada.&lt;/li&gt;
&lt;li&gt;Edit/Update Task&lt;br&gt;
Jika ada record Task di dalam database, kemudian user membuka halaman Daftar Task, User meng-klik tombol &amp;ldquo;Edit Task&amp;rdquo;, mengubah &lt;code&gt;name&lt;/code&gt; dan &lt;code&gt;description&lt;/code&gt; kemudian tekan tombol &amp;ldquo;Update Task&amp;rdquo;. Setelah berhasil, record tersimpan di database, user redirect ke halaman Daftar Task, dan melihat Task yang telah diupdate pada halaman webnya.&lt;/li&gt;
&lt;li&gt;Hapus Task&lt;br&gt;
Jika ada record Task di dalam database, kemudian user membuka halaman Daftar Task, User melihat tombol &amp;ldquo;Delete Task&amp;rdquo;. User meng-klik tombol &amp;ldquo;Delete Task&amp;rdquo;. Setelah berhasil, user redirect ke halaman Daftar Task, record Task tidak tampil dan hilang dari database.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Penyusunan prioritas ini penting, agar kita tahu sub-fitur mana yang mesti dikerjakan terlebih dahulu dibandingkan dengan sub-fitur yang lain. Ini melatih kita (sebagai developer) untuk efisien waktu dan manajemen project. Lama-kelamaan kita &lt;strong&gt;bisa dengan mudah meng-estimasi lama pengerjaan&lt;/strong&gt; dari sebuah fitur dengan spesifikasi tertentu.&lt;/p&gt;
&lt;h2 id=&#34;3-membuat-kelas-testcase&#34;&gt;3. Membuat Kelas TestCase&lt;/h2&gt;
&lt;p&gt;Kelas &lt;strong&gt;TestCase&lt;/strong&gt; adalah kelas testing untuk sebuah fitur, yang dibuat untuk mengelompokkan pengujian sub-sub fiturnya. Misal kita ingin membuat sebuah kelas testing untuk &lt;strong&gt;fitur Kalkulator&lt;/strong&gt;, maka kelas TestCase yang kita buat bernama &lt;strong&gt;KalkulatorTest&lt;/strong&gt;. Di dalam kelas KalkulatorTest terdapat method-method test untuk masing-masing sub-fitur dari kalkulator tersebut.&lt;/p&gt;
&lt;p&gt;Baik, kita lanjut. Pada terminal, kita &lt;code&gt;cd&lt;/code&gt; ke direktori Project Laravel, kemudian jalankan testing untuk memastikan testing yang sudah ada berjalan dengan baik :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-11-testing-laravel-definisi-fitur-dan-failing-tests-01.jpg&#34; alt=&#34;Before Add ManageTasksTest&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Hasilnya, &lt;code&gt;2 tests&lt;/code&gt; dan &lt;code&gt;2 assertions&lt;/code&gt;, sama seperti kondisi akhir &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-setup-project-baru-dengan-testing/&#34;&gt;artikel sebelumnya&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Untuk membuat &lt;strong&gt;TestCase&lt;/strong&gt; baru, kita berikan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan make:test ManageTasksTest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Laravel membuat TestCase pada direktori &lt;code&gt;tests/Feature&lt;/code&gt; bernama &lt;code&gt;ManageTasksTest.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     * A basic test example.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     * @return void
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;testExample&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita coba jalankan lagi testingnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-11-testing-laravel-definisi-fitur-dan-failing-tests-02.jpg&#34; alt=&#34;Add ManageTasksTest&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Oke, sudah ada &lt;code&gt;3 tests&lt;/code&gt; dan &lt;code&gt;3 assertions&lt;/code&gt; artinya kelas &lt;strong&gt;ManageTasksTest&lt;/strong&gt; sudah jalan. Sampai disini kita lanjutkan membuat method-method testingnya.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Akhiran (&lt;em&gt;suffix&lt;/em&gt;) &lt;strong&gt;Test&lt;/strong&gt; &lt;strong&gt;wajib&lt;/strong&gt; untuk setiap nama kelas &lt;strong&gt;TestCase&lt;/strong&gt;. Karena &lt;strong&gt;tanpa&lt;/strong&gt; suffix &lt;strong&gt;Test&lt;/strong&gt;, PHPUnit &lt;strong&gt;tidak mengenali&lt;/strong&gt; kelas tersebut sebagai kelas testing yang harus dijalankan. &lt;a href=&#34;https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html&#34;&gt;Referensi&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;4-membuat-method-test&#34;&gt;4. Membuat Method Test&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Method Test&lt;/strong&gt; atau &lt;strong&gt;Test Method&lt;/strong&gt; adalah method-method pada kelas TestCase yang akan dijalankan oleh PHPUnit. Untuk mempermudah pemahaman kita, satu &lt;strong&gt;Test Method&lt;/strong&gt; itu sama dengan pengujian untuk satu sub-fitur. Jadi kita akan membuat :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Satu Test Method untuk &lt;strong&gt;Input Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Satu Test Method untuk &lt;strong&gt;Lihat Daftar Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Satu Test Method untuk &lt;strong&gt;Edit Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Satu Test Method untuk &lt;strong&gt;Hapus Task&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Baik kita edit file kelas &lt;code&gt;tests/Feature/ManageTasksTest.php&lt;/code&gt; dan kita update seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\TestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\RefreshDatabase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ManageTasksTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_create_a_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_browser_tasks_index_page&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_edit_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_delete_an_existing_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ingat, satu test method mewakili satu sub-fitur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user_can_create_a_task&lt;/code&gt; untuk &lt;strong&gt;Input Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_can_browser_tasks_index_page&lt;/code&gt; untuk &lt;strong&gt;Lihat Daftar Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_can_edit_an_existing_task&lt;/code&gt; untuk &lt;strong&gt;Edit Task&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_can_delete_an_existing_task&lt;/code&gt; untuk &lt;strong&gt;Hapus Task&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sekarang kita jalankan lagi PHPUnit-nya, seharusnya kita mendapat hasil seperti berikut :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-11-testing-laravel-definisi-fitur-dan-failing-tests-03.jpg&#34; alt=&#34;After add test methods&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hijau&amp;rdquo; ya? Baik, sampai di sini kita punya 4 sub-fitur dengan Test Method masing-masing untuk fitur CRUD Task.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Syarat sebuah test method&lt;/strong&gt;  : harus berupa &lt;code&gt;public&lt;/code&gt; method dan nama method harus diawali dengan &lt;code&gt;test&lt;/code&gt; atau diberikan anotasi &lt;code&gt;@test&lt;/code&gt; pada docblock method. &lt;a href=&#34;https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html&#34;&gt;Referensi&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;5-membuat-failing-test&#34;&gt;5. Membuat &amp;ldquo;Failing Test&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Sekarang kita fokus ke method &lt;strong&gt;user_can_create_a_task()&lt;/strong&gt; untuk membuat &lt;strong&gt;failing test&lt;/strong&gt;, yaitu &lt;em&gt;script testing&lt;/em&gt; yang kita buat ini untuk &lt;strong&gt;menguji fitur yang belum ada&lt;/strong&gt; di sistem, jadi pasti gagal (&lt;em&gt;fail&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Oke, untuk mempermudah membuat &lt;em&gt;script testing&lt;/em&gt;, kita buat beberapa perumpamaan langkah/proses yang dilakukan oleh user ketika menggunakan sub-fitur tersebut dengan &lt;em&gt;PHP comment line&lt;/em&gt;. Seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Kelas ManageTasksTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_create_a_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User buka halaman Daftar Task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Isi form `name` dan `description` kemudian submit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat Record tersimpan ke database
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Redirect ke halaman Daftar Task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Tampil hasil task yang telah diinput
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Metode ini saya pelajari dari &lt;a href=&#34;https://www.youtube.com/watch?v=mMkNybbAMGw&#34;&gt;video youtube Laravel Daily&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Setelah membuat comment seperti di atas, kita coba buat &lt;em&gt;testing script&lt;/em&gt;-nya untuk masing-masing langkah ini.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Kelas ManageTasksTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_create_a_task&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// User memngunjungi halaman Daftar Task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Isi form `name` dan `description` kemudian submit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;submitForm&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Create Task&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;My First Task&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;This is my first task on my new job.&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Lihat Record tersimpan ke database
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seeInDatabase&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tasks&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;My First Task&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;This is my first task on my new job.&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;is_done&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Redirect ke halaman Daftar Task
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/tasks&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Tampil hasil task yang telah diinput
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;see&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;My First Task&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;see&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;This is my first task on my new job.&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kita bisa lihat, setiap langkah/proses yang seharusnya dilakukan oleh user (manusia) kita gantikan dengan &lt;em&gt;testing script&lt;/em&gt; yang sesuai :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$this-&amp;gt;visit(&#39;/tasks&#39;);&lt;/code&gt; untuk mengunjungi halaman dengan URL tertentu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$this-&amp;gt;submitForm(&#39;Create Task&#39;, ...&lt;/code&gt; untuk mengisi form dan klik tombol &amp;ldquo;Create Task&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$this-&amp;gt;seePageIs(&#39;/tasks&#39;);&lt;/code&gt; melihat URL yang kita dapatkan setelah action sebelumnya.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$this-&amp;gt;seeInDatabase(&#39;tasks&#39;, ...&lt;/code&gt; melihat isi tabel &lt;code&gt;tasks&lt;/code&gt; pada database.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$this-&amp;gt;see(&#39;.....&#39;);&lt;/code&gt; melihat isi tulisan yang tampil di halaman web.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Oke, jika kita jalankan kembali PHPUnitnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasilnya?
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-11-testing-laravel-definisi-fitur-dan-failing-tests-04.jpg&#34; alt=&#34;First Failing Test 01&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-11-testing-laravel-definisi-fitur-dan-failing-tests-05.jpg&#34; alt=&#34;First Failing Test 02&#34;&gt;{:style=&amp;ldquo;width:100%&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;Yap kita dapat &lt;code class=&#34;test-red&#34;&gt;&amp;ldquo;Merah&amp;rdquo;&lt;/code&gt;, &amp;ldquo;failing test&amp;rdquo; pertama berhasil dibuat :)&lt;/p&gt;
&lt;p&gt;Pada error ini, yang kita perhatikan adalah &lt;strong&gt;tulisan-tulisan pada posisi saya garis bawahi&lt;/strong&gt; pada gambar di atas :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tulisan di bawah Kelas dan method test&lt;/li&gt;
&lt;li&gt;Status Code yang didapatkan&lt;/li&gt;
&lt;li&gt;Baris keberapa pada Kelas Test kita mendapatkan error ini&lt;/li&gt;
&lt;li&gt;Disebabkan oleh apa error ini terjadi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dengan memperhatikan 4 hal di atas, kita bisa tahu, apa yang menyebabkan error ini terjadi, sehingga kita dapat memperbaiki kode di aplikasi yang kita buat. Untuk error yang pertama ini, kita mendapatkan &lt;code&gt;NotFoundHttpException&lt;/code&gt;, artinya route untuk URL &lt;code&gt;/tasks&lt;/code&gt; itu tidak ditemukan.&lt;/p&gt;
&lt;p&gt;Untuk membuktikannya, sekarang coba kita buka halaman webnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan serve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Laravel development server started: &amp;lt;http://127.0.0.1:8000&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kita coba buka URL di browser : &lt;code&gt;http://127.0.0.1:8000/tasks&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-11-testing-laravel-definisi-fitur-dan-failing-tests-06.jpg&#34; alt=&#34;Open in Browser&#34;&gt;&lt;/p&gt;
&lt;p&gt;Setiap error yang tampil pada terminal saat kita menjalankan test, umumnya sama dengan tampilan error yang muncul di layar web. Pesan di atas sama dengan &lt;code&gt;NotFoundHttpException&lt;/code&gt; dan &lt;em&gt;&lt;strong&gt;status code = 404&lt;/strong&gt;&lt;/em&gt;, hanya saja dihandle oleh Laravel dengan menampilkan halaman &lt;em&gt;&lt;strong&gt;error 404&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Baik, sampai di sini cukup dulu. Insyaallah pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-mendapatkan-passed-test/&#34;&gt;artikel berikutnya&lt;/a&gt;, kita akan menulis kode aplikasi untuk sub-fitur input Task, sampai testing method &lt;strong&gt;user_can_create_a_task()&lt;/strong&gt; mendapatkan hasil &lt;code class=&#34;test-green&#34;&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jika ada yang kurang jelas dengan penjelasan dan tutorial pada artikel ini, atau ada hal yang keliru, mohon disampaikan pada komentar.&lt;/p&gt;
&lt;p&gt;Terima kasih untuk waktu teman-teman berkenan membaca.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source untuk kelas &lt;code&gt;ManageTasksTest&lt;/code&gt; dapat dilihat &lt;a href=&#34;https://github.com/nafiesl/Laravel-TDD/commit/d4b6c8d9fc2529e1cc3541016199fde0dcc6b7aa&#34;&gt;commit github ini&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Setup Project Baru dengan Testing</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-setup-project-baru-dengan-testing/</link>
       <pubDate>Fri, 06 Oct 2017 14:05:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-setup-project-baru-dengan-testing/</guid>
       <description>&lt;p&gt;Bismillahirrahmanirrahim&lt;/p&gt;
&lt;p&gt;Alhamdulillah akhirnya bisa mulai menulis lagi. Sekitar dua bulan sebelumnya (terakhir) kita membahas Testing Laravel, tentang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-test-driven-development/&#34;&gt;Test-Driven Development (TDD)&lt;/a&gt;, yaitu menulis &lt;em&gt;script testing&lt;/em&gt; terlebih dahulu sebelum menulis kode untuk aplikasinya. Sekarang kita lanjutkan untuk melakukan setup/konfigurasi awal project Laravel untuk memulai alur kerja TDD.&lt;/p&gt;
&lt;p&gt;Awalnya saya memang menunda untuk menulis artikel ini karena menunggu &lt;a href=&#34;https://laravel-news.com/laravel-5-5&#34;&gt;rilis Laravel 5.5&lt;/a&gt;. Niatnya biar sekalian belajar Laravel 5.5. Setelah rilis, ternyata banyak kegiatan yang membuat penulisan artikel ini semakin tertunda. Tapi sekali lagi, alhamdulillah akhirnya bisa mulai menulis lagi.&lt;/p&gt;
&lt;h2 id=&#34;setup-local-development&#34;&gt;Setup Local Development&lt;/h2&gt;
&lt;p&gt;Sebelum memulai, saya ingin menginformasikan &lt;em&gt;development environment&lt;/em&gt; yang saya gunakan saat menulis artikel ini :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sistem Operasi: Ubuntu 16.04.3 LTS&lt;/li&gt;
&lt;li&gt;Web server : Apache/2.4.18&lt;/li&gt;
&lt;li&gt;Versi PHP : 7.0.22&lt;/li&gt;
&lt;li&gt;Terminal : GNOME Terminal&lt;/li&gt;
&lt;li&gt;Database : MariaDB 10.0.31 (Local) &amp;amp; SQLite3 (Testing)&lt;/li&gt;
&lt;li&gt;Versi Laravel : 5.5.14&lt;/li&gt;
&lt;li&gt;Direktori Project : &lt;code&gt;~/www/lv/riset/laravel-tdd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Baik, pada artikel kali ini asumsinya kita sudah &lt;a href=&#34;https://blog.inweeks.com/laravel/cara-install-laravel/&#34;&gt;menginstall sebuah project Laravel yang baru&lt;/a&gt; (fresh install). Kita mulai dengan membuka terminal dan &lt;code&gt;cd&lt;/code&gt; ke direktori project Laravel tersebut.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd ~/www/lv/riset/laravel-tdd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pastikan project Laravel terinstall dengan benar jika kita berhasil melihat versinya.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan -V
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Laravel Framework 5.5.14
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Karena setiap installasi Laravel sudah termasuk dengan paket software testing &lt;strong&gt;PHPUnit&lt;/strong&gt; (sebagai dependensinya), maka kita dapat mencobanya dengan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mestinya kita akan mendapatkan tampilan seperti ini :
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-06-testing-laravel-setup-project-baru-dengan-testing-01.jpg&#34; alt=&#34;First Project Testing&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip, kalau sudah dapat warna &lt;strong&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/strong&gt;, artinya Laravel terinstall dengan benar dan PHPUnit berjalan dengan baik.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perhatikan: jika teman-teman belum menghasilkan tampilan yang sama, kemungkinan Laravel belum terintsall dengan benar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Baik, sampai di sini sebenarnya kita sudah bisa mulai &lt;em&gt;ngoding&lt;/em&gt; testingnya, tetapi untuk menyesuaikan dengan &lt;em&gt;testing setup&lt;/em&gt; yang biasa saya lakukan (setiap memulai project Laravel), perlu dilakukan beberapa pengaturan/konfigurasi lagi.&lt;/p&gt;
&lt;h3 id=&#34;install-paket-laravel-browser-kit-testing&#34;&gt;Install paket Laravel Browser Kit Testing&lt;/h3&gt;
&lt;p&gt;Pertama kita akan install sebuah paket tambahan, yaitu &lt;strong&gt;Laravel Browser Kit Testing&lt;/strong&gt;. Dengan paket ini, kita dapat menulis &lt;em&gt;script testing&lt;/em&gt; agar PHPUnit dapat interaksi dengan browser. Misal : untuk mengisi form, menekan tombol/submit form, mengecek keberadaan element html, mengunjungi halaman dengan klik link, dan beberapa fitur testing lainnya untuk mempermudah alur kerja TDD kita.&lt;/p&gt;
&lt;p&gt;Silakan menginstall dengan cara :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ composer require laravel/browser-kit-testing dev-master --dev
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;Sebenarnya paket &lt;strong&gt;Browser Kit Testing&lt;/strong&gt; ini berisi fitur-fitur testing yang ada pada Laravel 5.2 dan 5.3, tetapi pada versi 5.4 dan seterusnya, fitur ini dihilangkan, diganti dengan Laravel Dusk untuk interaksi dengan browser (afaik).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oke setelah selesai, kita lanjutkan dengan meng-edit file &lt;code&gt;tests/TestCase.php&lt;/code&gt; untuk mendapatkan fitur dari paket &lt;code&gt;laravel/browser-kit-testing&lt;/code&gt; yang barusan kita install tadi.&lt;/p&gt;
&lt;h3 id=&#34;mengubah-file-basetestphp&#34;&gt;Mengubah file BaseTest.php&lt;/h3&gt;
&lt;p&gt;File &lt;code&gt;tests/TestCase.php&lt;/code&gt; adalah kelas &lt;em&gt;Base Test&lt;/em&gt; yaitu kelas &lt;em&gt;abstract&lt;/em&gt; yang di-&lt;em&gt;extends&lt;/em&gt; oleh seluruh kelas-kelas testing yang akan kita buat di project Laravel (ibarat sebagai induknya testing kita). Nah, kelas/file ini harus kita ubah/sesuaikan agar kita dapat menggunakan fitur-fitur dari paket &lt;strong&gt;Browser Kit Testing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Buka file &lt;code&gt;tests/TestCase.php&lt;/code&gt; dengan text editor, akan kita dapatkan seperti berikut :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// tests/TestCase.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\TestCase&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseTestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseTestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CreatesApplication&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sekarang kita ubah isinya menjadi seperti di bawah:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// tests/TestCase.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Laravel\BrowserKitTesting\TestCase&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseTestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TestCase&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BaseTestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CreatesApplication&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; $baseUrl &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;http://localhost&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perhatikan kita mengubah 1 baris &lt;code&gt;Laravel\BrowserKitTesting\TestCase&lt;/code&gt;, dan menambahkan baris &lt;code&gt;public $baseUrl = &#39;http://localhost&#39;;&lt;/code&gt;. Simpan, kemudian kembali ke terminal dan jalankan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-06-testing-laravel-setup-project-baru-dengan-testing-02.jpg&#34; alt=&#34;Testing Error Browser Kit Testing&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ups, dapat &lt;strong&gt;&amp;ldquo;Merah&amp;rdquo;&lt;/strong&gt; ya? Artinya ada yang mesti kita perbaiki dulu setelah perubahan yang kita lakukan tadi.&lt;/p&gt;
&lt;p&gt;Oke kita buka file yang &lt;em&gt;error&lt;/em&gt;, yaitu &lt;code&gt;tests/Feature/ExampleTest.php&lt;/code&gt;, lihat pada baris ke 20 : &lt;code&gt;$response-&amp;gt;assertStatus(200)&lt;/code&gt;. &lt;em&gt;Script&lt;/em&gt; ini adalah method &lt;em&gt;assertion&lt;/em&gt; bawaan Laravel sejak versi 5.4 (&lt;code&gt;Illuminate\Foundation\Testing\TestCase&lt;/code&gt;), sedangkan kita sudah menentukan pada file &lt;code&gt;tests/TestCase.php&lt;/code&gt; bahwa kita menggunakan paket Browser Kit Testing sebagai &lt;em&gt;Base Test&lt;/em&gt; atau induk kelas-kelas testingnya. Maka &lt;em&gt;script&lt;/em&gt; yang &lt;em&gt;error&lt;/em&gt; itu harus diperbaik/diganti :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// tests/Feature/ExampleTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;testBasicTest&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// $response = $this-&amp;gt;get(&amp;#39;/&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// $response-&amp;gt;assertStatus(200); // Tidak ada pada paket Browser Kit Test
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Kedua baris kode di atas digantikan dengan yang ini
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kode &lt;code&gt;$this-&amp;gt;visit(&#39;/&#39;);&lt;/code&gt; adalah salah satu method testing dari &lt;strong&gt;Browser Kit Testing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Setelah itu kita jalankan kembali &lt;code&gt;vendor/bin/phpunit&lt;/code&gt;, seharusnya kita akan mendapatkan hasil warna &lt;strong&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/strong&gt; seperti sebelumnya, artinya sudah tidak ada masalah lagi dengan perubahan file &lt;code&gt;tests/TestCase.php&lt;/code&gt; tadi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-06-testing-laravel-setup-project-baru-dengan-testing-03.jpg&#34; alt=&#34;Testing Success Browser Kit Testing&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oke, karena sudah tidak ada masalah, kita rapikan file test &lt;code&gt;tests/Feature/ExampleTest.php&lt;/code&gt;, seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// tests/Feature/ExampleTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;testBasicTest&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sip, setup untuk konfigurasi paket &lt;strong&gt;BrowserKitTesting&lt;/strong&gt; selesai.&lt;/p&gt;
&lt;h3 id=&#34;mengubah-file-phpunitxml&#34;&gt;Mengubah file phpunit.xml&lt;/h3&gt;
&lt;p&gt;Sekarang kita lanjutkan untuk konfigurasi database yang digunakan untuk testing. Kita akan (dan harus) membuat database yang terpisah antara database &lt;em&gt;local development&lt;/em&gt; (yang kita gunakan untuk uji coba manual) dengan database untuk &lt;em&gt;Automated Testing&lt;/em&gt;. Mengapa? Agar database yang digunakan oleh &lt;em&gt;Automated Testing&lt;/em&gt; tidak &amp;ldquo;mengganggu&amp;rdquo; database yang kita gunakan saat uji coba manual. Mengganggu? Oke, nanti temen-temen bisa lihat kenapa database ini mesti kita pisahkan, kita lanjutkan dulu.&lt;/p&gt;
&lt;p&gt;Seperti yang saya informasikan di awal artikel ini, database untuk &lt;em&gt;local development&lt;/em&gt; (pengujian manual) kita menggunakan MariaDB atau MySQL, sedangkan untuk Testing kita gunakan SQLite. Kenapa SQLite? Samakah SQLite dengan MySQL? Beda, tapi mirip. Karena yang akan kita buat adalah fitur CRUD biasa, SQLite sangat cukup dan sepadan dengan MySQL untuk tujuan ini. SQLite juga dapat diatur menggunakan &lt;em&gt;in-memory database&lt;/em&gt;, ini menjadikan proses testing lebih cepat.&lt;/p&gt;
&lt;p&gt;Untuk dapat menggunakan SQLite pada testing, kita mengkonfigurasinya dengan cara mengubah file &lt;code&gt;phpunit.xml&lt;/code&gt;. Atur agar &lt;em&gt;environment variable&lt;/em&gt; database testing menggunakan &lt;em&gt;in-memory&lt;/em&gt; database &lt;strong&gt;SQLite&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Kita buka file &lt;code&gt;phpunit.xml&lt;/code&gt;. Tambahkan dua baris kode berikut pada bagian &lt;code&gt;env&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;phpunit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- ..... --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;php&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;env&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;APP_ENV&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;env&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CACHE_DRIVER&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;array&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;env&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SESSION_DRIVER&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;array&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;env&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;QUEUE_DRIVER&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Tambahkan dua baris di bawah ini untuk pengaturan database --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;env&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DB_CONNECTION&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sqlite&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;env&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DB_DATABASE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:memory:&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/php&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/phpunit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Untuk dapat menggunakan SQLite, kita pastikan pada PC kita sudah terinstall &lt;code&gt;sqlite3&lt;/code&gt; dan extension &lt;code&gt;php7.0-sqlite3&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oke sekarang kita jalankan lagi php unit untuk mengecek apakah perubahan pada file ini berdampak masalah/error.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-10-06-testing-laravel-setup-project-baru-dengan-testing-04.jpg&#34; alt=&#34;Testing Success After phpunit/.xml&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sip, selama &lt;em&gt;testing&lt;/em&gt; dapat &lt;strong&gt;&amp;ldquo;Hijau&amp;rdquo;&lt;/strong&gt;, artinya tidak ada masalah. Sampai di sini proses konfigurasi awal testing di Project Laravel kita selesai. Pada artikel selanjutnya insyaallah kita akan membuat script testing pertama kita. Tahapannya, mendefinisikan fitur yang akan dibuat kemudian menterjemahkan fitur-fitur tersebut menjadi method-method testing.&lt;/p&gt;
&lt;p&gt;Jika ada pertanyaan tentang artikel ini, silakan teman-teman tulis di komentar. Terima kasih atas waktunya sudah berkenan membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Install Aplikasi Laravel dari Github ke XAMPP Windows</title>
       <link>https://blog.inweeks.com/laravel/cara-install-aplikasi-laravel-dari-github-ke-xampp-windows/</link>
       <pubDate>Sat, 19 Aug 2017 13:30:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/cara-install-aplikasi-laravel-dari-github-ke-xampp-windows/</guid>
       <description>&lt;p&gt;Kita sebagai pengguna &lt;strong&gt;XAMPP di Windows&lt;/strong&gt; kadang agak kesulitan menginstall &lt;em&gt;source code &lt;strong&gt;Laravel&lt;/strong&gt;&lt;/em&gt; agar dapat digunakan dengan &lt;strong&gt;XAMPP&lt;/strong&gt;, utamanya bagi yang belum pernah kenal dengan Laravel. Biasanya si pembuat aplikasi mengasumsikan orang-orang yang akan menggunakan &lt;em&gt;source code&lt;/em&gt; tersebut sudah familiar dengan &lt;em&gt;framework&lt;/em&gt; yang digunakan.&lt;/p&gt;
&lt;p&gt;Misalkan kita ingin menginstall &lt;em&gt;source code&lt;/em&gt; dari repo Github &lt;a href=&#34;https://github.com/nafiesl/silsilah&#34;&gt;Silsilah&lt;/a&gt; agar dapat kita gunakan dan eksplorasi.&lt;/p&gt;
&lt;h2 id=&#34;asumsi&#34;&gt;Asumsi&lt;/h2&gt;
&lt;p&gt;Pada panduan di bawah, saya mengasumsikan bahwa pembaca sudah terbiasa dengan PHP menggunakan XAMPP di Windows, tetapi belum &lt;a href=&#34;https://blog.inweeks.com/composer/berkenalan-dengan-composer/&#34;&gt;berkenalan dengan &lt;strong&gt;Composer&lt;/strong&gt;&lt;/a&gt; dan &lt;strong&gt;Laravel&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;yang-harus-disiapkan&#34;&gt;Yang harus Disiapkan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Memiliki &lt;strong&gt;CLI/Command Line Interface&lt;/strong&gt; berupa Command Prompt (CMD) atau Power Shell atau &lt;a href=&#34;https://git-scm.com/downloads&#34;&gt;Git Bash&lt;/a&gt; (selanjutnya kita sebut terminal).&lt;/li&gt;
&lt;li&gt;Memiliki Web Server (misal XAMPP) dengan &lt;strong&gt;PHP minimal versi 5.6&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://getcomposer.org/doc/00-intro.md#installation-windows&#34;&gt;Composer telah ter-install&lt;/a&gt;, cek dengan perintah &lt;code&gt;composer -V&lt;/code&gt; melalui terminal.&lt;/li&gt;
&lt;li&gt;Dapat menggunakan perintah &lt;code&gt;php -v&lt;/code&gt; dengan terminal (menampilkan versi php). Caranya bisa ikuti langkah pada artikel ini &lt;a href=&#34;https://www.petanikode.com/php-cmd&#34;&gt;Cara Menjalankan PHP Melalui CMD&lt;/a&gt; sampai langkah 6.&lt;/li&gt;
&lt;li&gt;Memiliki koneksi internet (untuk proses installasi).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;langkah-pengerjaan&#34;&gt;Langkah pengerjaan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Download Source Code dari repo Github &lt;a href=&#34;https://github.com/nafiesl/silsilah&#34;&gt;Silsilah&lt;/a&gt; dalam bentuk Zip.&lt;/li&gt;
&lt;li&gt;Extract file zip (source code) ke dalam direktori &lt;code&gt;htdocs&lt;/code&gt; pada &lt;strong&gt;XAMPP&lt;/strong&gt;, misal &lt;code&gt;htdocs/silsilahku&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Melalui terminal, cd ke direktori &lt;code&gt;silsilahku&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;(Sesuai &lt;a href=&#34;https://github.com/nafiesl/silsilah#cara-install&#34;&gt;petunjuk installasi&lt;/a&gt;) Pada terminal, berikan perintah &lt;code&gt;composer install&lt;/code&gt;. Ini yang perlu koneksi internet.&lt;/li&gt;
&lt;li&gt;Composer akan menginstall dependency paket dari source code tersebut hingga selesai.&lt;/li&gt;
&lt;li&gt;Jalankan perintah &lt;code&gt;php artisan&lt;/code&gt;, untuk menguji apakah &lt;strong&gt;perintah artisan Laravel&lt;/strong&gt; bekerja.&lt;/li&gt;
&lt;li&gt;Buat &lt;strong&gt;database baru&lt;/strong&gt; (kosong) pada mysql (via phpmyadmin).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplikat&lt;/strong&gt; file &lt;code&gt;.env.example&lt;/code&gt;, lalu &lt;strong&gt;rename&lt;/strong&gt; menjadi &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Kembali ke terminal, &lt;code&gt;php artisan key:generate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Setting koneksi database di file &lt;code&gt;.env&lt;/code&gt; (&lt;em&gt;DB_DATABASE, DB_USERNAME, DB_PASSWORD&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Jalan kan perintah &lt;code&gt;php artisan migrate&lt;/code&gt; Jika di cek di phpmyadmin, seharusnya tabel sudah muncul.&lt;/li&gt;
&lt;li&gt;Setelah selesai, buka aplikasi melalui browser, misal : &lt;code&gt;http://localhost/silsilahku/public&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Klik link &lt;strong&gt;Register&lt;/strong&gt; untuk mendaftarkan user baru.&lt;/li&gt;
&lt;li&gt;Login dan aplikasi siap digunakan.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Seperti itu lebih kurangnya &lt;strong&gt;cara menginstall aplikasi Laravel dari github ke XAMPP di Windows&lt;/strong&gt;. Mudah-mudahan membantu teman-teman yang belum familiar dengan cara menggunakan &lt;em&gt;source code&lt;/em&gt; di Github, Composer dan Laravel.&lt;/p&gt;
&lt;p&gt;Terima kasih sudah berkenan membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Tentang TDD (Test-Driven Development)</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-tentang-test-driven-development/</link>
       <pubDate>Wed, 02 Aug 2017 14:18:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-tentang-test-driven-development/</guid>
       <description>&lt;p&gt;Sebagaimana sempat disinggung pada
&lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-latar-belakang/&#34;&gt;artikel sebelumnya&lt;/a&gt;
, bahwa dengan menerapkan &lt;em&gt;Automated Testing&lt;/em&gt; pada sistem/aplikasi yang kita buat, kita jadi &lt;strong&gt;kerja dua kali&lt;/strong&gt;, yaitu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menulis kode untuk &lt;strong&gt;membangun aplikasi&lt;/strong&gt; dan&lt;/li&gt;
&lt;li&gt;Menulis kode untuk &lt;strong&gt;membuat kode pengujian&lt;/strong&gt; setiap fitur yang ada pada sistem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jika &lt;em&gt;testing script&lt;/em&gt; dibuat &lt;strong&gt;setelah sistem selesai&lt;/strong&gt;, tentunya lumayan menyita waktu. Padahal biasanya &lt;em&gt;User&lt;/em&gt; menginginkan sistem segera &lt;em&gt;lauhcing&lt;/em&gt; dan mulai digunakan. Ditambah lagi &lt;em&gt;developer&lt;/em&gt; biasanya sudah &lt;em&gt;males ngutak-ngutik&lt;/em&gt; sistem yang sudah jadi (apalagi fiturnya banyak). Akhirnya batal bikin &lt;em&gt;testing&lt;/em&gt;. :)&lt;/p&gt;
&lt;p&gt;Metode paling efektif untuk menerapkan &lt;em&gt;Testing Automation&lt;/em&gt; adalah Test-Driven Development (TDD). Menerjemahkan secara bebas pengertian dari &lt;a href=&#34;https://en.wikipedia.org/wiki/Test-driven_development&#34;&gt;Wikipedia&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Test-Driven Development&lt;/strong&gt; adalah suatu metode pembangunan aplikasi dengan &lt;strong&gt;terlebih dahulu&lt;/strong&gt; menulis &amp;ldquo;kode pengujian&amp;rdquo; sebelum menulis kode aplikasinya, sehingga &lt;strong&gt;testing memandu&lt;/strong&gt; developer dalam proses development aplikasi tersebut.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Konsepnya seperti ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-08-02-testing-laravel-tentang-test-driven-development-01.jpg&#34; alt=&#34;TDD Cycle&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;strong&gt;Sumber gambar&lt;/strong&gt; :
&lt;a href=&#34;http://gamesfromwithin.com/category/test-driven-development&#34;&gt;Test-Driven Development&lt;/a&gt;&lt;/em&gt;
&lt;/small&gt;&lt;/p&gt;
&lt;h3 id=&#34;konsep-penerapan-tdd&#34;&gt;Konsep Penerapan TDD&lt;/h3&gt;
&lt;p&gt;Misalkan kita ingin membuat sebuah fitur dengan &lt;strong&gt;TDD&lt;/strong&gt;, metodenya seperti ini :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buat Kode Pengujian (&lt;em&gt;&lt;strong&gt;Add Test&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Jalankan test, hasilnya pasti &lt;em&gt;fail&lt;/em&gt; (&lt;em&gt;&lt;strong&gt;Watch Test Fail&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Tulis Kode Fitur Sistem (&lt;em&gt;&lt;strong&gt;Write Code&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Jalankan test (&lt;em&gt;&lt;strong&gt;Run Tests&lt;/strong&gt;&lt;/em&gt;) hingga testing &lt;em&gt;passed&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Refactor&lt;/em&gt; Kode Fitur Sistem (&lt;em&gt;&lt;strong&gt;Refactor&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Penerapan dari metode di atas, langkah aktual yang dikerjakan kurang lebih begini :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Buat Kode Pengujian&lt;/strong&gt; artinya kita membuat &lt;em&gt;testing script&lt;/em&gt; (pada &lt;em&gt;software testing&lt;/em&gt;) sesuai spesifikasi fitur yang diinginkan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jalankan Test&lt;/strong&gt; artinya kita menjalankan &lt;em&gt;software testing&lt;/em&gt; untuk melihat &lt;em&gt;testing &lt;strong&gt;fail&lt;/strong&gt;&lt;/em&gt; (gagal) dengan pesan &lt;em&gt;error&lt;/em&gt;-nya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tulis Kode Fitur Sistem&lt;/strong&gt; artinya kita mulai &lt;em&gt;ngoding&lt;/em&gt; atau menulis &lt;em&gt;script&lt;/em&gt; di aplikasi/sistem yang ingin dibuat. &lt;em&gt;Script&lt;/em&gt; yang ditulis ini adalah &lt;em&gt;script&lt;/em&gt; untuk &lt;strong&gt;memperbaiki &lt;em&gt;error&lt;/em&gt;&lt;/strong&gt; yang ditunjukkan oleh &lt;em&gt;software testing&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jalankan Test&lt;/strong&gt; lagi, ketemu &lt;strong&gt;pesan &lt;em&gt;error&lt;/em&gt; yang berbeda&lt;/strong&gt; (masih &lt;em&gt;&lt;strong&gt;fail&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Tulis &lt;em&gt;script&lt;/em&gt; lagi untuk &amp;ldquo;memperbaiki&amp;rdquo; &lt;em&gt;error&lt;/em&gt;-nya.&lt;/li&gt;
&lt;li&gt;Jalankan Test lagi hingga mendapatkan pesan &lt;em&gt;error&lt;/em&gt; yang berbeda lagi (masih &lt;em&gt;&lt;strong&gt;fail&lt;/strong&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Ulangi terus langkah &lt;strong&gt;&amp;ldquo;Tulis Kode&amp;rdquo;&lt;/strong&gt;, &lt;strong&gt;&amp;ldquo;Jalankan Test&amp;rdquo;&lt;/strong&gt;, &lt;strong&gt;&amp;ldquo;Tulis Kode&amp;rdquo;&lt;/strong&gt;, &lt;strong&gt;&amp;ldquo;Jalankan Test&amp;rdquo;&lt;/strong&gt; hingga mendapatkan &lt;em&gt;testing&lt;/em&gt; &lt;em&gt;&lt;strong&gt;passed&lt;/strong&gt;&lt;/em&gt; (lulus).&lt;/li&gt;
&lt;li&gt;Ketika &lt;em&gt;testing&lt;/em&gt; sudah &lt;em&gt;&lt;strong&gt;passed&lt;/strong&gt;&lt;/em&gt;, kita bebas &lt;em&gt;refactor&lt;/em&gt; (mengutak-utik) kode/&lt;em&gt;script&lt;/em&gt; pada aplikasi. Selama hasil &lt;em&gt;testing&lt;/em&gt;-nya tetap &lt;em&gt;passed&lt;/em&gt; artinya fitur tersebut tetap bekerja sebagaimana mestinya (sesuai spesifikasi).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Selesai sampai di situ untuk penerapan &lt;strong&gt;TDD&lt;/strong&gt; dalam pembangunan satu fitur. Bagaimana untuk fitur berikutnya? Ya, sama seperti langkah di atas, kita buat &lt;em&gt;testing&lt;/em&gt;, jalankan &lt;em&gt;testing&lt;/em&gt;, perbaiki &lt;em&gt;error&lt;/em&gt; pada &lt;em&gt;testing&lt;/em&gt;, jalankan &lt;em&gt;testing&lt;/em&gt; lagi, perbaiki lagi, dan seterusnya&amp;hellip;&lt;/p&gt;
&lt;p&gt;Jadi dalam &lt;strong&gt;TDD&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;testing&lt;/em&gt; &amp;ldquo;memandu&amp;rdquo; kita&lt;/strong&gt; dalam membangun fitur yang kita inginkan. Jika seluruh spesifikasi fitur itu sudah dituangkan dalam &lt;em&gt;script testing&lt;/em&gt;, maka kita akan &amp;ldquo;dipaksa&amp;rdquo; untuk &lt;em&gt;ngoding&lt;/em&gt; sampai target (spesifikasi) kita terpenuhi, yang ditandai dengan &lt;em&gt;testing&lt;/em&gt;-nya &lt;em&gt;passed&lt;/em&gt; atau lulus.&lt;/p&gt;
&lt;p&gt;Merasa repot dengan metode ini? Ya, saat awal mencoba memang agak repot, karena kita belum terbiasa. Saya sendiri awalnya merasa &lt;em&gt;testing&lt;/em&gt; ini menghabiskan banyak waktu, tapi karena &amp;ldquo;merasa perlu&amp;rdquo; ya jalan terus. Lama-kelamaan terbiasa dan lancar.&lt;/p&gt;
&lt;p&gt;Jika kita menerapkan metode/langkah tersebut sejak awal &lt;em&gt;development&lt;/em&gt; hingga selesai, maka hasil yang kita dapatkan adalah sebuah &lt;strong&gt;&amp;ldquo;aplikasi yang handal&amp;rdquo;&lt;/strong&gt;. &lt;em&gt;&amp;ldquo;Wow, pede banget? Ya donk..&amp;rdquo;&lt;/em&gt; kita menyelesaikan sebuah aplikasi/sistem yang berjalan sesuai keinginan (spesifikasi) dan itu dijamin dengan &lt;em&gt;testing automation&lt;/em&gt;, teruji oleh komputer tanpa perlu pengujian manual oleh manusia.&lt;/p&gt;
&lt;h3 id=&#34;tdd-mempercepat-pembangunan-aplikasi&#34;&gt;TDD Mempercepat Pembangunan Aplikasi?&lt;/h3&gt;
&lt;p&gt;Pada &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-latar-belakang/&#34;&gt;artikel sebelumnya&lt;/a&gt;
, saya menyebutkan bahwa metode &lt;strong&gt;TDD&lt;/strong&gt; dapat mempercepat kerja kita dalam membangun sebuah aplikasi. &lt;em&gt;Yap&lt;/em&gt;, ingin menegaskan kembali, pada penerapan &lt;strong&gt;TDD&lt;/strong&gt; ini, dengan adanya &lt;em&gt;testing&lt;/em&gt; yang &amp;ldquo;memandu&amp;rdquo;, kita tinggal &lt;em&gt;ngoding&lt;/em&gt; untuk memperbaiki &lt;em&gt;error&lt;/em&gt; yang tampil di &lt;em&gt;software testing&lt;/em&gt; saja, sampai &lt;em&gt;testing&lt;/em&gt;-nya &lt;em&gt;passed&lt;/em&gt;. Selanjutnya kita bisa &lt;em&gt;refactor script&lt;/em&gt; aplikasinya, atau langsung melanjutkan membangun fitur berikutnya dengan metode yang sama, begitu seterusnya.&lt;/p&gt;
&lt;p&gt;Bahkan kadang kita &amp;ldquo;tidak mesti&amp;rdquo; membuka browser (aplikasi) untuk memastikan apakah &lt;em&gt;coding&lt;/em&gt; yang kita kerjakan sudah &amp;ldquo;jalan&amp;rdquo; atau belum, karena sudah &amp;ldquo;yakin&amp;rdquo; dengan &lt;em&gt;testing&lt;/em&gt; yang &lt;em&gt;passed&lt;/em&gt;. Kita buka browser pada saat ingin memperbaiki tampilan atau tata letak nya saja.&lt;/p&gt;
&lt;h4 id=&#34;memangkas-aktifitas-yang-agak-menyita-waktu&#34;&gt;Memangkas aktifitas yang &amp;ldquo;agak&amp;rdquo; menyita waktu&lt;/h4&gt;
&lt;p&gt;Jadi apa saja sih pekerjaan yang dipangkas dengan metode &lt;strong&gt;TDD&lt;/strong&gt; ini? Kita memangkas aktifitas-aktifitas yang sedikit menyita waktu. Menurut pengalaman saya, yang agak &lt;del&gt;lumayan&lt;/del&gt; menyita waktu adalah hal-hal berikut :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setelah &lt;em&gt;ngoding&lt;/em&gt; beberapa baris, kita buka browser untuk &lt;em&gt;refresh&lt;/em&gt; halaman, atau submit form, lalu &lt;em&gt;ngoding&lt;/em&gt; lagi, buka browser lagi, &lt;em&gt;refresh&lt;/em&gt;, dan seterusnya.&lt;/li&gt;
&lt;li&gt;Kita membuka browser untuk simulasi mengisi form lebih dari 5 item dan submit formulir.&lt;/li&gt;
&lt;li&gt;Setelah selesai &lt;em&gt;ngoding&lt;/em&gt; satu fitur, kita menguji &amp;ldquo;proses yang bertahap&amp;rdquo; di dalam sistem, misal :
&lt;ul&gt;
&lt;li&gt;Setelah mengisi keranjang belanja kita, &lt;em&gt;checkout&lt;/em&gt; mengisi data diri (sebagai Customer).&lt;/li&gt;
&lt;li&gt;Sebagai Reseller, setelah mengisi keranjang belanja kita, &lt;em&gt;checkout&lt;/em&gt; mengisi data pengiriman.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simulasi fitur-fitur lain yang berhubungan dengan fitur yang barusan selesai dibuat.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jadi dengan adanya &lt;em&gt;testing&lt;/em&gt; untuk masing-masing fitur itu, kita tidak perlu mengetes lagi secara manual. Yang penting &lt;em&gt;testing&lt;/em&gt; sudah dibuat mengikuti spesifikasi yang diinginkan dan &lt;em&gt;testing&lt;/em&gt;-nya &lt;em&gt;passed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Nah kesimpulannya, kenapa metode &lt;strong&gt;TDD&lt;/strong&gt; dapat mempercepat kerja kita dalam membangun sebuah aplikasi? Karena simulasi-simulasi yang dilakukan secara manual dapat diminimalisir dengan adanya &lt;em&gt;testing&lt;/em&gt; yang sudah &lt;em&gt;passed&lt;/em&gt;. Sudah itu aja jawabannya. :)&lt;/p&gt;
&lt;h4 id=&#34;memudahkan-modifikasi-fitur&#34;&gt;Memudahkan modifikasi fitur&lt;/h4&gt;
&lt;p&gt;Bagaimana jika ditengah proses &lt;em&gt;developement&lt;/em&gt; atau saat sistem sudah hampir selesai, kita diminta modifikasi sebuah fitur karena User &lt;em&gt;&amp;ldquo;baru kepikiran&amp;rdquo;&lt;/em&gt;, nah lho, &lt;strong&gt;ini sering banget kejadian&lt;/strong&gt;. Oke, dengan adanya &lt;em&gt;automated testing&lt;/em&gt;, kita tinggal modifikasi &lt;em&gt;testing script&lt;/em&gt; fitur sesuai yang diminta oleh User tadi, lalu jalankan &lt;em&gt;testing&lt;/em&gt; (pasti ketemu &lt;em&gt;error&lt;/em&gt;), perbaiki &lt;em&gt;error&lt;/em&gt;-nya, testing lagi sampai ketemu &lt;em&gt;testing passed&lt;/em&gt; untuk fitur itu, maka modifikasi fitur selesai.&lt;/p&gt;
&lt;p&gt;Apakah setelah selesai modifikasi fitur tadi pekerjaan selesai? Belum! Kita mesti uji juga apakah fitur yang barusan diubah tadi tidak  &amp;ldquo;merusak&amp;rdquo; atau menjadi &lt;em&gt;bug&lt;/em&gt; fitur lainnya (biasanya karena kita modifikasi tabel di database). Jika memang fitur itu menjadi &lt;em&gt;bug&lt;/em&gt; untuk fitur lain, maka &lt;em&gt;testing&lt;/em&gt; akan segera memberitahu kita, sehingga dapat segera diperbaiki (menjadikan seluruh testing menjadi &lt;em&gt;passed&lt;/em&gt;).&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan-tdd&#34;&gt;Kesimpulan TDD&lt;/h3&gt;
&lt;p&gt;Dengan menerapkan metode Test-Driven Development, beberapa manfaat yang didapatkan oleh &lt;em&gt;developer&lt;/em&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Developer &lt;strong&gt;dipandu oleh &lt;em&gt;testing&lt;/em&gt;&lt;/strong&gt; dalam proses &lt;em&gt;development&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Semua target spesifikasi harus dituangkan dalam &lt;em&gt;script testing&lt;/em&gt; agar mendapatkan fitur yang sesuai keinginan.&lt;/li&gt;
&lt;li&gt;TDD dapat mempercepat kerja karena &lt;strong&gt;meminimalisir simulasi manual&lt;/strong&gt; oleh manusia.&lt;/li&gt;
&lt;li&gt;Modifikasi sebuah fitur dapat dilakukan &amp;ldquo;dengan tenang&amp;rdquo; karena ada &lt;strong&gt;&lt;em&gt;Automated Testing&lt;/em&gt; yang mem-&lt;em&gt;backup&lt;/em&gt;&lt;/strong&gt; kita.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menambah percaya diri&lt;/strong&gt; &lt;em&gt;developer&lt;/em&gt; karena dapat membangun aplikasi yang handal teruji.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Semoga dengan membaca artikel ini teman-teman &lt;em&gt;developer&lt;/em&gt; lebih mantap untuk memulai metode &lt;strong&gt;TDD&lt;/strong&gt; dalam bekerja. Insyaallah pada artikel berikutnya kita mulai masuk ke praktek &lt;strong&gt;Testing Laravel&lt;/strong&gt;, yaitu &lt;em&gt;setup testing&lt;/em&gt; laravel yang biasa saya terapkan saat mulai project, dan memulai membuat &lt;em&gt;testing script&lt;/em&gt; sebuah fitur.&lt;/p&gt;
&lt;p&gt;Terima kasih atas waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Tentang Automated Testing</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-tentang-automated-testing/</link>
       <pubDate>Wed, 26 Jul 2017 12:22:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-tentang-automated-testing/</guid>
       <description>&lt;p&gt;Melanjutkan dari artikel sebelumnya, kita sudah membahas bahwa
&lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-latar-belakang/&#34;&gt;&lt;em&gt;Automated Testing&lt;/em&gt; itu penting untuk dipelajari&lt;/a&gt;
dan diterapkan dalam pembangunan aplikasi. Kali ini kita akan membahas lebih lanjut tentang apa itu &lt;strong&gt;Automated Testing&lt;/strong&gt; atau disebut juga &lt;strong&gt;Testing Automation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Menerjemahkan pengertian dari &lt;a href=&#34;https://en.wikipedia.org/wiki/Test_automation&#34;&gt;Wikipedia&lt;/a&gt;, menurut pemahaman saya :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Automated Testing&lt;/strong&gt; adalah sebuah metode pengujian software yang menggunakan suatu &lt;strong&gt;Software Testing&lt;/strong&gt; (terpisah dari sistem/aplikasi yang sedang diuji), dengan tujuan untuk membandingkan antara &amp;ldquo;&lt;em&gt;output&lt;/em&gt; yang diprediksikan&amp;rdquo; dengan &amp;ldquo;&lt;em&gt;output&lt;/em&gt; yang dihasilkan&amp;rdquo; oleh sistem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jadi kita memanfaatkan sebuah &lt;strong&gt;software/framework testing&lt;/strong&gt; sebagai pengganti manusia untuk menguji, apakah sistem/aplikasi yang kita buat sudah sesuai dengan spesifikasi yang ditentukan atau tidak.&lt;/p&gt;
&lt;h4 id=&#34;tahapan-umum-melakukan-automated-testing&#34;&gt;Tahapan umum melakukan &lt;em&gt;Automated Testing&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Secara umum tahapan melakukan &lt;em&gt;Automated Testing&lt;/em&gt; adalah sebagaimana berikut :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Memasang &lt;em&gt;software testing&lt;/em&gt;&lt;/strong&gt; pada sistem/aplikasi yang kita bangun.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menulis &amp;ldquo;kode/&lt;em&gt;script&lt;/em&gt; pengujian&amp;rdquo;&lt;/strong&gt; pada &lt;em&gt;software testing&lt;/em&gt; untuk menguji masing-masing fitur yang ada di sistem.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Kode/&lt;em&gt;script&lt;/em&gt; pengujian&amp;rdquo; yang ditulis pada &lt;em&gt;software testing&lt;/em&gt; disesuaikan dengan kebutuhan/&lt;em&gt;output&lt;/em&gt; yang diinginkan pada setiap fitur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menjalankan &lt;em&gt;software testing&lt;/em&gt;&lt;/strong&gt; untuk melihat apakah fitur yang ada pada sistem/aplikasi &amp;ldquo;lulus uji&amp;rdquo; oleh &lt;em&gt;software testing&lt;/em&gt; atau tidak.
&lt;ul&gt;
&lt;li&gt;Jika fitur yang diuji &lt;strong&gt;lulus&lt;/strong&gt;, maka status hasil pengujian adalah &lt;strong&gt;passed&lt;/strong&gt; atau &amp;ldquo;lulus&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Jika fitur yang diuji &lt;strong&gt;tidak lulus&lt;/strong&gt;, maka si-&lt;em&gt;software testing&lt;/em&gt; akan menampilkan pesan error yang didapatkannya dari sistem kita.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan:&lt;/strong&gt;&lt;br&gt;
Untuk mempermudah penyebutannya, &amp;ldquo;&lt;strong&gt;Kode pengujian&lt;/strong&gt;&amp;rdquo; ini kita sebut dengan &lt;em&gt;&lt;strong&gt;testing script&lt;/strong&gt;&lt;/em&gt; atau singkatnya &lt;em&gt;&lt;strong&gt;testing&lt;/strong&gt;&lt;/em&gt; saja.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;contoh-kasus--testing-fitur-ganti-password-dengan-phpunit-dan-laravel&#34;&gt;Contoh kasus : Testing Fitur Ganti Password dengan PHPUnit dan Laravel&lt;/h4&gt;
&lt;p&gt;Misalkan di sistem kita, terdapat satu fitur untuk &lt;strong&gt;user mengganti password&lt;/strong&gt;, di mana untuk menggunakan fitur tersebut &lt;em&gt;user&lt;/em&gt; melakukannya dengan cara :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Meng-klik link &lt;strong&gt;Ganti Password&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Mengisi Password yang lama&lt;/li&gt;
&lt;li&gt;Mengisi Password yang baru&lt;/li&gt;
&lt;li&gt;Mengisi Konfirmasi password&lt;/li&gt;
&lt;li&gt;Klik Tombol &lt;strong&gt;Update Password&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Password baru &lt;strong&gt;tersimpan&lt;/strong&gt; dalam database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tampil pesan&lt;/strong&gt; &amp;ldquo;Password anda berhasil diubah.&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Nah&lt;/em&gt;, dengan &lt;strong&gt;Automated Testing&lt;/strong&gt; kita melakukan simulasi proses/tahapan aktifitas tersebut dengan bantuan komputer (&lt;em&gt;Software Testing&lt;/em&gt;).
Dalam contoh kasus ini kita menggunakan sebuah software/framework testing bernama &lt;a href=&#34;https://phpunit.de&#34;&gt;&lt;strong&gt;phpunit&lt;/strong&gt;&lt;/a&gt; yang sudah tersedia dan terintegrasi dengan framework &lt;a href=&#34;https://laravel.com&#34;&gt;&lt;strong&gt;Laravel&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dengan catatan bahwa &lt;strong&gt;fitur ganti password&lt;/strong&gt; di dalam sudah bekerja sesuai cara di atas, berikut adalah &lt;strong&gt;contoh&lt;/strong&gt; &lt;em&gt;testing script&lt;/em&gt;-nya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\Feature\Auth&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\User&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Illuminate\Foundation\Testing\DatabaseMigrations&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tests\BrowserKitTestCase&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Kelas penguji untuk tujuan pengelompokan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;UserChangePasswordTest&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BrowserKitTestCase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DatabaseMigrations&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;/** @test */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;user_can_change_password&lt;/span&gt;() &lt;span style=&#34;color:#75715e&#34;&gt;// Kasus fitur yang diuji
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Kondisi/Permisalan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// generate user
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;make&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;username&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;123456&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;actingAs&lt;/span&gt;($user); &lt;span style=&#34;color:#75715e&#34;&gt;// Login/Acting sebagai user
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Action
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;visit&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;route&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;change-password&amp;#39;&lt;/span&gt;)); &lt;span style=&#34;color:#75715e&#34;&gt;// Kunjungi url /change-password
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;old_password&amp;#39;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// Input form
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;member&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;member&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;password_confirmation&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;press&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;trans&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;auth.change_password&amp;#39;&lt;/span&gt;)); &lt;span style=&#34;color:#75715e&#34;&gt;// Tekan tombol
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Asumsi hasil
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;see&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;trans&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;auth.old_password_success&amp;#39;&lt;/span&gt;)); &lt;span style=&#34;color:#75715e&#34;&gt;// Melihat pesan
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;seePageIs&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;route&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;change-password&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Cek bahwa passsword sudah berubah (password sebelumnya : secret)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;assertTrue&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;app&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hash&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;check&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;member&amp;#39;&lt;/span&gt;, $user&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;small&gt;&lt;strong&gt;Sumber&lt;/strong&gt;:
&lt;a href=&#34;https://github.com/nafiesl/grosir-obat/blob/master/tests/Feature/Auth/UserChangePasswordTest.php&#34;&gt;&amp;ldquo;UserChangePasswordTest.php&amp;rdquo;&lt;/a&gt; pada &lt;a href=&#34;https://github.com/nafiesl/grosir-obat&#34;&gt;&lt;strong&gt;repo di github&lt;/strong&gt;&lt;/a&gt; dengan sedikit modifikasi.&lt;/small&gt;&lt;/p&gt;
&lt;h5 id=&#34;testing-lulus&#34;&gt;Testing Lulus&lt;/h5&gt;
&lt;p&gt;Okey, untuk mecoba apaka testingnya berhasil, kita coba jalankan  &lt;strong&gt;PHPUnit&lt;/strong&gt; pada Laravel, dengan perintah berikut pada terminal :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ vendor/bin/phpunit tests/Feature/Auth/UserChangePasswordTest.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dan hasilnya :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-07-26-testing-laravel-tentang-automated-testing-01.jpg&#34; alt=&#34;Automated Testing 01&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sip&lt;/em&gt;, kita dapat &lt;em&gt;&lt;strong&gt;hijau&lt;/strong&gt;&lt;/em&gt; artinya &lt;strong&gt;&amp;ldquo;lulus tes&amp;rdquo;&lt;/strong&gt;, berarti output yang diharapkan pada &lt;em&gt;testing script&lt;/em&gt; yang kita buat ini &lt;strong&gt;sudah cocok&lt;/strong&gt; dengan output yang dihasilkan oleh fitur Ganti Password pada sistem kita.&lt;/p&gt;
&lt;h5 id=&#34;testing-gagal&#34;&gt;Testing Gagal&lt;/h5&gt;
&lt;p&gt;Bagaimana jika pengujian gagal? Misalkan setelah kita memodifikasi &lt;em&gt;script&lt;/em&gt; yang terkait dengan fitur &lt;strong&gt;Ganti Password&lt;/strong&gt; ini, maka PHPUnit akan menampilkan pesan &lt;em&gt;error&lt;/em&gt; seperti contoh berikut :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-07-26-testing-laravel-tentang-automated-testing-02.jpg&#34; alt=&#34;Automated Testing 02&#34;&gt;&lt;/p&gt;
&lt;p&gt;Begitu menemukan seperti ini, kita langsung dapat mengetahui bahwa ada kesalahan di &lt;em&gt;script&lt;/em&gt; aplikasi kita. Sehingga dapat segera memperbaiki tanpa harus diuji secara manual atau menunggu &amp;ldquo;laporan&amp;rdquo; dari &lt;em&gt;User&lt;/em&gt; yang menggunakan sistem.&lt;/p&gt;
&lt;h4 id=&#34;automated-testing-menghemat-waktu&#34;&gt;&amp;ldquo;Automated Testing&amp;rdquo; Menghemat Waktu&lt;/h4&gt;
&lt;p&gt;Jika kita lihat pada contoh di atas (&lt;em&gt;Testing Lulus&lt;/em&gt;) pada bagian &lt;code&gt;time: 193 ms&lt;/code&gt;, artinya satu pengujian/&lt;em&gt;testing script&lt;/em&gt; tersebut hanya memakan waktu &lt;strong&gt;193 mili detik&lt;/strong&gt;. Jauh lebih cepat jika kita mengujinya dengan cara manual dengan cara : &lt;strong&gt;Buka Browser&lt;/strong&gt;, lalu &lt;strong&gt;Login&lt;/strong&gt;, lalu klik &lt;strong&gt;Ganti Password&lt;/strong&gt;, dan seterusnya.. mungkin perlu waktu sekitar 5-10 detik.&lt;/p&gt;
&lt;p&gt;Dalam hati mungkin kita bilang : &lt;em&gt;&amp;ldquo;Ga masalah sih, waktu 5-10 detik itu ga lama kok&amp;rdquo;&lt;/em&gt;. Tapi perlu kita ingat, bahwa waktu 5-10 detik itu hanya untuk menguji satu fitur saja. Bayangkan kalau kita memiliki 20 fitur dengan formulir pengisian yang lebih banyak.&lt;/p&gt;
&lt;p&gt;Jika kita hitung rata-rata 1 fitur kita perlu waktu 5 detik untuk menguji secara manual dan &lt;em&gt;continue&lt;/em&gt;, maka untuk 20 fitur kita perlu waktu &lt;strong&gt;100 detik&lt;/strong&gt; (1 menit 40 detik). &lt;strong&gt;Dibandingkan&lt;/strong&gt; dengan bantuan &lt;strong&gt;Automated Testing&lt;/strong&gt; yang hanyar perlu waktu sekitar &lt;strong&gt;4 detik&lt;/strong&gt; (20 x ~200ms). Tentunya jauh lebih efektif, &lt;em&gt;kan&lt;/em&gt;? Itu baru 20 Fitur, &lt;em&gt;lho&lt;/em&gt;.. :)&lt;/p&gt;
&lt;h5 id=&#34;contoh-testing-keseluruhan&#34;&gt;Contoh Testing Keseluruhan&lt;/h5&gt;
&lt;p&gt;Ini adalah capture &lt;em&gt;automated testing PHPUnit&lt;/em&gt; yang dijalankan pada aplikasi &lt;strong&gt;Grosir Obat&lt;/strong&gt; di atas yang telah dibuat untuk semua fiturnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-07-26-testing-laravel-tentang-automated-testing-03.jpg&#34; alt=&#34;Automated Testing 03&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bisa kita lihat, dalam &lt;strong&gt;waktu 2,7 detik&lt;/strong&gt;, &lt;em&gt;PHPUnit&lt;/em&gt; membantu men-simulasikan penggunaan fitur dengan hasil &lt;strong&gt;&amp;ldquo;Lulus&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Teman-teman bisa melihat dan mencoba &lt;em&gt;testing script&lt;/em&gt; keseluruhan dari aplikasi tersebut di github pada direktori
&lt;a href=&#34;https://github.com/nafiesl/grosir-obat/tree/master/tests&#34;&gt;&lt;strong&gt;grosir-obat/tests/&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;konsep-penulisan-kode-pengujian&#34;&gt;Konsep penulisan &amp;ldquo;Kode Pengujian&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Jika kita ingin membuat sebuah &lt;em&gt;testing script&lt;/em&gt; untuk suatu fitur, bagaimana menulisnya? &lt;strong&gt;Konsep penulisan&lt;/strong&gt; yang saya sering terapkan kurang lebih mengikut alur berikut :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kita buat sebuah kasus yang ingin kita uji.&lt;/li&gt;
&lt;li&gt;Tuliskan &lt;em&gt;testing script&lt;/em&gt; untuk menentukan kondisi, &lt;em&gt;action&lt;/em&gt; dan asumsi dengan urutan :
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kondisi&lt;/strong&gt; atau permisalan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt; yang dilakukan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asumsi&lt;/strong&gt; hasil yang diinginkan&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Pastikan &lt;em&gt;testing script&lt;/em&gt; tadi sudah sesuai dengan tugas atau langkah kerja fitur yang kita ujikan.&lt;/li&gt;
&lt;li&gt;Jalankan &lt;em&gt;software testing / (PHPUnit)&lt;/em&gt; untuk melihat hasilnya.&lt;/li&gt;
&lt;li&gt;Jika pada kasus pengujian ini &lt;strong&gt;lulus&lt;/strong&gt; tes, maka fitur tersebut cocok dengan asumsi hasil yang diinginkan oleh &amp;ldquo;kode pengujiannya&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Jika pada kasus pengujian ini &lt;strong&gt;tidak lulus&lt;/strong&gt;, berarti ada yang salah, baik di sisi kode pengujian atau dari sisi fiturnya&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Untuk mempermudah pemahaman, kita coba analogikan konsep penulisannya mirip seperti konsep yang diajarkan oleh guru kita sejak SD, ketika kita menjawab soal tugas atau ujian (&lt;em&gt;imho&lt;/em&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Masih ingat dengan kata kunci ini: &lt;strong&gt;Pertanyaan&lt;/strong&gt;, &lt;strong&gt;Diketahui&lt;/strong&gt;, &lt;strong&gt;Ditanya&lt;/strong&gt;, dan &lt;strong&gt;Jawab&lt;/strong&gt;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pasti sebagian besar sudah pernah menerapkan konsep ini untuk menjawab soal, &lt;em&gt;kan&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Contoh :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Pertanyaan :
    Hitunglah luas persegi panjang dengan panjang 5 meter dan lebar 3 meter.

Diketahui : 
    p = 5 meter
    l = 3 meter

Ditanya : Luas persegi panjang (L)

Jawab : 
    L = p x l
      = 5 x 3
      = 15
    Maka luas persegi panjang = 15 meter persegi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nah, pada konsep penulisan &lt;em&gt;testing script&lt;/em&gt; kita juga memiliki 4 kata kunci:&lt;br&gt;
&lt;strong&gt;Fitur&lt;/strong&gt; yang ingin diuji, &lt;strong&gt;Kondisi/Permisalan&lt;/strong&gt;, &lt;strong&gt;Action&lt;/strong&gt; atau ketika &lt;em&gt;script&lt;/em&gt; dieksekusi, dan &lt;strong&gt;Asumsi hasil&lt;/strong&gt; yang diinginkan.&lt;/p&gt;
&lt;p&gt;Jadi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fitur&lt;/strong&gt; yang ingin diuji setara dengan &lt;strong&gt;Pertanyaan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kondisi/Permisalan&lt;/strong&gt; setara dengan &lt;strong&gt;Diketahui&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt; setara dengan &lt;strong&gt;Ditanyakan&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asumsi Hasil&lt;/strong&gt; setara dengan &lt;strong&gt;Jawab&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dengan mengingat konsep ini, harapannya kita akan lebih mudah dalam menulis &lt;em&gt;testing script&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pada beberapa artikel kedepan, kita akan menerapkan konsep tersebut untuk mulai membangun &amp;ldquo;kode pengujian&amp;rdquo; atau &lt;em&gt;testing script&lt;/em&gt; kita.&lt;/p&gt;
&lt;p&gt;Nah, bagaimana jika kita ingin menerapkan Test-Driven Development (TDD)? Yaitu &lt;strong&gt;membuat &lt;em&gt;testing script&lt;/em&gt; terlebih dahulu&lt;/strong&gt; sebelum mulai menulis kode untuk membangun sistem? Kita akan bahas pada artikel &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-test-driven-development/&#34;&gt;&lt;strong&gt;Tentang TDD&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih teman-teman sudah berkenan membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Testing Laravel: Latar Belakang</title>
       <link>https://blog.inweeks.com/laravel/testing-laravel-latar-belakang/</link>
       <pubDate>Thu, 20 Jul 2017 21:15:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/testing-laravel-latar-belakang/</guid>
       <description>&lt;p&gt;Pada artikel ini dan beberapa artikel kedepan, saya ingin berbagi cerita tentang pengalaman saya menggunakan metode &lt;strong&gt;Test-Driven Development (TDD)&lt;/strong&gt;, cara memulai, apa saja yang perlu di-&lt;em&gt;test&lt;/em&gt;, dan studi kasus yang ringan. Mudah-mudahan dapat membantu teman-teman yang ingin menerapkan TDD dalam pekerjaannya.&lt;/p&gt;
&lt;p&gt;Sebelum memulai membahas &lt;strong&gt;Testing Laravel&lt;/strong&gt;, ijinkan saya menceritakan latar belakang mengapa &lt;strong&gt;&amp;ldquo;Testing itu Penting?&amp;rdquo;&lt;/strong&gt;, menurut pengalaman saya selama beberapa tahun terakhir.&lt;/p&gt;
&lt;h3 id=&#34;problem-yang-dihadapi-oleh-developer&#34;&gt;Problem yang dihadapi oleh Developer&lt;/h3&gt;
&lt;p&gt;Seorang developer (terutama &lt;em&gt;freelancer&lt;/em&gt;) kadang mengalami perasaan &lt;em&gt;&amp;ldquo;takut&amp;rdquo;&lt;/em&gt; saat diminta melakukan &lt;em&gt;improvement&lt;/em&gt; pada aplikasi buatannya sendiri, terutama jika sudah berjalan di server &lt;em&gt;production&lt;/em&gt; dan sedang digunakan oleh &lt;em&gt;user&lt;/em&gt;. Misal kita diminta menambah fitur baru atau mengubah fitur yang sudah berjalan.&lt;/p&gt;
&lt;p&gt;Kenapa &lt;em&gt;kok&lt;/em&gt; takut, padahal aplikasi itu kan buatan kita sendiri? Satu alasan terlintas di pikiran adalah karena kita cenderung sudah lupa dengan &lt;em&gt;&amp;ldquo;coding&amp;rdquo;&lt;/em&gt; kita sendiri. Apalagi jika bekerja sebagai &lt;em&gt;freelancer&lt;/em&gt;, umumnya setelah selesai mengerjakan satu &lt;em&gt;project&lt;/em&gt;, kita langsung mencari, mengambil pekerjaan/&lt;em&gt;project&lt;/em&gt; lain, dan fokus pada &lt;em&gt;project&lt;/em&gt; selanjutnya.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bener nggak?&lt;/em&gt;&lt;/p&gt;
&lt;h4 id=&#34;contoh-kasus&#34;&gt;Contoh Kasus&lt;/h4&gt;
&lt;p&gt;Satu waktu kita menyelesaikan sebuah &lt;em&gt;project&lt;/em&gt; aplikasi untuk sebuah perusahaan. Selanjutnya sistem itu digunakan sekaligus (tahap) pengujian oleh &lt;em&gt;user&lt;/em&gt;/klien selama 1-2 bulan, untuk memastikan semua fitur berjalan sesuai dengan target dan tujuan. Setelah masa pengujian selesai dan semua fitur sudah &lt;em&gt;Oke&lt;/em&gt; (mungkin setelah beberapa &lt;em&gt;bugfix&lt;/em&gt;), aplikasi digunakan oleh perusahaan secara penuh. Selesai pekerjaan sampai di situ.&lt;/p&gt;
&lt;p&gt;Enam bulan kemudian, perusahaan tersebut menghubungi kita lagi untuk meminta &lt;em&gt;improvement&lt;/em&gt; di sistemnya. Setelah berdiskusi, ada beberapa fitur yang ingin ditambahkan ke sistem, dan ternyata ada beberapa fitur yang diubah karena adanya perubahan kebijakan perusahaan.&lt;/p&gt;
&lt;p&gt;Apa yang harus kita lakukan untuk memenuhi permintaan tersebut, &lt;strong&gt;dengan catatan&lt;/strong&gt;, sistem yang sudah ada sekarang tetap digunakan &lt;strong&gt;paralel&lt;/strong&gt; dengan proses &lt;em&gt;improvement&lt;/em&gt;?&lt;/p&gt;
&lt;h4 id=&#34;potensi-bug-setelah-improvement&#34;&gt;Potensi &amp;ldquo;Bug setelah Improvement&amp;rdquo;&lt;/h4&gt;
&lt;p&gt;Menurut pengalaman, kondisi ini bisa membuat kita (terutama saya) &lt;em&gt;takut&lt;/em&gt; untuk menambah/mengubah fitur pada aplikasi buatan sendiri, karena :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Harus mengubah stuktur tabel yang saat ini sudah berjalan dengan aman.&lt;/li&gt;
&lt;li&gt;Ada potensi &lt;em&gt;bug&lt;/em&gt; yang muncul akibat perubahan struktur database.&lt;/li&gt;
&lt;li&gt;Ada potensi &lt;em&gt;bug&lt;/em&gt; yang muncul akibat penambahan/perubahan script fitur yang dilakukan.&lt;/li&gt;
&lt;li&gt;Kita sudah lupa dengan &lt;em&gt;workflow&lt;/em&gt; yang diterapkan saat membuatnya, sementara &lt;em&gt;project&lt;/em&gt; yang kita kerjakan setelahnya menggunakan &lt;em&gt;workflow&lt;/em&gt; baru.&lt;/li&gt;
&lt;li&gt;Proses migrasi data yang sudah ada (&lt;em&gt;existing&lt;/em&gt;) ke sistem yang baru (setelah ditambah fitur).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dengan beberapa alasan tersebut, bisa jadi kita akan ragu untuk mengerjakan &lt;em&gt;improvement&lt;/em&gt; yang diminta, karena
&lt;strong&gt;memikirkan &lt;em&gt;impact&lt;/em&gt;/akibatnya&lt;/strong&gt;, misalkan :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Komplain yang tidak terduga dari &lt;em&gt;user&lt;/em&gt; beberapa minggu setelah &lt;em&gt;improvement&lt;/em&gt; selesai.&lt;br&gt;
Misal ada laporan: &lt;em&gt;&amp;ldquo;Mas kemarin yang ini perhitungannya bener, kok sekarang salah?&amp;rdquo;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Kadang &lt;strong&gt;waktu&lt;/strong&gt; yang diperlukan untuk &lt;strong&gt;perbaikan &lt;em&gt;impact&lt;/em&gt;&lt;/strong&gt; bisa lebih banyak daripada waktu pengerjaan &lt;em&gt;improvement&lt;/em&gt;.&lt;br&gt;
Misal: kita sudah perbaiki &lt;em&gt;bug&lt;/em&gt; yang dilaporkan, tetapi perbaikan tadi &lt;strong&gt;menjadi &lt;em&gt;bug&lt;/em&gt; lagi&lt;/strong&gt; pada fitur lain, yang sebelumnya &lt;em&gt;baik-baik saja&lt;/em&gt;, seterusnya &lt;strong&gt;sampai tidak ada laporan &lt;em&gt;bug&lt;/em&gt; lagi&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;(Saat mengerjakan improvement) Fokus pekerjaan terbagi antara mengerjakan fitur baru dengan rasa takut komplain yang akan datang belakangan.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bagi sebagian orang mungkin ini hal yang biasa, karena ini adalah &lt;em&gt;&amp;ldquo;resiko&amp;rdquo;&lt;/em&gt; dari proses &lt;em&gt;improvement&lt;/em&gt; sebuah sistem dan ini harus dipahami oleh &lt;em&gt;user&lt;/em&gt;/klien (pengguna aplikasi). Tapi bagi saya pribadi, potensi &lt;em&gt;impact&lt;/em&gt; ini lumayan mengganggu, karena kita harus tetap bertanggung jawab atas kelalaian kita sendiri pada saat pengerjaan &lt;em&gt;improvement&lt;/em&gt; itu. Bayangkan waktu dan pikiran yang dihabiskan untuk perbaikannya, padahal di saat yang sama kita sedang mengerjakan &lt;em&gt;project&lt;/em&gt; yang lain.&lt;/p&gt;
&lt;p&gt;Apa lagi setelah &lt;em&gt;bug&lt;/em&gt; diperbaiki, muncul &lt;em&gt;bug&lt;/em&gt; lain lagi.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mumet, kan? Mumet.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tapi kan bagaimanapun kita mesti maju, tidak bisa bilang kepada klien bahwa kita takut memenuhi permintaan itu.
Orang aplikasinya juga kita yang bikin.  &lt;em&gt;Ntar&lt;/em&gt; malu kita..&lt;/p&gt;
&lt;p&gt;Nah? jadi &lt;em&gt;curcol&lt;/em&gt;..&lt;/p&gt;
&lt;p&gt;Oke, anggap saja &lt;em&gt;improvement&lt;/em&gt; kita sanggupi dan sudah kita kerjakan.&lt;/p&gt;
&lt;h4 id=&#34;solusi-tradisional-untuk-potensi-bug-setelah-improvement&#34;&gt;SOLUSI tradisional untuk Potensi &amp;ldquo;Bug setelah Improvement&amp;rdquo;&lt;/h4&gt;
&lt;p&gt;Setelah pekerjaan &lt;em&gt;improvement&lt;/em&gt; selesai, mestinya kita melakukan pengujian untuk memastikan aplikasi berjalan dengan baik tanpa ada &lt;em&gt;bug&lt;/em&gt;, &lt;em&gt;bukan&lt;/em&gt;?&lt;/p&gt;
&lt;h5 id=&#34;pengujian-dilakukan-oleh-developer&#34;&gt;Pengujian dilakukan oleh Developer&lt;/h5&gt;
&lt;p&gt;Bayangkan misal aplikasi ini memiliki &lt;strong&gt;10 fitur utama&lt;/strong&gt;, dan masing-masing fitur utama memiliki &lt;strong&gt;4-5 sub-fitur&lt;/strong&gt;, sehingga ditotal &lt;strong&gt;sekitar 50 fitur&lt;/strong&gt;. Apakah setelah melakukan &lt;em&gt;improvement&lt;/em&gt; tadi, kita menguji semua fitur secara manual?&lt;/p&gt;
&lt;p&gt;Misal dengan cara :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buka browser dan Login&lt;/li&gt;
&lt;li&gt;Input form satu-satu&lt;/li&gt;
&lt;li&gt;Input form dengan kondisi input yang salah&lt;/li&gt;
&lt;li&gt;Cek hasil input form di aplikasi atau di database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Satu persatu fitur sampai dirasa cukup.&lt;/p&gt;
&lt;p&gt;Jika aplikasi tidak terlalu besar, proses pengujian manual ini tidak masalah. Tapi untuk kasus ini, proses di atas kita lakukan &lt;strong&gt;setidaknya&lt;/strong&gt; untuk 10 fitur utamanya. Atau hanya fitur-fitur lama yang berkaitan dengan fitur baru (yang dibuat setelah &lt;em&gt;improvement&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Idealnya memang semua fitur harus diuji, tapi apakah seorang programmer akan &lt;strong&gt;&amp;ldquo;se-rajin&amp;rdquo;&lt;/strong&gt; itu? Silakan jawab sendiri :D&lt;/p&gt;
&lt;p&gt;Bayangkan, &lt;strong&gt;berapa banyak waktu&lt;/strong&gt; yang kita habiskan untuk &lt;strong&gt;memastikan semua fitur berjalan lancar&lt;/strong&gt; setelah &lt;em&gt;improvement&lt;/em&gt; selesai? Kalau aplikasi tidak terlalu kompleks, mungkin 1 hari selesai pengujian. Tetapi jika aplikasi lumayan kompleks dengan fitur-fitur yang saling berhubungan satu sama lain? Mungkin perlu 2 hari, seminggu, atau &lt;em&gt;&amp;ldquo;kalau rajin&amp;rdquo;&lt;/em&gt; bisa 2 minggu. Padahal pengerjaan &lt;em&gt;improvement&lt;/em&gt; nya hanya 1 atau 2 hari saja sudah beres.&lt;/p&gt;
&lt;h5 id=&#34;membiarkan-user-komplain&#34;&gt;Membiarkan user komplain?&lt;/h5&gt;
&lt;p&gt;Alternatifnya jika kita tidak mau repot, &lt;strong&gt;kita biarkan user yang mencoba&lt;/strong&gt; sendiri, ketika ada masalah &lt;strong&gt;biarkan melapor&lt;/strong&gt;, kemudian &lt;em&gt;bug&lt;/em&gt; diperbaiki. Begitu seterusnya sampai tidak ada laporan lagi.&lt;/p&gt;
&lt;p&gt;Cara ini resikonya cukup besar, bisa membuat hubungan kita dengan klien menjadi renggang gara-gara &lt;em&gt;keseringan&lt;/em&gt; adu argumen soal &lt;em&gt;bug&lt;/em&gt;. Bisa membuat &lt;strong&gt;image&lt;/strong&gt; kita &lt;del&gt;jelek&lt;/del&gt; kurang bagus di mata klien. Dan menurut saya, cara kerja ini sangat tidak efektif dan menghabiskan waktu.&lt;/p&gt;
&lt;p&gt;Ditambah lagi (jika) setelah &lt;em&gt;improvement&lt;/em&gt; ini kita langsung ke &lt;em&gt;project&lt;/em&gt; berikutnya, kondisi seperti ini &lt;strong&gt;berpotensi&lt;/strong&gt; membuat kita &lt;strong&gt;dikejar &lt;em&gt;deadline&lt;/em&gt;&lt;/strong&gt;. Karena bisa jadi kita &lt;strong&gt;tidak fokus&lt;/strong&gt; mana yang mau diprioritaskan di antara :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Bugfix&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;Pikiran kekhawatiran &lt;em&gt;bug&lt;/em&gt; berikutnya, dan&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Project&lt;/em&gt; yang sedang berjalan.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;jika-aplikasi-punya-automated-testing&#34;&gt;Jika Aplikasi punya &amp;ldquo;Automated Testing&amp;rdquo;?&lt;/h4&gt;
&lt;p&gt;Dengan contoh kasus di atas, saya pertimbangan untuk memulai &lt;strong&gt;belajar &lt;em&gt;Automated Testing&lt;/em&gt;&lt;/strong&gt;. Kenapa? Karena saya pikir, dengan aplikasi yang memiliki &lt;em&gt;Automated Testing&lt;/em&gt;, kita (sebagai developernya) memiliki &lt;em&gt;backup&lt;/em&gt; yang dapat membantu kita memastikan bahwa aplikasi ini &lt;strong&gt;sudah teruji&lt;/strong&gt; secara otomatis dengan bantuan komputer.&lt;/p&gt;
&lt;p&gt;Dibandingkan jika kita harus menguji sistem secara manual, dengan adanya &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-automated-testing/&#34;&gt;&lt;em&gt;&lt;strong&gt;Automated Testing&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; (selanjutnya kita sebut &lt;em&gt;&lt;strong&gt;testing&lt;/strong&gt;&lt;/em&gt;) yang dipasang pada aplikasi buatan kita, ke 50 fitur tadi diuji oleh komputer dengan waktu yang cepat. Bayangkan betapa hematnya waktu kita ketika pengujian (misal) 50 Fitur cukup perlu waktu 30 detik.&lt;/p&gt;
&lt;p&gt;Jadi &lt;strong&gt;jika ada &lt;em&gt;bug&lt;/em&gt;&lt;/strong&gt; yang disebabkan oleh &lt;em&gt;improvement&lt;/em&gt; tadi? &lt;strong&gt;Testing segera memberitahu kita&lt;/strong&gt; dengan cara menampilkan &lt;em&gt;error&lt;/em&gt; yang terjadi. Baik karena &lt;em&gt;script&lt;/em&gt; yang salah, atau struktur database yang ada tidak sesuai dengan &lt;em&gt;script&lt;/em&gt; yang baru.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Yap&lt;/em&gt;, &lt;strong&gt;dalam waktu sekian detik&lt;/strong&gt;, &lt;em&gt;bug&lt;/em&gt; yang disebabkan oleh improvement tadi &lt;strong&gt;segera ketahuan&lt;/strong&gt;. Walhasil, saat itu juga kita dapat segera memperbaikinya, tanpa menunggu &lt;strong&gt;laporan dari &lt;em&gt;user&lt;/em&gt;&lt;/strong&gt; yang bikin kita &lt;em&gt;mumet&lt;/em&gt; kita di kemudian hari.&lt;/p&gt;
&lt;p&gt;Kita akan membahas tentang &lt;em&gt;Automated Testing&lt;/em&gt; &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-automated-testing/&#34;&gt;pada artikel berikutnya&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kesimpulan-latar-belakang-kenapa-testing-itu-penting&#34;&gt;Kesimpulan Latar Belakang &amp;ldquo;Kenapa Testing itu Penting?&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Oke, kita simpulkan materi latar belakang &lt;strong&gt;pentingnya testing&lt;/strong&gt; dalam pengembangan sebuah sistem/aplikasi :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sebagai &lt;strong&gt;backup kita&lt;/strong&gt; jika ada &lt;em&gt;improvement&lt;/em&gt; sistem di kemudian hari&lt;/li&gt;
&lt;li&gt;Sebagai &lt;strong&gt;jaminan&lt;/strong&gt; bahwa aplikasi yang berjalan sudah sesuai dengan spesifikasi yang diinginkan&lt;/li&gt;
&lt;li&gt;Membantu &lt;strong&gt;mempercepat informasi&lt;/strong&gt; &lt;em&gt;bug&lt;/em&gt; akibat perubahan yang dilakukan&lt;/li&gt;
&lt;li&gt;Membuat kerja, pikiran, dan &lt;strong&gt;hidup lebih tenang&lt;/strong&gt; :D&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demikian ulasan tentang latar belakang mengapa saya mempertimbangkan untuk &lt;strong&gt;belajar &lt;em&gt;Automated Testing&lt;/em&gt;&lt;/strong&gt;. Saya berharap teman-teman merasa :&lt;br&gt;
&lt;em&gt;&amp;ldquo;Oh, iya, setuju, ternyata automated testing itu besar sekali manfaatnya.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mudah-mudahan artikel ini dapat menjadi referensi untuk memantapkan niat teman-teman yang ingin belajar dan membuat &lt;em&gt;testing&lt;/em&gt; dalam membangun aplikasi. Pada artikel selanjutnya, kita akan membahas lebih lanjut tentang &lt;a href=&#34;https://blog.inweeks.com/laravel/testing-laravel-tentang-automated-testing/&#34;&gt;&lt;em&gt;&lt;strong&gt;Automated Testing&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih teman-teman sudah berkanan membaca.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Membuat Log Viewer Laravel</title>
       <link>https://blog.inweeks.com/laravel/laravel-log-viewer/</link>
       <pubDate>Tue, 18 Jul 2017 18:11:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/laravel-log-viewer/</guid>
       <description>&lt;p&gt;Kita sering mengalami kesulitan untuk melihat error log aplikasi Laravel ketika aplikasi sudah di &lt;em&gt;deploy&lt;/em&gt; ke &lt;em&gt;production server&lt;/em&gt;, baik di &lt;em&gt;VPS&lt;/em&gt; ataupun di &lt;em&gt;Shared Hosting&lt;/em&gt;.
Terutama pada saat ada laporan dari user misalkan :&lt;br&gt;
&lt;em&gt;&amp;ldquo;Mas, ada error ketika membuka halaman ini.&amp;rdquo;&lt;/em&gt;
atau
&lt;em&gt;&amp;ldquo;Ada bug nih waktu submit form ini tetapi ininya ga diisi.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Biasanya hal-hal seperti ini baru kita temukan pada saat aplikasi sudah digunakan oleh usernya (waktu kita bikin sih rasanya baik-baik aja, hehe).&lt;/p&gt;
&lt;p&gt;Nah pada saat dapat laporan itu, biasanya saya login ke &lt;em&gt;VPS&lt;/em&gt; atau cPanel &lt;em&gt;Shared Hosting&lt;/em&gt;, lalu mengecek error log web server dan log di laravel yang ada di direktori &lt;code&gt;storage/logs&lt;/code&gt;.
Dan menelusuri file log untuk menemukan problem yang dimaksud.&lt;/p&gt;
&lt;p&gt;Sebenarnya bagi sebagian orang ini ga terlalu merepotkan sih, tetapi bagi saya ini lumayan repot karena harus melihat catatan akun login &lt;em&gt;VPS&lt;/em&gt; atau &lt;em&gt;cPanel&lt;/em&gt; nya.&lt;/p&gt;
&lt;p&gt;Lalu untuk meminimalisir ini, di aplikasi laravel, kita akan coba buat sebuah halaman untuk :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menampilkan &lt;strong&gt;daftar file&lt;/strong&gt; log Laravel perhari&lt;/li&gt;
&lt;li&gt;Melihat isi file log&lt;/li&gt;
&lt;li&gt;Men-download file log (Save As)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nanti tampilannya lebih kurang seperti ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-07-18-laravel-log-viewer-01.jpg&#34; alt=&#34;Laravel Log Viewer 01&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;tahap-pengerjaan&#34;&gt;Tahap Pengerjaan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Membuat Route dan Controller untuk menampilkan daftar Log&lt;/li&gt;
&lt;li&gt;Membuat View list File Log&lt;/li&gt;
&lt;li&gt;Membuat Route dan controller untuk menampilkan Isi File Log&lt;/li&gt;
&lt;li&gt;Membuat Route dan controller untuk download File Log&lt;/li&gt;
&lt;li&gt;Mengatur Config untuk Log Harian&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Oke, kita langsung buat sama-sama.&lt;/p&gt;
&lt;h3 id=&#34;1-route-dan-controller-untuk-list-file-log&#34;&gt;1. Route dan Controller untuk List File Log&lt;/h3&gt;
&lt;p&gt;Kita buat Route &lt;code&gt;log-files&lt;/code&gt; pada file &lt;code&gt;routes/web.php&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;as&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files.index&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uses&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogFilesController@index&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian buat Controller dengan nama &lt;code&gt;LogFilesController&lt;/code&gt; dan method &lt;code&gt;index&lt;/code&gt; untuk membaca isi direktori &lt;code&gt;storage/logs&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// app/Http/Controllers/LogFilesController.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LogFilesController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;file_exists&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logs&amp;#39;&lt;/span&gt;))) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $logFiles &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;\File&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;allFiles&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logs&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Sort files by modified time DESC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;usort&lt;/span&gt;($logFiles, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; ($a, $b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;strcmp&lt;/span&gt;($a&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getMTime&lt;/span&gt;(), $b&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getMTime&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;view&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;compact&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logFiles&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-view-untuk-list-file-log&#34;&gt;2. View untuk List File Log&lt;/h3&gt;
&lt;p&gt;Sesuai dengan Controller diatas, kita buat view dengan nama &lt;code&gt;log-files.blade.php&lt;/code&gt; pada direktori &lt;code&gt;resources/views&lt;/code&gt;&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/nafiesl/d0afdb062b171ec1c1509aa9c9588dbe.js?file=log-files.blade.php&#34;&gt;&lt;/script&gt;

&lt;h3 id=&#34;3-route-dan-controller-method-untuk-melihat-isi-file&#34;&gt;3. Route dan controller Method untuk Melihat Isi File&lt;/h3&gt;
&lt;p&gt;Kita buat Route &lt;code&gt;log-files/{filename}&lt;/code&gt; pada file &lt;code&gt;routes/web.php&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Route List File
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;as&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files.index&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uses&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogFilesController@index&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Route melihat isi File
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files/{filename}&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;as&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files.show&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uses&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogFilesController@show&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kita lanjutkan &lt;code&gt;LogFilesController&lt;/code&gt; dengan script berikut :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// app/Http/Controllers/LogFilesController.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LogFilesController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// index method..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;($fileName)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;file_exists&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logs/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$fileName))) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logs/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$fileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;($path, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;content-type&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;text/plain&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Invalid file name.&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-route-dan-controller-method-untuk-download-file&#34;&gt;4. Route dan controller Method untuk Download File&lt;/h3&gt;
&lt;p&gt;Untuk download filenya sebenarnya tidak terlalu penting, yang penting kita bisa lihat filenya langsung dari aplikasi.&lt;/p&gt;
&lt;p&gt;Tapi siapa tau diperlukan, kita buat saja. Route &lt;code&gt;log-files/{filename}/download&lt;/code&gt; pada file &lt;code&gt;routes/web.php&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// routes/web.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Route List File
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;as&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files.index&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uses&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogFilesController@index&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Route melihat isi File
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files/{filename}&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;as&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files.show&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uses&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogFilesController@show&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Route Download File
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Route&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files/{filename}/download&amp;#39;&lt;/span&gt;, [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;as&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log-files.download&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;uses&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogFilesController@download&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oke kita buatkan method untuk actionnya di &lt;code&gt;LogFilesController&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// app/Http/Controllers/LogFilesController.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App\Http\Controllers&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LogFilesController&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// index method..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// show method..
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;download&lt;/span&gt;($fileName)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;file_exists&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logs/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$fileName))) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;storage_path&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;logs/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$fileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $downloadFileName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;APP_ENV&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;$fileName;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;download&lt;/span&gt;($path, $downloadFileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Invalid file name.&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;5-mengatur-config-untuk-log-harian&#34;&gt;5. Mengatur Config untuk Log Harian&lt;/h3&gt;
&lt;p&gt;Oke setelah langkah di atas, seharusnya jika kita mengakses route &lt;code&gt;/log-files&lt;/code&gt; kita akan mendapatkan tampilan seperti berikut:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-07-18-laravel-log-viewer-02.jpg&#34; alt=&#34;Laravel Log Viewer 02&#34;&gt;&lt;/p&gt;
&lt;p&gt;Dengan kondisi ini, kita akan repot melihat log karena log digabung dalam 1 file default bernama &lt;code&gt;storage/logs/laravel.log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Untuk mempermudah troubleshoot kita atur konfigurasi log agar file log dibuat per hari. Caranya seperti ini:&lt;/p&gt;
&lt;p&gt;Buka file &lt;code&gt;config/app.php&lt;/code&gt;, kemudian pada bagian log ganti dengan config seperti ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// config/app.php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// sekitar baris ke 123
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;log&amp;#39; =&amp;gt; env(&amp;#39;APP_LOG&amp;#39;, &amp;#39;single&amp;#39;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Ganti log menjadi per hari
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;daily&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Agar jumlah maksimum log untuk 30 hari
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log_max_files&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;log_level&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;env&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;APP_LOG_LEVEL&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;debug&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setelah langkah di atas, seharusnya jika kita mengakses route &lt;code&gt;/log-files&lt;/code&gt; kita akan mendapatkan tampilan seperti berikut :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-07-18-laravel-log-viewer-03.jpg&#34; alt=&#34;Laravel Log Viewer 03&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oke, sampai di sini tutorial pembuatan Laravel Log Viewer, mudah-mudahan dapat membantu teman-teman yang punya kesulitan yang serupa dengan saya.&lt;/p&gt;
&lt;p&gt;Contoh implementasi untuk Log Viewer ini sudah diterapkan pada aplikasi
&lt;a href=&#34;https://github.com/nafiesl/grosir-obat&#34;&gt;&lt;strong&gt;Grosir Obat&lt;/strong&gt;&lt;/a&gt;
yang saya buat.
Bisa teman-teman lihat di &lt;a href=&#34;https://github.com/nafiesl/grosir-obat/commit/f7181b5c7a41f1c33b72ba06b740788e25ee6b8a&#34;&gt;&lt;strong&gt;commit&lt;/strong&gt; ini&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Terima kasih untuk waktunya.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Struktur Direktori Composer</title>
       <link>https://blog.inweeks.com/composer/struktur-direktori-composer/</link>
       <pubDate>Sat, 15 Apr 2017 17:22:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/struktur-direktori-composer/</guid>
       <description>&lt;p&gt;Setelah minggu lalu kita membahas tentang perintah-perintah umum yang digunakan dalam Composer, kali ini kita akan bahas tentang struktur direktori project yang menggunakan Composer sebagai alat bantunya.&lt;/p&gt;
&lt;p&gt;Dalam sebuah project yang menggunakan Composer, akan ada direktori dan file-file berikut :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#direktori-vendor&#34;&gt;Direktori “vendor”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#file-vendorautoloadphp&#34;&gt;File “vendor/autoload.php”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#file-composerjson&#34;&gt;File “composer.json”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#file-composerlock&#34;&gt;File “composer.lock”&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Baik, kita bahas satu persatu sesuai yang saya pahami.&lt;/p&gt;
&lt;h3 id=&#34;1-direktori-vendor&#34;&gt;1. Direktori &amp;ldquo;vendor&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Sebagaimana yang telah kita singgung sebelumnya, direktori ini adalah tempat Composer meletakkan
paket-paket yang telah diinstall/di-&lt;em&gt;download&lt;/em&gt;-nya untuk project/aplikasi kita.
Didalamnya terdapat:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;File &lt;code&gt;autoload.php&lt;/code&gt; (ini akan kita bahas berikutnya)&lt;/li&gt;
&lt;li&gt;Direktori &lt;code&gt;composer&lt;/code&gt;
Saya tidak tahu persis isi dan fungsi dari direktori ini, tetapi sepertinya dari sini lah Composer
mengatur agar kelas-kelas yang ada pada setiap paket dapat di akses sesuai dengan
”namespace”-nya.
Karena secara umum paket-paket yang ada di Composer/packagist dibuat dalam basis object
(OOP).&lt;/li&gt;
&lt;li&gt;Direktori-direktori lainnya yang merupakan direktori paket dependensi yang telah diinstall oleh Composer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah, pada direktori-direktori ini, Composer mengatur susunan paket berdasarkan nama vendornya.
Kita ambil contoh saat kita memberikan perintah&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer require nesbot/carbon 1.20.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;maka struktur direktori kita akan seperti gambar ini :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-15-struktur-direktori-composer-01.jpg&#34; alt=&#34;Struktur Direktori Composer 01&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kita fokus ke direktori &lt;code&gt;&amp;quot;nesbot&amp;quot;&lt;/code&gt; dan &lt;code&gt;&amp;quot;symfony&amp;quot;&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Direktori &lt;code&gt;&amp;quot;nesbot&amp;quot;&lt;/code&gt; berisi direktori &lt;code&gt;&amp;quot;carbon&amp;quot;&lt;/code&gt; yang berisi source code dari paket carbon sesuai yang ada di githubnya.&lt;/li&gt;
&lt;li&gt;Kemudian direktori &lt;code&gt;&amp;quot;symfony&amp;quot;&lt;/code&gt; berisi direktori &lt;code&gt;&amp;quot;polyfill-mbstring&amp;quot;&lt;/code&gt; dan direktori &lt;code&gt;&amp;quot;translation&amp;quot;&lt;/code&gt; di mana masing-masing berisi source code paket nya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ini sesuai dengan nama paketnya masing-masing yang telah terinstall pada contoh perintah &lt;code&gt;composer require&lt;/code&gt; kita sebelumnya.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-01-perintah-composer-composer-require-01.jpg&#34; alt=&#34;Composer Require 01&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kalau kita menggunakan perintah &lt;code&gt;create-project&lt;/code&gt; kan paket yang di-&lt;em&gt;download&lt;/em&gt; juga banyak ya,
otomatis isi direktori vendor juga akan banyak.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-15-struktur-direktori-composer-02.jpg&#34; alt=&#34;Struktur Direktori Composer 02&#34;&gt;&lt;/p&gt;
&lt;p&gt;Nah, jadi pada direktori &lt;code&gt;“vendor”&lt;/code&gt; ini lah depedency kita “menginap”. Semakin banyak &lt;em&gt;dependency&lt;/em&gt; di-&lt;em&gt;download&lt;/em&gt; oleh Composer, maka semakin besar juga ukuran direktori ini.
Direktori &lt;code&gt;“vendor”&lt;/code&gt; ini wajib kita ikutkan kemana-mana pada saat aplikasi kita gunakan. Karena sesuai dengan yang kita bahas di sesi pertama “judulnya : &lt;em&gt;perlu atau harus ada&lt;/em&gt;”.&lt;/p&gt;
&lt;p&gt;Ada pertanyaan : &lt;em&gt;“berarti kalau pakai Composer dan direktori vendor harus dibawa, aplikasi jadi besar dan berat donk?”&lt;/em&gt;&lt;br&gt;
Jawabnya : &lt;em&gt;“jadi besar? Iya. Jadi berat? Tidak”&lt;/em&gt;&lt;br&gt;
&lt;em&gt;“Kok tidak berat? Kan file yang dibawa banyak?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Karena Composer cukup pintar meng-efisien kan penggunaan autoload-nya agar kelas-kelas paket yang di-load oleh aplikasi, hanya kelas-kelas yang dibutuhkan saja.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saya belum tau persis cara kerjanya, tapi inilah jawaban yang saya simpulkan dari membaca beberapa referensi.&lt;/p&gt;
&lt;p&gt;Composer membuat semacam &lt;em&gt;classmap&lt;/em&gt; (peta kelas) untuk meng-efisien-kan penggunaan &lt;em&gt;autoload&lt;/em&gt;-nya. Jadi file dan kelas paket hanya di-load ketika kelasnya dipanggil saja.&lt;/p&gt;
&lt;p&gt;Contoh kasus : kita menggunakan paket &lt;strong&gt;shopping cart&lt;/strong&gt; dan paket &lt;strong&gt;terbilang&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kelas-kelas paket &lt;strong&gt;shopping cart&lt;/strong&gt; akan diakses pada saat fitur shopping cart digunakan (misal halaman katalog dan halaman produk) dan tidak digunakan pada saat kita berada di halaman pengelolaan order.&lt;/li&gt;
&lt;li&gt;kelas &lt;strong&gt;terbilang&lt;/strong&gt; hanya akan digunakan pada saat fungsi/fitur &lt;strong&gt;terbilang&lt;/strong&gt; digunakan/dipanggil, misal pada halaman Invoice Order. pada halaman lain kelas terbilang tidak akan di-load.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Mohon koreksi bila saya keliru paham tentang autoload ini.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nah, bicara tentang &lt;em&gt;autoload&lt;/em&gt; kelas, bagaimana caranya agar aplikasi yang kita buat dapat membaca
dan mengenali kelas-kelas yang ada di masing-masing paket yang di download via Composer tadi?
Kita langsung bahas file &lt;code&gt;autoload.php&lt;/code&gt; di dalam direktori &lt;code&gt;“vendor”&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-file-vendorautoloadphp&#34;&gt;2. File &amp;ldquo;vendor/autoload.php&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;File ini adalah file yang menghubungkan antara aplikasi kita dengan kelas-kelas yang di-&lt;em&gt;download&lt;/em&gt; oleh Composer.
File ini yang kita &lt;strong&gt;&amp;ldquo;require&amp;rdquo;&lt;/strong&gt; ke dalam aplikasi php kita. Contohnya seperti gambar ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-15-struktur-direktori-composer-03.jpg&#34; alt=&#34;Struktur Direktori Composer 03&#34;&gt;&lt;/p&gt;
&lt;p&gt;Jadi setelah file &lt;code&gt;autoload.php&lt;/code&gt; ini kita require ke dalam aplikasi kita, maka kelas-kelas yang ada di direktori &lt;code&gt;“vendor”&lt;/code&gt; dapat kita panggil berdasarkan “namespace”-nya.&lt;/p&gt;
&lt;p&gt;Dari tadi saya sebut-sebut soal “namespace”, namespace itu apa sih? Hmm penjelasannya panjang teman-teman, saya juga belum benar-benar paham.&lt;/p&gt;
&lt;p&gt;Intinya namespace itu untuk :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kita memanggil nama kelas yang sesuai fungsi paket yang kita panggil.&lt;/li&gt;
&lt;li&gt;Memastikan tidak konflik (dan pesan error) di aplikasi php kita akibat ada nama kelas (class) yang sama.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Artikel ini menjelaskan tentang namespace dengan “renyah”, mudah dicerna :)&lt;br&gt;
&lt;a href=&#34;http://id-laravel.com/post/mengenal-namespace-menjelajah-milyaran-galaksi&#34;&gt;http://id-laravel.com/post/mengenal-namespace-menjelajah-milyaran-galaksi&lt;/a&gt;,
silakan kunjungi kalau ingin tahu tentang “namespace”.&lt;/p&gt;
&lt;p&gt;Oke, kita simpulkan bahwa:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;direktori &lt;code&gt;“vendor”&lt;/code&gt; tempat Composer meletakkan paket-paket depedency di aplikasi kita.&lt;/li&gt;
&lt;li&gt;file &lt;code&gt;autoload.php&lt;/code&gt; di direktori &lt;code&gt;“vendor”&lt;/code&gt; adalah “pintu gerbang” komunikasi antara aplikasi kita dengan paket-paket yang ada di dalam direktori &lt;code&gt;“vendor”&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;3-file-composerjson&#34;&gt;3. File &amp;ldquo;composer.json&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Baik kita lanjukan ke file &lt;code&gt;composer.json&lt;/code&gt;
File &lt;code&gt;composer.json&lt;/code&gt;, adalah file yang dibuat oleh kita, atau oleh Composer untuk mencatat daftar paket yang “kita perlukan” untuk membuat project/aplikasi ini.
Jadi pada file ini kita mencatat/menulis untuk menambahkan atau mengurangi paket yang menjadi &lt;em&gt;dependency&lt;/em&gt; aplikasi kita.
File &lt;code&gt;composer.json&lt;/code&gt; yang terbentuk dari perintah &lt;code&gt;composer require&lt;/code&gt; dengan &lt;code&gt;composer create-project&lt;/code&gt; berbeda.&lt;/p&gt;
&lt;p&gt;Sebagai contoh kita gunakan paket &lt;code&gt;nesbot/carbon&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer require nesbot/carbon 1.20.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;akan menghasilkan file &lt;code&gt;composer.json&lt;/code&gt; seperti berikut ini :&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-15-struktur-direktori-composer-04.jpg&#34; alt=&#34;Struktur Direktori Composer 04&#34;&gt;&lt;/p&gt;
&lt;p&gt;Sedangkan pada perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer create-project nesbot/carbon project-saya 1.20.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;akan menghasilkan file &lt;code&gt;composer.json&lt;/code&gt; persis seperti source codenya di github (sesuai versi yang kita pilih) :&lt;br&gt;
&lt;a href=&#34;https://github.com/briannesbitt/Carbon/blob/1.20.0/composer.json&#34;&gt;https://github.com/briannesbitt/Carbon/blob/1.20.0/composer.json&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;4-file-composerlock&#34;&gt;4. File &amp;ldquo;composer.lock&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;File &lt;code&gt;composer.lock&lt;/code&gt;, adalah file yang dibuat oleh Composer untuk menyimpan detail paket-paket
yang “telah” di-&lt;em&gt;download&lt;/em&gt; ke dalam project/aplikasi kita.
Untuk perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer require nesbot/carbon 1.20.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;kita akan dapatkan file &lt;code&gt;composer.lock&lt;/code&gt; seperti berikut ini&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/nafiesl/fc2ea0aa3acbcb0f41b2da3cfa01f20e&#34;&gt;https://gist.github.com/nafiesl/fc2ea0aa3acbcb0f41b2da3cfa01f20e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kita lihat isi filenya, kita lihat pada :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;baris ke &lt;strong&gt;10&lt;/strong&gt; merupakan nama dan versi paket “nesbot/carbon”,&lt;/li&gt;
&lt;li&gt;baris ke &lt;strong&gt;57&lt;/strong&gt; merupakan nama dan versi paket “symfony/polyfill-mbsring”, dan&lt;/li&gt;
&lt;li&gt;baris ke &lt;strong&gt;116&lt;/strong&gt; merupakan nama dan versi paket “symfony/translation”.
Nah, dari isi file &lt;code&gt;composer.lock&lt;/code&gt; inilah perintah &lt;code&gt;composer install&lt;/code&gt; tanpa ba.. bi.. bu.. lagi akan langsung menginstall paket yang dibutuhkan.&lt;/li&gt;
&lt;/ol&gt;
</description>
     </item>
   
     <item>
       <title>Perintah-perintah Composer: update</title>
       <link>https://blog.inweeks.com/composer/perintah-composer-update/</link>
       <pubDate>Tue, 04 Apr 2017 16:57:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/perintah-composer-update/</guid>
       <description>&lt;p&gt;Kali ini kita akan bahas tentang perintah &lt;strong&gt;&amp;ldquo;composer update&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;composer-update&#34;&gt;composer update&lt;/h2&gt;
&lt;p&gt;Perintah ini kita gunakan untuk salahs salah satu antara dua fungsi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;meng-”update” versi seluruh paket dependency di sebuah project/aplikasi mengacu pada file &lt;code&gt;composer.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;meng-install seluruh paket dependency jika belum ada folder &lt;code&gt;“vendor”&lt;/code&gt; mengacu pada file &lt;code&gt;composer.json&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Perintah :&lt;br&gt;
&lt;code&gt;composer update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Makna perintah :&lt;br&gt;
&lt;em&gt;&amp;ldquo;Composer, tolong update semua (versi) paket dependency untuk project ini sesuai dengan file &lt;code&gt;composer.json&lt;/code&gt; saya.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Secara umum perintah &lt;code&gt;composer update&lt;/code&gt; dan &lt;code&gt;composer install&lt;/code&gt; melakukan hal yang sama, tetapi ada sedikit perbedaan diantara keduanya. Apa perbedaan?&lt;/p&gt;
&lt;p&gt;Berikut perbedaan yang saya ketahui :&lt;/p&gt;
&lt;h4 id=&#34;composer-update-1&#34;&gt;Composer update&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Tidak mengacu pada/memperdulikan &lt;code&gt;composer.lock&lt;/code&gt;, hanya ke &lt;code&gt;composer.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Proses cenderung lebih lambat karena akan mengecek update versi paket ke packagist terlebih dahulu&lt;/li&gt;
&lt;li&gt;Dapat bekerja (meng-&lt;em&gt;”update&lt;/em&gt;) walaupun folder &lt;code&gt;“vendor”&lt;/code&gt; sudah ada dengan berisi paket lengkap&lt;/li&gt;
&lt;li&gt;jika Composer melihat di packagist ada versi terbaru dari paket yang sudah terinstall, maka Composer akan meng-&lt;em&gt;update&lt;/em&gt; paket ke versi terbarunya.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;composer-install&#34;&gt;Composer install&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Mengacu pada &lt;code&gt;composer.lock&lt;/code&gt; atau ke &lt;code&gt;composer.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Proses cenderung lebih cepat karena mengdownload paket sesuai file &lt;code&gt;composer.lock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dapat bekerja (meng-&lt;em&gt;install&lt;/em&gt;) dengan kondisi folder &lt;code&gt;“vendor”&lt;/code&gt; tidak ada, atau paket didalamnya tidak lengkap&lt;/li&gt;
&lt;li&gt;Jika sudah ada file &lt;code&gt;composer.lock&lt;/code&gt;, Composer tidak mengecek versi baru, tetapi langsung menginstall sesuai versi paket yang ada pada file &lt;code&gt;composer.lock&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Baik itu tadi perbedaan antara perintah &lt;code&gt;install&lt;/code&gt; dengan perintah &lt;code&gt;update&lt;/code&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Perintah-perintah Composer: install</title>
       <link>https://blog.inweeks.com/composer/perintah-composer-install/</link>
       <pubDate>Mon, 03 Apr 2017 14:13:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/perintah-composer-install/</guid>
       <description>&lt;p&gt;Pada materi-materi sebelumnya perihal perintah Composer, kita sudah membahas : &lt;code&gt;require&lt;/code&gt; dan &lt;code&gt;create-project&lt;/code&gt;, kali ini kita akan bahas tentang perintah &lt;strong&gt;&amp;ldquo;composer install&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;composer-install&#34;&gt;composer install&lt;/h2&gt;
&lt;p&gt;Perintah ini digunakan untuk menginstall seluruh paket &lt;em&gt;dependency&lt;/em&gt; dari sebuah project/aplikasi mengacu pada file &lt;code&gt;composer.lock&lt;/code&gt; atau &lt;code&gt;composer.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sedikit gambaran :&lt;br&gt;
File &lt;code&gt;composer.lock&lt;/code&gt;, adalah file yang dibuat oleh Composer untuk menyimpan detail paket-paket yang “telah” didownload oleh Composer di project/aplikasi ini.&lt;/p&gt;
&lt;p&gt;File &lt;code&gt;composer.json&lt;/code&gt;, adalah file yang dibuat oleh kita, atau oleh Composer untuk mencatat daftar paket yang “kita perlukan” untuk membuat project/aplikasi ini.&lt;/p&gt;
&lt;p&gt;Kita akan bahas lebih lanjut tentang kedua file ini kemudian.&lt;/p&gt;
&lt;p&gt;Perintahnya adalah :&lt;br&gt;
&lt;code&gt;composer install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Makna perintah :&lt;br&gt;
&lt;em&gt;&amp;ldquo;Composer, tolong install semua &lt;em&gt;dependency&lt;/em&gt; yang saya butuhkan untuk project ini berdasarkan file &lt;code&gt;composer.lock&lt;/code&gt; atau &lt;code&gt;composer.json&lt;/code&gt;.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Proses yang dilakukan oleh perintah ini adalah :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Composer mengecek apakah ada file &lt;code&gt;composer.lock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jika &lt;strong&gt;ada&lt;/strong&gt; file &lt;code&gt;composer.lock&lt;/code&gt;, Composer akan segera menginstall seluruh paket yang terdaftar pada file tersebut.&lt;/li&gt;
&lt;li&gt;Jika &lt;strong&gt;tidak ada&lt;/strong&gt; file &lt;code&gt;composer.lock&lt;/code&gt;, maka Composer akan melihat daftar paket pada file &lt;code&gt;composer.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Composer mengecek kembali seluruh &lt;em&gt;dependency&lt;/em&gt; dari paket yang ada pada file &lt;code&gt;composer.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Jika tidak ada masalah dengan spesifikasi PHP kita, maka Composer akan menginstall seluruh paket dengan &lt;em&gt;dependency&lt;/em&gt;-nya.&lt;/li&gt;
&lt;li&gt;Seluruh paket yang terinstall akan menghuni direktori &lt;code&gt;“vendor”&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah kapan kita menggunakan perintah &lt;code&gt;composer install&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Ada beberapa syarat atau kondisi dimana perintah &lt;code&gt;composer install&lt;/code&gt; dapat bekerja:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tidak ada direktori &lt;code&gt;“vendor”&lt;/code&gt; (pada direktori yang sedang digunakan)&lt;/li&gt;
&lt;li&gt;Salah satu (direktori) paket di dalam direktori &lt;code&gt;“vendor”&lt;/code&gt; terhapus/hilang/belum ada&lt;/li&gt;
&lt;li&gt;terdapat file &lt;code&gt;composer.lock&lt;/code&gt; (opsional)&lt;/li&gt;
&lt;li&gt;terdapat file &lt;code&gt;composer.json&lt;/code&gt; (wajib ada)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Salah satu keuntungan menggunakan Composer dengan perintah &lt;code&gt;composer install&lt;/code&gt; adalah yang nomor 2, Composer dengan &amp;ldquo;pintar&amp;rdquo; memeriksa keberadaan paket yang “seharusnya ada” di dalam project kita.&lt;/p&gt;
&lt;p&gt;Karena sekali lagi, pekerjaannya Composer adalah me-&lt;em&gt;manage dependency&lt;/em&gt; paket-paket dari packagist yang digunakan dalam project kita.&lt;/p&gt;
&lt;p&gt;Nah jadi seperti itu penggunaan perintah &lt;code&gt;composer install&lt;/code&gt;. &lt;strong&gt;Kesimpulannya&lt;/strong&gt;, perintah &lt;code&gt;composer install&lt;/code&gt; akan bekerja jika :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ada file &lt;code&gt;composer.json&lt;/code&gt; dan &lt;em&gt;dependency&lt;/em&gt; kita daftarkan dengan benar&lt;/li&gt;
&lt;li&gt;Ada file &lt;code&gt;composer.lock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Folder &lt;code&gt;“vendor”&lt;/code&gt; belum ada&lt;/li&gt;
&lt;li&gt;Atau direktori &lt;code&gt;“vendor”&lt;/code&gt; ada, tetapi direktori paket di dalamnya tidak lengkap/hilang/terhapus.&lt;/li&gt;
&lt;/ol&gt;
</description>
     </item>
   
     <item>
       <title>Perintah-perintah Composer: create-project</title>
       <link>https://blog.inweeks.com/composer/perintah-composer-create-project/</link>
       <pubDate>Sun, 02 Apr 2017 11:57:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/perintah-composer-create-project/</guid>
       <description>&lt;p&gt;Pada &lt;a href=&#34;https://blog.inweeks.com/composer/perintah-composer-require/&#34;&gt;materi sebelumnya&lt;/a&gt;
kita sudah bahas perintah Composer, yaitu : &lt;code&gt;require&lt;/code&gt;, kali ini kita akan bahas tentang perintah &lt;strong&gt;&amp;ldquo;composer create-project&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;composer-create-project&#34;&gt;composer create-project&lt;/h2&gt;
&lt;p&gt;Perintah ini digunakan untuk membuat sebuah project baru dengan menggunakan source code paket yang kita panggil.&lt;/p&gt;
&lt;p&gt;Jadi struktur perintahnya:&lt;br&gt;
&lt;code&gt;composer create-project “nama-paket” “nama-folder” “versi-paket”&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Contoh perintah :&lt;br&gt;
&lt;code&gt;composer create-project nesbot/carbon project-saya 1.20.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Makna perintah :&lt;br&gt;
&lt;em&gt;&amp;ldquo;Composer, tolong buatkan saya project baru dalam folder &lt;code&gt;project-saya&lt;/code&gt; dengan menggunakan source code dari paket &lt;code&gt;nesbot/carbon&lt;/code&gt; versi &lt;code&gt;1.20.0&lt;/code&gt;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pada dasarnya pada perintah ini, Composer melakukan clone source code dari repository paket yang bersangkutan (dari github), dan meng-&lt;em&gt;install&lt;/em&gt; seluruh dependensi dari paket tersebut. Sebagai contoh kita ingin membuat project menggunakan source code dari paket &lt;code&gt;nesbot/carbon&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jika perintah tersebut dieksekusi, maka akan tampil proses seperti gambar ini:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-02-perintah-composer-composer-create-project-01.jpg&#34; alt=&#34;Composer Create Project 01&#34;&gt;&lt;/p&gt;
&lt;p&gt;Nah dari gambar tersebut kita lihat perbedaan yang signifikan antara perintah &lt;code&gt;require&lt;/code&gt; dengan &lt;code&gt;create-project&lt;/code&gt;.
Ternyata dependency paket yang di-&lt;em&gt;download&lt;/em&gt; oleh Composer lebih banyak.&lt;/p&gt;
&lt;p&gt;Pada perintah ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Composer membuat sebuah folder &lt;code&gt;project-saya&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Composer meng-&lt;em&gt;install&lt;/em&gt;/men-&lt;em&gt;download&lt;/em&gt; source code paket &lt;code&gt;nesbot/carbon&lt;/code&gt; ke dalam folder &lt;code&gt;project-saya&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Composer men-&lt;em&gt;download&lt;/em&gt; seluruh dependency dari paket&lt;/li&gt;
&lt;li&gt;Composer juga men-&lt;em&gt;download&lt;/em&gt; seluruh dependency dari paket yang digunakan saat source code ini dibuat, dalam kasus ini adalah paket “phpunit/phpunit”.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jika kita tengok di halaman packagist, bisa di lihat pada bagian &lt;code&gt;require-dev&lt;/code&gt; di sana kelihatan paket &lt;code&gt;phpunit/phpunit&lt;/code&gt; yang menjadi dependency untuk kebutuhan development paket &lt;code&gt;nesbot/carbon&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-01-perintah-composer-composer-require-02.jpg&#34; alt=&#34;Composer Create Project 02&#34;&gt;&lt;/p&gt;
&lt;p&gt;hmm&amp;hellip; oke, Jadi dari sini kita bisa melihat bahwa perintah &lt;code&gt;create-project&lt;/code&gt; berguna jika kita ingin
menggunakan source code paket sebagai starting point dari project yang akan kita garap.
Umumnya perintah &lt;code&gt;create-project&lt;/code&gt; ini kita gunakan untuk membuat project dari sebuah framework.
Misalkan : symfony, codeigniter, laravel, dan slim.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Perintah-perintah Composer: require</title>
       <link>https://blog.inweeks.com/composer/perintah-composer-require/</link>
       <pubDate>Sat, 01 Apr 2017 11:57:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/perintah-composer-require/</guid>
       <description>&lt;p&gt;Pada materi ini (dan beberapa materi berikutnya) kita akan bahas perintah-perintah umum yang sering digunakan pada composer, yaitu :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;require&lt;/li&gt;
&lt;li&gt;create-project&lt;/li&gt;
&lt;li&gt;install, dan&lt;/li&gt;
&lt;li&gt;update&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Perintah-perintah pada Composer dapat kita lakukan melalui &lt;strong&gt;terminal&lt;/strong&gt; (pada linux dan mac) atau &lt;strong&gt;command prompt&lt;/strong&gt; atau &lt;strong&gt;powershell&lt;/strong&gt; (pada windows).&lt;/p&gt;
&lt;h2 id=&#34;composer-create-project&#34;&gt;composer create-project&lt;/h2&gt;
&lt;p&gt;Perintah ini kita gunakan untuk menambahkan sebuah paket ke dalam project kita, dan menjadikan paket tersebut sebagai dependensi dari project kita.&lt;/p&gt;
&lt;p&gt;Struktur perintahnya :&lt;br&gt;
&lt;code&gt;composer require nama-paket versi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Contoh perintahnya :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer require nesbot/carbon 1.20.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Makna perintah :&lt;br&gt;
&lt;em&gt;&amp;ldquo;Composer, saya memerlukan paket &lt;code&gt;nesbot/carbon&lt;/code&gt; versi &lt;code&gt;1.20.0&lt;/code&gt; dalam project saya.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Di sini kita ambil contoh sebuah paket bernama &lt;strong&gt;“nesbot/carbon”&lt;/strong&gt;. Sebagai info, paket ini adalah paket ekstensi atau turunan dari kelas DateTime pada PHP. Paket ini dapat membantu kita dalam mengoperasikan tanggal dan waktu untuk dalam aplikasi PHP.&lt;/p&gt;
&lt;p&gt;Teman-teman dapat melihat manfaat dan dokumentasi paket ini:&lt;br&gt;
Dokumentasi &lt;a href=&#34;http://carbon.nesbot.com/docs&#34;&gt;http://carbon.nesbot.com/docs&lt;/a&gt;&lt;br&gt;
Source code &lt;a href=&#34;https://github.com/briannesbitt/Carbon&#34;&gt;https://github.com/briannesbitt/Carbon&lt;/a&gt;&lt;br&gt;
Packagist &lt;a href=&#34;https://packagist.org/packages/nesbot/carbon&#34;&gt;https://packagist.org/packages/nesbot/carbon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sebelum kembali bahas &lt;code&gt;composer require&lt;/code&gt;, sedikit gambaran tentang sebuah paket atau library pada Composer/Packagist.&lt;br&gt;
Setiap nama paket memiliki format &lt;code&gt;nama-vendor/nama-paket&lt;/code&gt;, kalau diibaratkan sebuah buku, formatnya serupa &lt;code&gt;pengarang/nama-buku&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Nah, jadi pada paket yang barusan kita gunakan &lt;code&gt;nesbot/carbon&lt;/code&gt;, &lt;code&gt;nesbot&lt;/code&gt; adalah nama atau alias si pembuat atau vendornya, sedangkan &lt;code&gt;carbon&lt;/code&gt; adalah nama paketnya.&lt;/p&gt;
&lt;p&gt;Ok kembali bahas perintah &lt;code&gt;composer require&lt;/code&gt;. Jadi kalau kita jalankan, maka tampilannya akan seperti ini:
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-01-perintah-composer-composer-require-01.jpg&#34; alt=&#34;Composer Require 01&#34;&gt;&lt;/p&gt;
&lt;p&gt;Tahap prosesnya kira-kira seperti ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ketika kita mengetikkan &lt;code&gt;composer require nesbot/carbon 1.20.0&lt;/code&gt; dan tekan enter,
&lt;ul&gt;
&lt;li&gt;Composer membuat file &lt;code&gt;composer.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Composer membaca detail paket yang bersangkutan pada packagist dan melihat dependecy paket tersebut&lt;/li&gt;
&lt;li&gt;pada tahap ini, Composer juga membaca spesifikasi PHP pada PC kita&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Composer menginstall/men-&lt;em&gt;download&lt;/em&gt; paket-paket &lt;em&gt;dependency&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;paket-paket dependecy akan di-&lt;em&gt;download&lt;/em&gt; terlebih dahulu&lt;/li&gt;
&lt;li&gt;paket yang kita &lt;code&gt;“require”&lt;/code&gt; akan di-&lt;em&gt;download&lt;/em&gt; setelah dependecynya selesai di-&lt;em&gt;download&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Composer membuat file &lt;code&gt;composer.lock&lt;/code&gt; dan file-file &lt;code&gt;autoload.php&lt;/code&gt; yang akan me-&lt;em&gt;load&lt;/em&gt; kelas-kelas yang ada di seluruh paket.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-01-perintah-composer-composer-require-02.jpg&#34; alt=&#34;Composer Require 02&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bisa kita lihat pada gambar tersebut, untuk menginstall paket &lt;code&gt;nesbot/carbon&lt;/code&gt; ternyata ada &lt;strong&gt;dua paket lain&lt;/strong&gt; yang di-&lt;em&gt;download&lt;/em&gt; oleh Composer.&lt;/p&gt;
&lt;p&gt;Mengapa ada dua paket tambahan? Dari mana asalnya kedua paket tersebut?&lt;/p&gt;
&lt;p&gt;Kalau kita lihat di &lt;a href=&#34;https://packagist.org/packages/nesbot/carbon&#34;&gt;https://packagist.org/packages/nesbot/carbon&lt;/a&gt;, ternyata dia memiliki 1 dependensi paket, yaitu &lt;code&gt;symfony/translation&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Lalu satu paket lagi dari mana? oke kita lihat di &lt;a href=&#34;https://packagist.org/packages/symfony/translation&#34;&gt;&lt;strong&gt;packagist symfony/translation&lt;/strong&gt;&lt;/a&gt;, paket ini memiliki satu &lt;em&gt;dependency&lt;/em&gt; paket lain, yaitu &lt;code&gt;symfony/polyfill-mbstring&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-01-perintah-composer-composer-require-03.jpg&#34; alt=&#34;Composer Require 03&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oke, kita coba lihat lagi apakah paket &lt;code&gt;symfony/polyfill-mbstring&lt;/code&gt; punya &lt;em&gt;dependency&lt;/em&gt; lagi? kita lihat di &lt;a href=&#34;https://packagist.org/packages/symfony/polyfill-mbstring&#34;&gt;&lt;strong&gt;packagist symfony/translation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-04-01-perintah-composer-composer-require-04.jpg&#34; alt=&#34;Composer Require 04&#34;&gt;&lt;/p&gt;
&lt;p&gt;Pada gambar di atas &lt;code&gt;symfony/polyfill-mbstring&lt;/code&gt; tidak memiliki &lt;em&gt;dependency&lt;/em&gt; ke paket lain.&lt;/p&gt;
&lt;p&gt;Nah, ini rupanya cocok dengan pembahasan kita pada
&lt;a href=&#34;https://blog.inweeks.com/composer/berkenalan-dengan-composer/&#34;&gt;artikel perkenalan Composer&lt;/a&gt;,
di mana sebuah paket bisa memiliki &lt;em&gt;dependency&lt;/em&gt;, dan &lt;em&gt;dependency&lt;/em&gt;-nya juga punya &lt;em&gt;dependency&lt;/em&gt;. Begitu seterusnya.&lt;/p&gt;
&lt;p&gt;Oke sampai disini kita mengerti dua hal:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Perintah &lt;code&gt;composer require&lt;/code&gt;, kita meminta Composer untuk menginstall/men-&lt;em&gt;download&lt;/em&gt; sebuah paket agar menjadi &lt;em&gt;dependency&lt;/em&gt; project/aplikasi kita.&lt;/li&gt;
&lt;li&gt;Sesuai dengan analogi yang kita pahami bersama pada
&lt;a href=&#34;https://blog.inweeks.com/composer/berkenalan-dengan-composer/&#34;&gt;materi pada perkenalan dengan Composer&lt;/a&gt;,
bahwa Composer terbukti memang benar &lt;strong&gt;“Dependency Manager”&lt;/strong&gt; sehingga untuk dapat menggunakan satu paket/library, kita tidak perlu repot-repot men-&lt;em&gt;download&lt;/em&gt; paket dan depedencynya secara manual.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dan sedikit kita mengingat
&lt;a href=&#34;https://blog.inweeks.com/composer/cara-kerja-composer/&#34;&gt;materi pada cara kerja Composer&lt;/a&gt;,
bahwa :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Seluruh paket yang diinstall oleh Composer akan “menghuni” folder bernama &lt;code&gt;“vendor”&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ya, semua paket yang di-&lt;em&gt;download&lt;/em&gt; oleh Composer akan diletakkan dalam folder &lt;code&gt;“vendor”&lt;/code&gt;, kita akan bahas tentang folder vendor pada artikel lainnya.&lt;/p&gt;
&lt;p&gt;Selanjutnya kita akan membahas tentang perintah berikutnya, yaitu
&lt;a href=&#34;https://blog.inweeks.com/composer/perintah-composer-create-project/&#34;&gt;&lt;strong&gt;composer create-project&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Mapping Subdomain ke VPS</title>
       <link>https://blog.inweeks.com/deploy/mapping-subdomain-ke-vps/</link>
       <pubDate>Tue, 21 Mar 2017 14:10:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/deploy/mapping-subdomain-ke-vps/</guid>
       <description>&lt;p&gt;Pada artikel ini kita akan melakukan &lt;em&gt;mapping&lt;/em&gt; agar &lt;em&gt;subdomain&lt;/em&gt; dari sebuah website (dengan shared hosting) dapat digunakan pada server terpisah (dalam hal ini VPS).&lt;/p&gt;
&lt;h3 id=&#34;kondisi&#34;&gt;Kondisi&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nameserver&lt;/strong&gt; Domain utama (misal: &lt;strong&gt;nafies.id&lt;/strong&gt;) sudah diset ke hosting utama (shared hosting dengan cpanel).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Domain utama telah online (optional).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPS telah dibuat dengan sebuah IP Address (misal: 45.32.113.217)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Web server pada VPS telah aktif (jika diakses melalui http://45.32.113.217)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-01.jpg&#34; alt=&#34;VPS dengan IP Address&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;langkah-yang-dilakukan&#34;&gt;Langkah yang dilakukan&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Login ke cpanel dari domain utama (shared hosting)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buat subdomain baru (vultr.nafies.id)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-02.jpg&#34; alt=&#34;Buat Subdomain Cpanel&#34;&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-03.jpg&#34; alt=&#34;Buat Subdomain&#34;&gt;
&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-04.jpg&#34; alt=&#34;Subdomain&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kemudian cari dan klik menu &lt;strong&gt;Advanced Zone Editor&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-05.jpg&#34; alt=&#34;Advanced Zone Editor&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pilih domain utama (contoh.com)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-06.jpg&#34; alt=&#34;Pilih Domain untuk pengaturan Subdomain&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada tabel &lt;strong&gt;Zone File Records&lt;/strong&gt;, cari nama subdomain yang telah dibuat tadi (vultr.nafies.id)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;Edit&lt;/strong&gt; pada &lt;em&gt;vultr.nafies.id&lt;/em&gt;, muncul kotak dialog untuk &lt;em&gt;Edit Record&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ubah &lt;strong&gt;Address&lt;/strong&gt; menjadi IP Address VPS yang dituju &lt;strong&gt;45.32.113.217&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Klik &lt;strong&gt;Edit Record&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-07.jpg&#34; alt=&#34;Edit Record Subdomain&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lakukan &lt;strong&gt;Edit Record&lt;/strong&gt; juga untuk subdomain &lt;em&gt;&lt;a href=&#34;https://www.vultr.nafies.id&#34;&gt;www.vultr.nafies.id&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Selesai pengaturan sampai disini.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coba akses VPS melalui alamat baru (&lt;a href=&#34;http://subdomain.contoh.com&#34;&gt;http://subdomain.contoh.com&lt;/a&gt;) melalui browser.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-21-mapping-subdomain-ke-vps-08.jpg&#34; alt=&#34;Mapping Subdomain ke VPS&#34;&gt;&lt;/p&gt;
&lt;p&gt;Seharusnya akan tampil halaman yang sama dengan VPS yang diakses dengan IP Addressnya (http://45.32.113.217).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jika halaman yang sama belum muncul, mungkin proses propagasi (pemindahan) belum selesai, umumnya memakan waktu maksimal 1x24 jam.
Pada kasus saya, proses propagasi kurang dari 1 menit, alamat subdomain sudah menampilkan halaman web pada VPS.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Install Composer</title>
       <link>https://blog.inweeks.com/composer/cara-install-composer/</link>
       <pubDate>Thu, 16 Mar 2017 14:10:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/cara-install-composer/</guid>
       <description>&lt;p&gt;Minggu lalu kita membahas tentang
&lt;a href=&#34;https://blog.inweeks.com/composer/cara-kerja-composer/&#34;&gt;Cara Kerja Composer&lt;/a&gt;,
mudah-mudahan teman-teman sudah memahami fungsi dan manfaatnya. Nah, kali ini kita akan membahas tentang &lt;strong&gt;Cara Install Composer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Di sini kita akan membahas Cara install Composer menggunakan Ubuntu 14.04 atau Linux Mint 17.3 Rosa (yang saat ini saya gunakan pada Laptop saya).&lt;/p&gt;
&lt;h2 id=&#34;menginstall-composer-secara-local&#34;&gt;Menginstall Composer secara Local&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-16-cara-install-composer-01.png&#34; alt=&#34;Cara Install Composer direktori-install-composer&#34;&gt;&lt;/p&gt;
&lt;p&gt;Buka Terminal, kemudian buat direktori dan cd ke direktori tempat composer akan didownload, misal :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd ~/Downloads
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mkdir composer &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd composer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kemudian jalankan perintah berikut untuk mendownload script installer Composer :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php -r &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;copy(&amp;#39;https://getcomposer.org/installer&amp;#39;, &amp;#39;composer-setup.php&amp;#39;);&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Akan terdownload installer composer dalam bentuk file php : &lt;code&gt;composer-setup.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Selanjutnya pada direktori yang sama, jalankan perintah berikut untuk memverifikasi hash file yang telah di-download :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php -r &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;if (hash_file(&amp;#39;SHA384&amp;#39;, &amp;#39;composer-setup.php&amp;#39;) === &amp;#39;669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410&amp;#39;) { echo &amp;#39;Installer verified&amp;#39;; } else { echo &amp;#39;Installer corrupt&amp;#39;; unlink(&amp;#39;composer-setup.php&amp;#39;); } echo PHP_EOL;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jika muncul pesan “&lt;strong&gt;Installer verified&lt;/strong&gt;”, maka file tersebut valid/aman.&lt;/p&gt;
&lt;p&gt;Jalankan perintah berikutnya untuk menginstall Composer :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php composer-setup.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tunggu hingga proses selesai.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-16-cara-install-composer-02.png&#34; alt=&#34;Cara Install Composer verifikasi-setup-install-composer&#34;&gt;&lt;/p&gt;
&lt;p&gt;Setelah berhasil, kita dapat mengecek versi composer dengan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php composer.phar -V
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Composer version 1.4.1 2017-03-10 09:29:45
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baik setelah berhasil menginstall Composer, kita hapus file installer (&lt;strong&gt;composer-setup.php&lt;/strong&gt;) dengan perintah ini :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php -r &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;unlink(&amp;#39;composer-setup.php&amp;#39;);&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sampai disini proses instalasi composer selesai.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Catatan :&lt;br&gt;
Langkah ini sesuai dengan petunjung pada website Composer :&lt;br&gt;
Kunjungi &lt;a href=&#34;https://getcomposer.org/download&#34;&gt;https://getcomposer.org/download&lt;/a&gt;{:target:=&amp;quot;_blank&amp;quot;}.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;menginstall-composer-secara-global&#34;&gt;Menginstall Composer secara global&lt;/h2&gt;
&lt;p&gt;Composer yang diinstall &lt;strong&gt;secara global&lt;/strong&gt; memungkinkan kita mengoperasikan composer cukup dengan: &lt;code&gt;composer nama-perintah&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# contoh :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer install
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# sebelumnya menggunakan &amp;#39;php composer.phar nama-perintah&amp;#39; pada yang local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Untuk menginstall Composer secara global, proses awalnya sama persis dengan langkah di atas.
Kemudian teman-teman bisa lihat dokumentasi di :&lt;br&gt;
&lt;a href=&#34;https://getcomposer.org/doc/00-intro.md#globally&#34;&gt;https://getcomposer.org/doc/00-intro.md#globally&lt;/a&gt;{:target:=&amp;quot;_blank&amp;quot;}.&lt;/p&gt;
&lt;p&gt;Sesuai dengan petunjuk pada web tersebut, kita pindahkan file &lt;code&gt;composer.phar&lt;/code&gt; tadi ke direktori &lt;code&gt;/usr/local/bin&lt;/code&gt; dengan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo mv composer.phar /usr/local/bin/composer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Baik sekarang kita jalankan composer, atau cek versi composer dengan perintah :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ composer -V
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Composer version 1.4.1 2017-03-10 09:29:45
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://blog.inweeks.com/images/blogs/2017-03-16-cara-install-composer-04.png&#34; alt=&#34;Cara Install Composer cek-versi-global-install-composer&#34;&gt;&lt;/p&gt;
&lt;p&gt;Selesai, sampai disini kita sudah berhasil menginstall composer secara global dan dapat digunakan untuk project kita.&lt;/p&gt;
&lt;h2 id=&#34;perbedaan-composer-local-dengan-global&#34;&gt;Perbedaan Composer local dengan global&lt;/h2&gt;
&lt;p&gt;Memangnya apa sih perbedaan composer yang diinstall secara local dengan yang global?&lt;/p&gt;
&lt;h3 id=&#34;composer-local&#34;&gt;Composer local&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Composer hanya dapat digunakan dalam direktori yang sama.&lt;/li&gt;
&lt;li&gt;Jika ingin digunakan untuk direktori atau project lain, maka file &lt;b&gt;composer.phar &lt;/b&gt;harus di-copy ke project yang membutuhkan.&lt;/li&gt;
&lt;li&gt;Jadi setiap project harus ada file/aplikasi &lt;b&gt;composer &lt;/b&gt;atau &lt;b&gt;composer.phar&lt;/b&gt;-nya.&lt;/li&gt;
&lt;li&gt;Jika extensi &lt;strong&gt;.phar&lt;/strong&gt; dihapus, maka composer dapat digunakan tanpa perintah php, seperti sebelumnya “&lt;strong&gt;php composer.phar&lt;/strong&gt;” menjadi “&lt;strong&gt;composer&lt;/strong&gt;” saja.&lt;/li&gt;
&lt;li&gt;Untuk update composer harus dilakukan satu persatu setiap direktori/project.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;composer-global&#34;&gt;Composer global&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Cukup satu file/aplikasi composer untuk digunakan pada semua project/direktori.&lt;/li&gt;
&lt;li&gt;Untuk mengupdate composer, cukup satu perintah: &lt;code&gt;composer self-update&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bagaimana untuk teman-teman yang menggunakan windows?&lt;/p&gt;
&lt;p&gt;Teman-teman bisa gunakan installer composer yang dapat didownload melalui halaman ini:
&lt;a href=&#34;https://getcomposer.org/doc/00-intro.md#installation-windows&#34;&gt;https://getcomposer.org/doc/00-intro.md#installation-windows&lt;/a&gt;{:target:=&amp;quot;_blank&amp;quot;}.&lt;/p&gt;
&lt;p&gt;Demikian cara menginstall composer secara local dan global, mudah-mudahan bermanfaat.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Install Laravel</title>
       <link>https://blog.inweeks.com/laravel/cara-install-laravel/</link>
       <pubDate>Tue, 07 Mar 2017 14:10:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/laravel/cara-install-laravel/</guid>
       <description>&lt;p&gt;Bagi seorang developer yang terbiasa dengan &amp;ldquo;tinggal download&amp;rdquo; saat menginstall sebuah framework, menginstall Laravel mungkin menjadi agak merepotkan, karena:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Harus terhubung Internet&lt;/strong&gt;. Secara &lt;em&gt;default&lt;/em&gt;, Laravel tidak menyediakan file ZIP yang &amp;ldquo;tinggal download&amp;rdquo; dan &amp;ldquo;tinggal extract&amp;rdquo; untuk memulai sebuah project baru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menggunakan Composer&lt;/strong&gt;. Setiap kali menginstall Laravel baru, kita harus memiliki Composer untuk menginstall Laravel dan dependensinya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Baik, ada beberapa cara mengintall framework Laravel untuk project baru:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menggunakan &amp;lsquo;composer create-project&amp;rsquo;&lt;/li&gt;
&lt;li&gt;Menggunakan Laravel Installer&lt;/li&gt;
&lt;li&gt;Mendownload Source Rilis Terbaru Laravel&lt;/li&gt;
&lt;li&gt;Mendownload Source dari Github Release Laravel&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pada ke-empat cara tersebut, semuanya tetap memerlukan &lt;strong&gt;&lt;a href=&#34;https://getcomposer.org&#34;&gt;Composer&lt;/a&gt;&lt;/strong&gt; dan &lt;strong&gt;internet&lt;/strong&gt; untuk menginstall framework Laravel hingga dapat memulai project.&lt;/p&gt;
&lt;p&gt;Ingat untuk menjalankan langkah-langkah install framework Laravel, composer sudah harus terinstall pada PC teman-teman, jika belum ada composer, silakan &lt;a href=&#34;https://getcomposer.org/download&#34;&gt;install dulu&lt;/a&gt;.
Jika teman-teman belum tau apa itu Composer, silakan baca &lt;a href=&#34;https://naflut.wordpress.com/2017/02/01/pengenalan-composer-analogi-dependency/&#34;&gt;pengenalan composer&lt;/a&gt;
dan &lt;a href=&#34;https://naflut.wordpress.com/2017/02/16/cara-kerja-composer-dan-lumbung-paket-packagist-org/&#34;&gt;cara kerja composer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Baik, Kita bahas satu persatu.&lt;/p&gt;
&lt;p&gt;Catatan sebelum memulai:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pastikan semua perintah terminal yang kita lakukan berada pada direktori web localhost kita
(misal: &lt;strong&gt;C:\xampp\htdocs&lt;/strong&gt;, atau &lt;strong&gt;/var/www/html&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Pada tutorial ini saya menggunakan Ubuntu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-menggunakan-composer-create-project&#34;&gt;1. Menggunakan &amp;lsquo;composer create-project&amp;rsquo;&lt;/h2&gt;
&lt;p&gt;Untuk menginstall Framework Laravel menggunakan &lt;strong&gt;composer create-project&lt;/strong&gt;, lakukan langkah-langkah berikut:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Berikan perintah berikut pada terminal :
&lt;code&gt;$ composer create-project Laravel/Laravel nama-direktori-project&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tunggu hingga proses installasi selesai. Durasi proses ini bergantung pada kecepatan koneksi internet yang kita gunakan.&lt;/li&gt;
&lt;li&gt;Setelah proses selesai, kita masuk ke direktori &lt;strong&gt;nama-direktori-project&lt;/strong&gt;
&lt;code&gt;$ cd nama-direktori-project&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Untuk memeriksa apakah Laravel terinstall dengan benar, coba perintah berikut:
&lt;code&gt;$ php artisan -V&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Aaka akan muncul informasi &lt;code&gt;Laravel Framework 5.4.15&lt;/code&gt;
&lt;em&gt;(Versi terbaru saat artikel ini ditulis)&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Oke dengan cara install yang pertama ini, saya menyimpulkan kelebihan dan kekurangannya :&lt;/p&gt;
&lt;h5 id=&#34;kelebihan&#34;&gt;Kelebihan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Cukup satu perintah terminal&lt;/li&gt;
&lt;li&gt;Dapat menentukan versi laravel mana yang ingin digunakan/di-download&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;kekurangan&#34;&gt;Kekurangan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Terkadang proses cukup lama, memakan waktu beberapa menit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-menggunakan-laravel-installer&#34;&gt;2. Menggunakan Laravel Installer&lt;/h2&gt;
&lt;p&gt;Laravel installer adalah aplikasi yang dibuat oleh pengarang laravel agar kita dapat menginstall laravel dengan perintah :
&lt;code&gt;$ laravel new nama_direktori&lt;/code&gt;. Ok, kita akan bahas sama-sama.&lt;/p&gt;
&lt;p&gt;Untuk dapat menggunakan cara ini, kita akan menginstall sebuah paket dari composer yang bernama &lt;strong&gt;Laravel/installer&lt;/strong&gt; pada PC atau laptop kita. Tahapannya sebagai berikut :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dengan menggunakan terminal, berikan perintah berikut :
&lt;code&gt;$ composer global require &amp;quot;Laravel/installer&amp;quot;&lt;/code&gt;&lt;br&gt;
Dengan perintah ini, composer akan mendownload paket &lt;strong&gt;Laravel/installer&lt;/strong&gt; secara global dalam PC kita, karena paket ini akan kita gunakan dengan terminal.&lt;/li&gt;
&lt;li&gt;Baik setelah selesai, kita menambahkan sebuah script &lt;strong&gt;export PATH&lt;/strong&gt; pada file &lt;code&gt;~/.bashrc&lt;/code&gt;.
Tambahkan script berikut &lt;strong&gt;pada akhir&lt;/strong&gt; isi file:
&lt;code&gt;export PATH=&amp;quot;$PATH:$HOME/.composer/vendor/bin&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Simpan dan exit.&lt;/li&gt;
&lt;li&gt;Pada terminal, berikan perintah berikut :
&lt;code&gt;$ source ~/.bashrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jika tahap ini dijalankan dengan benar, seharusnya ketika kita berikan perintah berikut ke terminal :
&lt;code&gt;$ laravel -V&lt;/code&gt;
Akan menghasilkan informasi versi Laravel Installer :
&lt;code&gt;Laravel Installer version 1.3.3&lt;/code&gt; &lt;em&gt;(versi terbaru saat artikel ini dibuat)&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Oke dengan adanya &lt;strong&gt;Laravel Installer&lt;/strong&gt;, untuk menginstall project Laravel baru.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kita bisa berikan perintah:
&lt;code&gt;$ laravel new nama-direktori-project&lt;/code&gt; &lt;em&gt;(proses installasi laravel akan berjalan)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Ketika proses instalasi selesai, maka kita dapat &lt;strong&gt;cd&lt;/strong&gt; ke &lt;strong&gt;nama-direktori-project&lt;/strong&gt;, dan memberikan perintah :
&lt;code&gt;$ php artisan -V&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jika proses installasi berjalan dengan baik, perintah tersebut akan menghasilkan :
&lt;code&gt;Laravel Framework 5.4.15&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Artinya cara install Laravel yang kedua sudah selesai. Dengan menggunakan Laravel Installer, saya menyimpulkan kelebihan dan kekurangannya :&lt;/p&gt;
&lt;h5 id=&#34;kelebihan-1&#34;&gt;Kelebihan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Cukup satu perintah terminal&lt;/li&gt;
&lt;li&gt;Selalu men-download Laravel versi rilis terbaru&lt;/li&gt;
&lt;li&gt;Proses composer cenderung lebih cepat dari cara pertama&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;kekurangan-1&#34;&gt;Kekurangan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Perlu pengaturan awal sebelum mulai digunakan&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-mendownload-source-rilis-terbaru-laravel&#34;&gt;3. Mendownload Source Rilis Terbaru Laravel&lt;/h2&gt;
&lt;p&gt;Cara menginstall Laravel yang ketiga adalah dengan mendownload source code rilis terbaru framework Laravel.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download source framework Laravel dari url berikut:
&lt;code&gt;http://cabinet.Laravel.com/latest.zip&lt;/code&gt; atau &lt;a href=&#34;http://cabinet.Laravel.com/latest.zip&#34;&gt;klik disini&lt;/a&gt;.
Kita akan mendapatkan file &lt;code&gt;latest.zip&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pindahkan file tersebut ke dalam direktori project kita, kemudian &lt;strong&gt;extract&lt;/strong&gt; ke direktori &lt;strong&gt;nama-direktori-project&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pada terminal, &lt;strong&gt;cd&lt;/strong&gt; ke &lt;strong&gt;nama-direktori-project&lt;/strong&gt;, kemudian berikan perintah pada terminal :
&lt;code&gt;$ composer install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tunggu proses installasi hingga selesai. Pada langkah ini, proses installasi oleh composer cenderung lebih cepat, karena pada direktori project kita sudah ada file &lt;strong&gt;composer.lock&lt;/strong&gt;.
Sehingga composer tinggal menginstall seluruh paket yang ada pada file tersebut.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oke, proses instalasi oleh composer selesai, maka kita dapat langsung mencoba perintah :
&lt;code&gt;php artisan -V&lt;/code&gt;
Dan menghasilkan :
&lt;code&gt;Laravel Framework 5.4.15&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yah, walaupun awalnya kita &amp;ldquo;mengambil source&amp;rdquo; framework ini dengan cara men-download, kita tetap harus &lt;strong&gt;menggunakan composer&lt;/strong&gt; juga untuk menginstall paket-paket dependensinya.&lt;/p&gt;
&lt;h5 id=&#34;kelebihan-2&#34;&gt;Kelebihan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Proses composer cenderung lebih cepat dari cara pertama (karena sudah ada file &lt;strong&gt;composer.lock&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;kekurangan-2&#34;&gt;Kekurangan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Agak repot mendownload, dan extract ke direktori project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Okay&lt;/em&gt;, selanjutnya kita bahas cara keempat&lt;/p&gt;
&lt;h2 id=&#34;4-mendownload-source-dari-github-laravel&#34;&gt;4. Mendownload Source dari Github Laravel&lt;/h2&gt;
&lt;p&gt;Untuk cara install yang ini, berikut tahap instalasinya :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kunjungi halaman github dari Laravel &lt;strong&gt;&lt;a href=&#34;https://github.com/Laravel/Laravel&#34;&gt;https://github.com/Laravel/Laravel&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Klik link &lt;strong&gt;releases&lt;/strong&gt; atau &lt;a href=&#34;https://github.com/Laravel/Laravel/releases&#34;&gt;https://github.com/Laravel/Laravel/releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Klik icon/link &lt;code&gt;zip&lt;/code&gt; pada rilis versi terbaru Laravel untuk mendownload source code dengan format ZIP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extract&lt;/strong&gt; file zip tersebut pada direktori web project kita, misal ke direktori &lt;strong&gt;nama-direktori-project&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Buka terminal, kemudian &lt;code&gt;cd nama-direktori-project&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Kemudian berikan perintah pada terminal :
&lt;code&gt;composer install&lt;/code&gt; Tunggu hingga proses installasi selesai&lt;/li&gt;
&lt;li&gt;Setelah proses instalasi oleh composer selesai, kita coba perintah :
&lt;code&gt;php artisan -V&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Seharusnya muncul informasi : &lt;code&gt;Laravel Framework 5.4.15&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;kelebihan-3&#34;&gt;Kelebihan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Tidak ada&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;kekurangan-3&#34;&gt;Kekurangan&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Agak repot mendownload, dan extract ke direktori project&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;info-tambahan&#34;&gt;Info Tambahan&lt;/h3&gt;
&lt;p&gt;Sebenarnya untuk menginstall laravel pada project baru, kita dapat menduplikat direktori dari project yang lama,
selama paket-paket dependensi yang digunakan sudah sesuai (sama dengan project sebelumnya), maka ini bisa menjadi salah satu solusi.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Cara Kerja Composer</title>
       <link>https://blog.inweeks.com/composer/cara-kerja-composer/</link>
       <pubDate>Mon, 06 Mar 2017 14:10:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/cara-kerja-composer/</guid>
       <description>&lt;p&gt;Dengan &lt;a href=&#34;https://blog.inweeks.com/composer/berkenalan-dengan-composer/&#34;&gt;analogi kita sudah pahami mengenai &lt;em&gt;“Dependency”&lt;/em&gt;&lt;/a&gt;, lalu apa yang dilakukan oleh Composer berkaitan dengan &lt;em&gt;tagline&lt;/em&gt;-nya &lt;strong&gt;“Dependency Manager for PHP”&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Dari yang sudah kita ketahui sebelumnya, Composer adalah aplikasi yang berfungsi untuk men-&lt;em&gt;download&lt;/em&gt; paket-paket atau &lt;em&gt;library-library&lt;/em&gt; yang kita perlukan sebagai dependensi aplikasi kita. &lt;strong&gt;Bagaimana cara kerja Composer&lt;/strong&gt; untuk membantu kita?&lt;/p&gt;
&lt;h2 id=&#34;cara-kerja-composer&#34;&gt;Cara Kerja Composer&lt;/h2&gt;
&lt;p&gt;Sebelum men-&lt;em&gt;download&lt;/em&gt; &lt;em&gt;library-library&lt;/em&gt; yang kita perlukan, Composer akan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mengecek apakah &lt;em&gt;library-library&lt;/em&gt; ini memerlukan &lt;em&gt;library&lt;/em&gt; lain sebagai dependensinya?&lt;/li&gt;
&lt;li&gt;Mengecek versi PHP dan &lt;em&gt;module-module&lt;/em&gt; PHP yang diperlukan oleh &lt;em&gt;library-library&lt;/em&gt; tersebut.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Setelah kedua proses di atas, Composer mendownload &lt;em&gt;library-library&lt;/em&gt; tersebut ke dalam aplikasi/&lt;em&gt;project&lt;/em&gt; kita pada direktori &lt;code&gt;“vendor”&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Misalkan &lt;strong&gt;versi PHP&lt;/strong&gt; yang terinstall di PC kita &lt;strong&gt;tidak cocok dengan versi minimum&lt;/strong&gt; yang dibutuhkan oleh salah satu &lt;em&gt;library&lt;/em&gt;, maka Composer akan memberitahukan bahwa &amp;ldquo;spesifikasi minimum tidak terpenuhi&amp;rdquo;.
Atau ketika ada &lt;em&gt;module&lt;/em&gt; PHP yang diperlukan oleh salah satu &lt;em&gt;library&lt;/em&gt; belum terinstall atau &lt;em&gt;enabled&lt;/em&gt;, Composer juga akan memberitahukan dan menyarankan kita untuk menginstall/&lt;em&gt;enable&lt;/em&gt; &lt;em&gt;module&lt;/em&gt; terlebih dahulu.&lt;/p&gt;
&lt;p&gt;Jadi selain mengecek dependensi &lt;em&gt;library&lt;/em&gt;, Composer juga membantu mengecek spesifikasi PHP kita apakah cocok atau tidak dengan kebutuhan &lt;em&gt;library&lt;/em&gt; tersebut.&lt;/p&gt;
&lt;h3&gt;Contoh Kasus&lt;/h3&gt;
Contoh kasus saat kita membuat sebuah aplikasi, kita memerlukan paket/*library* dari Composer :
- **Paket A**,
- **Paket B**, dan
- **Paket C**
&lt;p&gt;Maka tahap yang dilakukan oleh Composer adalah :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Composer akan mengecek dependency dari paket A, B dan C tersebut beserta spesifikasi PHP-nya.&lt;/li&gt;
&lt;li&gt;Kemudian Composer mendapatkan :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Paket A&lt;/strong&gt;: memiliki dependecy &lt;strong&gt;paket D&lt;/strong&gt;, &lt;strong&gt;paket E&lt;/strong&gt;, dan &lt;strong&gt;paket F&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket B&lt;/strong&gt;: memiliki dependency &lt;strong&gt;paket D&lt;/strong&gt; dan &lt;strong&gt;paket G&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket C&lt;/strong&gt;: memiliki dependecy &lt;strong&gt;paket E&lt;/strong&gt; dan &lt;strong&gt;paket H&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Composer** akan** men-&lt;em&gt;download&lt;/em&gt; :
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Paket A&lt;/strong&gt;: ini paket yang kita butuhkan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket B&lt;/strong&gt;: paket yang kita butuhkan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket C&lt;/strong&gt;: paket yang kita butuhkan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket D&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket A&lt;/strong&gt; dan &lt;strong&gt;paket B&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket E&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket A&lt;/strong&gt; dan &lt;strong&gt;paket C&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket F&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket A&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket G&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket B&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket H&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket C&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sebelum&lt;/strong&gt; mulai men-&lt;em&gt;download library&lt;/em&gt; di atas, Composer akan mengecek lagi apakah ada dependensi untuk &lt;strong&gt;paket D, E, F H,&lt;/strong&gt; dan &lt;strong&gt;H&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Jika Composer menemukan bahwa &lt;strong&gt;Paket G&lt;/strong&gt; memiliki dependensi berupa &lt;strong&gt;Paket I&lt;/strong&gt;, maka Composer juga akan mendownload paket I tersebut (karena diperlukan oleh paket G).&lt;/li&gt;
&lt;li&gt;Jadi total ada &lt;strong&gt;9 buah paket/&lt;em&gt;library&lt;/em&gt;&lt;/strong&gt; yang akan di-&lt;em&gt;download&lt;/em&gt; oleh Composer, sesuai dengan ketergantungan dari satu paket dengan paket lainnya.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Paket A&lt;/strong&gt;: ini paket yang kita butuhkan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket B&lt;/strong&gt;: paket yang kita butuhkan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket C&lt;/strong&gt;: paket yang kita butuhkan&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket D&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket A&lt;/strong&gt; dan &lt;strong&gt;paket B&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket E&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket A&lt;/strong&gt; dan &lt;strong&gt;paket C&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket F&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket A&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket G&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket B&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket H&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket C&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paket I&lt;/strong&gt;: dibutuhkan oleh &lt;strong&gt;paket G&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah kira-kira begitu &lt;strong&gt;cara kerja Composer&lt;/strong&gt; menurut yang saya pahami :)&lt;/p&gt;
&lt;p&gt;Mungkin pertanyaan berikutnya, dari mana ya Composer bisa tahu tentang dependensi &lt;em&gt;library-library&lt;/em&gt; yang kita butuhkan itu? Nah, untuk menjawab pertanyaan tersebut, kita ulas tentang &amp;ldquo;lumbung&amp;rdquo; &lt;em&gt;library&lt;/em&gt; dari Composer.&lt;/p&gt;
&lt;h2 id=&#34;packagistorg&#34;&gt;Packagist.org&lt;/h2&gt;
&lt;p&gt;Misal kita ingin membuat sebuah paket atau* library* agar dapat digunakan oleh orang lain (melalui Composer), apa yang kita harus lakukan?&lt;/p&gt;
&lt;p&gt;Jadi kita (atau seorang developer) yang membuat sebuah &lt;em&gt;library&lt;/em&gt;, harus memberitahukan terlebih dulu tentang &lt;em&gt;library&lt;/em&gt; yang dibuatnya tersebut kepada Composer. Memberitahukan ke mana? Yaitu ke &lt;strong&gt;&lt;em&gt;repository&lt;/em&gt; tempat yang menjadi rujukan Composer&lt;/strong&gt;, yaitu &lt;strong&gt;&lt;a href=&#34;https://packagist.org/&#34; target=&#34;_blank&#34;&gt;packagist.org&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Kalau teman-teman belum tau apa itu* repository*, analoginya repository itu semacam &amp;ldquo;lumbung&amp;rdquo;, tempat di mana seluruh &lt;em&gt;library&lt;/em&gt;, serta informasi terkait &lt;em&gt;library&lt;/em&gt; yang ada pada Composer dapat kita temukan. Jadi Composer akan mencari paket-paket yang kita butuhkan itu dari &amp;ldquo;lumbung&amp;rdquo; yang bernama &lt;strong&gt;packagist.org&lt;/strong&gt; tadi.&lt;/p&gt;
&lt;p&gt;Lalu apa saja yang diberitahukan oleh seorang developer sebuah &lt;em&gt;library&lt;/em&gt; kepada packagist.org agar dapat digunakan oleh orang lain?&lt;/p&gt;
&lt;h3 id=&#34;syarat-publish-paket&#34;&gt;Syarat “publish” Paket&lt;/h3&gt;
&lt;p&gt;Syarat sebuah library yang didaftarkan pada packagist.org :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nama dan deskripsi &lt;em&gt;library&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Source code&lt;/em&gt; dari paket atau &lt;em&gt;library&lt;/em&gt; yang dibuat (biasanya dari github)&lt;/li&gt;
&lt;li&gt;Versi (minimal) PHP dan atau &lt;em&gt;module&lt;/em&gt; yang digunakan (opsional)&lt;/li&gt;
&lt;li&gt;Daftar *library *lain yang menjadi dependensinya (opsional).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Teman-teman bisa melihat referensi ini di &lt;a href=&#34;https://packagist.org&#34;&gt;https://packagist.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nah kalau kita lihat &lt;strong&gt;syarat yang ke empat&lt;/strong&gt;, di sini sang developer memberitahukan kepada &lt;em&gt;packagist&lt;/em&gt;, bahwa “jika seseorang ingin menggunakan &lt;em&gt;library&lt;/em&gt; saya ini, maka &lt;em&gt;library-library&lt;/em&gt; yang saya list di syarat ke empat tadi juga harus di-&lt;em&gt;download&lt;/em&gt;.” &lt;em&gt;Btw&lt;/em&gt;, “pemberitahuan” yang dilakukan oleh sang developer &lt;em&gt;library&lt;/em&gt; ke Packagist.org ini disebut dengan &lt;em&gt;“Publishing Package”&lt;/em&gt; atau mempublish paket.&lt;/p&gt;
&lt;p&gt;Nah, setelah &lt;em&gt;library&lt;/em&gt; ter-&lt;em&gt;publish&lt;/em&gt; atau diberitahukan ke packagist.org, Composer merujuk kepada list depedensi *library *yang telah di-&lt;em&gt;publish&lt;/em&gt; tadi.&lt;/p&gt;
&lt;p&gt;Jadi Composer membuat semacam “daftar isi” depedensi paket-paket/&lt;em&gt;library-library&lt;/em&gt; yang ada di dalam repository packagist.org tadi.&lt;/p&gt;
&lt;h2 id=&#34;simpulan-materi&#34;&gt;Simpulan Materi&lt;/h2&gt;
&lt;p&gt;Oke, sedikit kita simpulkan untuk tulisan tentang composer ini.&lt;/p&gt;
&lt;h4 id=&#34;apa-manfaat-composer&#34;&gt;Apa manfaat Composer?&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Berbagi &lt;em&gt;library&lt;/em&gt; &lt;em&gt;open-source&lt;/em&gt; kepada orang lain&lt;/li&gt;
&lt;li&gt;Mempermudah kita mendapatkan paket/&lt;em&gt;library open-source&lt;/em&gt; tanpa perlu mengetahui dependensi paket yang kita perlukan (karena dependensi di-&lt;em&gt;download&lt;/em&gt; otomatis oleh Composer)&lt;/li&gt;
&lt;li&gt;Mempermudah &lt;em&gt;update&lt;/em&gt; paket &lt;em&gt;library&lt;/em&gt; yang menjadi dependensi (tanpa dilakukan secara manual)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nah jadi kira-kira begitu lah cara kerja &lt;strong&gt;Composer sebagai &amp;ldquo;Dependency Manager for PHP&amp;rdquo;&lt;/strong&gt;, sebuah aplikasi yang membantu mempermudah kita dalam membuat sebuah aplikasi.&lt;/p&gt;
&lt;p&gt;Sekarang pertanyaannya, apakah dengan membaca artikel tersebut teman-teman sudah memahami tentang
&lt;a href=&#34;https://blog.inweeks.com/composer/berkenalan-dengan-composer/&#34;&gt;Analogi Dependensi&lt;/a&gt; dan
&lt;a href=&#34;https://blog.inweeks.com/composer/cara-kerja-composer/&#34;&gt;Cara Kerja Composer&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Jika belum paham, jangan sungkan untuk bertanya di komentar :)&lt;/p&gt;
&lt;p&gt;Selanjutnya kita bahas tentang &lt;a href=&#34;#&#34;&gt;Cara Install Composer&lt;/a&gt;.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Berkenalan dengan Composer</title>
       <link>https://blog.inweeks.com/composer/berkenalan-dengan-composer/</link>
       <pubDate>Sat, 25 Feb 2017 14:10:00 +0800</pubDate>
       
       <guid>https://blog.inweeks.com/composer/berkenalan-dengan-composer/</guid>
       <description>&lt;p&gt;Bicara tentang &lt;a href=&#34;https://laravel.com&#34;&gt;Laravel&lt;/a&gt;, kita akan banyak menggunakan tehnik dan teknologi baru di dunia pemrograman PHP. Bagi kita yang baru memulai mengenal Laravel, kita harus berkenalan terlebih dahulu dengan satu &lt;em&gt;tool&lt;/em&gt; (alat bantu) untuk menginstall Laravel, yang bernama &lt;a href=&#34;https://getcomposer.com&#34;&gt;Composer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oke, sebagian kita mungkin sudah mengenal Composer sebelum kenal Laravel, tapi sebagian lagi mungkin baru tahu tentang Composer setelah belajar install Laravel (seperti saya). Nah, timbul beberapa pertanyaan seputar Composer :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sebenarnya apa sih Composer itu?&lt;/li&gt;
&lt;li&gt;Apa manfaatnya untuk kita jika menggunakan composer?&lt;/li&gt;
&lt;li&gt;Kenapa laravel membutuhkan composer?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ini adalah pertanyaan saya saat pertama tahu tentang Laravel dan Composer. Oke, kita akan membahas pertanyaan-pertanyaan tersebut di artikel ini.&lt;/p&gt;
&lt;h2 id=&#34;apa-itu-composer&#34;&gt;Apa itu Composer?&lt;/h2&gt;
&lt;p&gt;Menurut &lt;a href=&#34;https://getcomposer.com&#34;&gt;websitenya&lt;/a&gt;, tagline Composer adalah “Dependency Manager for PHP”. Hmm&amp;hellip; oke lah, kita simpan dulu tagline ini di memory.&lt;/p&gt;
&lt;p&gt;Menurut bahasa saya, &lt;strong&gt;Composer adalah&lt;/strong&gt; sebuah aplikasi yang diinstall ke dalam PC atau Laptop, yang memfasilitasi kita untuk dapat menggunakan &lt;em&gt;script/library&lt;/em&gt; opensource milik orang lain ke dalam project yang sedang kita bangun. Lalu apa kaitannya pengertian itu dengan tagline “Dependency Manager”? Oke, kita bahas dulu tentang maksud dari “Dependency Manager”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dependency Manager&lt;/strong&gt; di sini maksudnya, Composer akan mengelola “ketergantungan” antara &lt;em&gt;library-library PHP&lt;/em&gt; (yang disebut &lt;em&gt;package&lt;/em&gt;), yang &lt;strong&gt;dibuat oleh seseorang&lt;/strong&gt; untuk &lt;strong&gt;digunakan oleh orang lain&lt;/strong&gt;. Dan yang dikelola oleh Composer ini bukanlah &lt;em&gt;script&lt;/em&gt; atau *library-*nya, tetapi ketergantungan (&lt;em&gt;dependency&lt;/em&gt;) nya, antara satu &lt;em&gt;library&lt;/em&gt; dengan &lt;em&gt;library&lt;/em&gt; yang lain. Lalu ketergantugan atau &lt;em&gt;dependency&lt;/em&gt; yang dimaksud itu bagaimana? oke, kita bahas tentang &lt;em&gt;dependency&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;analogi-dependency&#34;&gt;Analogi Dependency&lt;/h3&gt;
&lt;p&gt;Begini, misalkan kita membuat sebuah project &lt;em&gt;e-commerce&lt;/em&gt; yang &lt;strong&gt;memerlukan&lt;/strong&gt; fitur:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fitur Keranjang Belanja&lt;/li&gt;
&lt;li&gt;Fitur Penomoran Romawi untuk Invoice&lt;/li&gt;
&lt;li&gt;Fitur Terbilang angka Rupiah untuk Invoice/Tanda Terima&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Di atas kita bisa tangkap kata &lt;strong&gt;&amp;ldquo;memerlukan&amp;rdquo;&lt;/strong&gt;. Artinya ketiga fitur itu &lt;strong&gt;wajib ada&lt;/strong&gt; pada aplikasi e-commerce kita. Jika tidak ada? Maka bisa dipastikan aplikasi kita tidak akan berjalan sempurna (atau bahkan tidak bisa jalan).
Oke, karena ketiga fitur itu &amp;ldquo;wajib ada&amp;rdquo;, maka kita harus membuatnya, &lt;em&gt;kan&lt;/em&gt;?
Bagaimana kalau ada teman kita yang &lt;strong&gt;sudah pernah membuat fitur Keranjang Belanja&lt;/strong&gt; untuk web e-commerce nya.
Kemudian ada &lt;strong&gt;teman yang lain pernah membuat&lt;/strong&gt; fitur Konversi &lt;strong&gt;Penomoran Romawi&lt;/strong&gt;.
Lalu &lt;strong&gt;ada lagi&lt;/strong&gt; teman sudah &lt;strong&gt;membuat&lt;/strong&gt; fitur &lt;strong&gt;Terbilang&lt;/strong&gt; Rupiah.
Hhmm.. sepertinya temen-temen kita ini baik hati dan mau berbagi dengan kita. Dan ternyata ketiganya dengan senang hati memberikan &lt;em&gt;script&lt;/em&gt; buatannya (diajarkan pula cara menggunakannya).&lt;/p&gt;
&lt;p&gt;Apa yang terjadi? Akhirnya project &lt;em&gt;e-commerce&lt;/em&gt; kita dapat selesai dikerjakan lebih cepat dari yang kita rencanakan. Tentu dengan cara ini, proses pembangunan aplikasi akan cenderung lebih cepat, karena untuk mendapatkan &lt;strong&gt;fitur&lt;/strong&gt; tadi, kita &lt;strong&gt;tidak perlu bikin dari awal&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Jadi seperti itu contoh “ketergantugan” atau “&lt;em&gt;dependency&lt;/em&gt;” ini. Sudah terbayang ya? Inti dari “dependency” adalah, project yang kita bangun “memerlukan” &lt;em&gt;script&lt;/em&gt; atau &lt;em&gt;library-library&lt;/em&gt; lain agar dapat berjalan dengan benar.&lt;/p&gt;
&lt;p&gt;Betapa mudahnya hidup kita saat itu. Bisa kita bayangkan, jika banyak teman yang baik yang berbuat seperti itu, dapat berbagi script/library agar mempermudah pekerjaan orang lain. Hehe..&lt;/p&gt;
&lt;p&gt;Dan ternyata &amp;hellip; hal itu sudah berlangsung saat ini. &lt;em&gt;Yap!&lt;/em&gt; Saat ini ada banyak &lt;em&gt;developer/programmer&lt;/em&gt; di berbagai belahan dunia saling berbagi &lt;em&gt;library&lt;/em&gt; buatan mereka.&lt;/p&gt;
&lt;p&gt;Pertanyaannya, bagaimana caranya agar kita bisa menggunakan &lt;em&gt;library-library&lt;/em&gt; dari para programmer di belahan dunia lain? Sepertinya kita tidak bisa meminta mereka dengan mudah, &lt;em&gt;kenal aja nggak!?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Nah&lt;/em&gt;, di sinilah peran kerja Composer &lt;del&gt;(masih ingat kan ya? kita ini lagi bahas composer)&lt;/del&gt;. Composer yang membantu kita dalam mendapatkan library-library PHP milik orang lain agar dapat digukanan dalam project kita.&lt;/p&gt;
&lt;p&gt;Kira-kira sampai disini sudah terjawab ya pertanyaan nomor 2 di atas (&lt;strong&gt;Apa manfaatnya untuk kita jika menggunakan composer?&lt;/strong&gt;)&lt;/p&gt;
&lt;h3 id=&#34;terakhir-kenapa-laravel-membutuhkan-composer&#34;&gt;Terakhir, kenapa laravel membutuhkan composer?&lt;/h3&gt;
&lt;p&gt;Ya, karena Framework Laravel terdiri dari gabungan dari banyak &lt;em&gt;library PHP&lt;/em&gt; yang diikat menjadi satu untuk menyempurnakan fitur-fitur yang ada pada Framework Laravel. Sepertinya sejak awal sudah didesain seperti itu. Keuntungkan untuk kita pengguna Laravel apa? Ya, ketika kita membutuhkan &lt;em&gt;library&lt;/em&gt; lain, kita tinggal &amp;ldquo;memanggil&amp;rdquo; &lt;em&gt;library&lt;/em&gt; tersebut melalui composer, dan &lt;em&gt;library&lt;/em&gt; tersebut siap digunakan dalam project kita.&lt;/p&gt;
&lt;p&gt;Sampai di sini akan muncul pertanyaan lagi, &lt;strong&gt;bagaimana cara kerja composer&lt;/strong&gt; sehingga bisa se-&amp;ldquo;hebat&amp;rdquo; itu? Bisa mengumpulkan library milik orang lain dan membantu kita dalam penggunaannya dalam project kita?&lt;/p&gt;
&lt;p&gt;Kita akan bahas pada artikel berikutnya, yaitu &lt;a href=&#34;https://blog.inweeks.com/composer/cara-kerja-composer/&#34;&gt;Cara Kerja Composer dan Lumbung Library Packagist.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terima kasih untuk waktunya membaca artikel ini.&lt;/p&gt;
</description>
     </item>
   
 </channel>
</rss>
