6改进功能测试:确保功能测试的相互隔离

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
通过测试
在这里插入图片描述

确保测试隔离、管理全局状态:
不同的测试之间不能相互影响,也就是说每次测试之后都要还原永久状态。

猜你喜欢

转载自blog.csdn.net/weixin_43147867/article/details/86582080