diff --git a/README.md b/README.md
index 8f4677da05b02d5d9d202fd08de97ef725f44c1a..fd3bf1b70598e458d07ce6652a62153a2f1a9226 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,41 @@
 PMPL Course - Class A
 
 URL: http://pmpl-rayza.herokuapp.com
+
+## Exercise - 3 : Test Isolation
+
+
+### Test Isolation
+
+Test Isolation adalah proses pemecahan sistem / aplikasi menjadi modul-modul kecil yang dapat dilakukan `test` ataupun `evaluasi` secara lebih mudah. Tipe software testing ini biasanya dilakukan jika bug yang ada pada aplikasi sulit untuk ditemukan. Dengan bantuan Test Isolation, testing dapat dilakukan dengan lebih mudah dan tanpa side effect apapun. Hal ini dikarenakan dengan menggunakan Test Isolation, testing akan dilakukan pada environment yang masih bersih dari side effect apapun serta dengan menggunakan database yang bersih pula.
+
+### Implementation
+
+Dalam tutorial-6 yang terdapat pada buku **Test-Driven Development with Python: Obey the Testing Goat: Using Django, Selenium, and JavaScript**, Test Isolation dilakukan dengan cara membuat `functional_test.py` yang sudah dibuat pada tutorial-tutorial sebelumnya menjadi suatu module pada django testing dengan memanfaatkan class `LiveServerTestCase`. Berikut adalah perubahan code yang terjadi dari `functional_test.py` menjadi `functional_tests/tests.py` :
+#### Sebelum :
+```
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+import time
+import unittest
+
+class  NewVisitorTest(unittest.TestCase):
+
+	def  setUp(self):
+		[...]
+```
+#### Sesudah :
+```
+from django.test import LiveServerTestCase
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+from selenium.common.exceptions import WebDriverException
+import time
+
+class  NewVisitorTest(LiveServerTestCase):
+
+	def  setUp(self):
+		[...]
+```
+
+Dengan melakukan perubahan tersebut, To-Do List yang ada pada aplikasi selalu mulai dari kosong pada saat menjalankan test. Berbeda ketika belum menggunakan `LiveServerTestCase` dimana To-Do List yang ada akan terus bertambah saat dijalan dari test ke test berikutnya.
\ No newline at end of file
diff --git a/functional_tests/__init__.py b/functional_tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/functional_test.py b/functional_tests/tests.py
similarity index 67%
rename from functional_test.py
rename to functional_tests/tests.py
index 23571cedeb3ed7a83e8db127c682dce401044292..7e17d36cc414e3d9d1477897b4fb40a1b29da2e9 100644
--- a/functional_test.py
+++ b/functional_tests/tests.py
@@ -1,9 +1,12 @@
+from django.test import LiveServerTestCase
 from selenium import webdriver
 from selenium.webdriver.common.keys import Keys
+from selenium.common.exceptions import WebDriverException
 import time
-import unittest
 
-class NewVisitorTest(unittest.TestCase):
+MAX_WAIT = 10
+
+class NewVisitorTest(LiveServerTestCase):
 
     def setUp(self):
         self.browser = webdriver.Firefox()
@@ -12,15 +15,23 @@ class NewVisitorTest(unittest.TestCase):
     def tearDown(self):
         self.browser.quit()
 
-    def check_for_row_in_list_table(self, row_text):
-        table = self.browser.find_element_by_id('id_list_table')
-        rows = table.find_elements_by_tag_name('tr')
-        self.assertIn(row_text, [row.text for row in rows])
+    def wait_for_row_in_list_table(self, row_text):
+        start_time = time.time()
+        while True:  
+            try:
+                table = self.browser.find_element_by_id('id_list_table')  
+                rows = table.find_elements_by_tag_name('tr')
+                self.assertIn(row_text, [row.text for row in rows])
+                return  
+            except (AssertionError, WebDriverException) as e:  
+                if time.time() - start_time > MAX_WAIT:  
+                    raise e  
+                time.sleep(0.5)
 
     def test_can_start_a_list_and_retrieve_it_later(self):
         # Edith has heard about a cool new online to-do app. She goes
         # to check out its homepage
-        self.browser.get('http://localhost:8000')
+        self.browser.get(self.live_server_url)
 
         # She notices the page title and header meantion to-do lists
         self.assertIn('To-Do', self.browser.title)
@@ -42,7 +53,7 @@ class NewVisitorTest(unittest.TestCase):
         # "1: Buy peacock feathers" as an item in a to-do list table
         inputbox.send_keys(Keys.ENTER)
         time.sleep(1)
-        self.check_for_row_in_list_table('1: Buy peacock feathers')
+        self.wait_for_row_in_list_table('1: Buy peacock feathers')
 
         # There is still a text box inviting her to add another item. She
         # enters "Use peacock feathers to make a fly" (Edith is very
@@ -53,8 +64,8 @@ class NewVisitorTest(unittest.TestCase):
         time.sleep(1)
 
         # The page updates again, and now shows both items on her list
-        self.check_for_row_in_list_table('1: Buy peacock feathers')
-        self.check_for_row_in_list_table('2: Use peacock feathers to make a fly')
+        self.wait_for_row_in_list_table('1: Buy peacock feathers')
+        self.wait_for_row_in_list_table('2: Use peacock feathers to make a fly')
 
         # Edith wonders whether the site will remember her list. Then she sees
         # that the site has generated a unique URL for her -- there is some
@@ -63,6 +74,3 @@ class NewVisitorTest(unittest.TestCase):
         # She visits that URL - her to-do list is still there.
         
         # Satisfied, she goes back to sleep
-
-if __name__ == '__main__':
-    unittest.main(warnings='ignore')