6.1 如何确保功能测试之间相互隔离
运行功能测试之后,会遗留输入的测试数据,影响下次测试效果
运行单元测试,Django 测试程序自动创建全新的测试数据库,运行每个测试之前都会清空数据库,等所有测试完,删除数据库
动能测试目前使用的是应用真正的数据库, 如何让他自动清理呢
djngo 1.4 版本后提供了 LiveServerTestCase 完成这个任务
这个类会自动创建一个测试数据库,并启动一个开发服务器,让测试功能 运行
首先我们新建一个文件夹让他看起来像一个应用
然后将我们的功能测试文件放到这个文件夹中,并且重命名为tests
然后修改他 修改NewVisitorTest 类,让他使用LiveServerTestCase
未修改之前代码:
#coding=utf-8
from selenium import webdriver
import unittest
from selenium.webdriver.common.keys import Keys
import time
class NewVisitorTest(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Firefox()
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 test_can_start_a_list_and_retrieve_it_later(self):
#小花听说有一个待办事项的网站很好
#她去看了这个应用的首页
self.browser.get("http://localhost:8000")
#她注意到这个首页的标题和头部包含“To-Do”
self.assertIn("To-Do",self.browser.title)
header_text = self.browser.find_element_by_tag_name('h1').text
self.assertIn('To-Do',header_text)
#应用邀请她输入一个待办事项
inputbox = self.browser.find_element_by_id('id_new_item')
self.assertEqual(
inputbox.get_attribute("placeholder"),
'Enter a to-do item'
)
#她在文本框输入了"Buy woolen yarn " (购买毛线)
#她的爱好是织毛衣
inputbox.send_keys("Buy woolen yarn")
#按回车键页面更新了
inputbox.send_keys(Keys.ENTER)
time.sleep(1)
# 待办事项中显示“1:Buy woolen yarn”
self.check_for_row_in_list_table( "1:Buy woolen yarn")
#页面中又显示了一个文本框,可以输入其他待办事项
#她输入了"Knit a sweater with wool”(使用毛线织m毛衣)
inputbox = self.browser.find_element_by_id('id_new_item')
inputbox.send_keys("Knit a sweater with wool")
inputbox.send_keys(Keys.ENTER)
time.sleep(1)
#页面再次跟新,他的清单中显示了这两个待办事项
# 待办事项中显示 1:Buy woolen yarn
# 2:Knit a sweater with wool
self.check_for_row_in_list_table( "1:Buy woolen yarn")
self.check_for_row_in_list_table( "2:Knit a sweater with wool")
self.fail("Finish the test")
#[..]
if __name__=='__main__':
unittest.main()
修改后:
继承了LiveServerTestCase类
使用
调用self.live_server_url 属性改变不再使用硬编码地址localhost:8000
删除if name==‘main’:
unittest.main()
因为Django 测试程序查找所有名字以test 开头文件
#coding=utf-8
from selenium import webdriver
from django.test import LiveServerTestCase
from selenium.webdriver.common.keys import Keys
import time
class NewVisitorTest(LiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
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 test_can_start_a_list_and_retrieve_it_later(self):
#小花听说有一个待办事项的网站很好
#她去看了这个应用的首页
self.browser.get(self.live_server_url)
#她注意到这个首页的标题和头部包含“To-Do”
self.assertIn("To-Do",self.browser.title)
header_text = self.browser.find_element_by_tag_name('h1').text
self.assertIn('To-Do',header_text)
#应用邀请她输入一个待办事项
inputbox = self.browser.find_element_by_id('id_new_item')
self.assertEqual(
inputbox.get_attribute("placeholder"),
'Enter a to-do item'
)
#她在文本框输入了"Buy woolen yarn " (购买毛线)
#她的爱好是织毛衣
inputbox.send_keys("Buy woolen yarn")
#按回车键页面更新了
inputbox.send_keys(Keys.ENTER)
time.sleep(1)
# 待办事项中显示“1:Buy woolen yarn”
self.check_for_row_in_list_table( "1:Buy woolen yarn")
#页面中又显示了一个文本框,可以输入其他待办事项
#她输入了"Knit a sweater with wool”(使用毛线织m毛衣)
inputbox = self.browser.find_element_by_id('id_new_item')
inputbox.send_keys("Knit a sweater with wool")
inputbox.send_keys(Keys.ENTER)
time.sleep(1)
#页面再次跟新,他的清单中显示了这两个待办事项
# 待办事项中显示 1:Buy woolen yarn
# 2:Knit a sweater with wool
self.check_for_row_in_list_table( "1:Buy woolen yarn")
self.check_for_row_in_list_table( "2:Knit a sweater with wool")
self.fail("Finish the test")
#[..]
运行功能测试
python manage.py test functional_tests
通过测试
确保测试隔离、管理全局状态:
不同的测试之间不能相互影响,也就是说每次测试之后都要还原永久状态。