ddt是python的第三方库,ddt模块提供了创建数据驱动的测试,安装命令为pip install ddt

安装成功后在python的命令行环境中可以正常导入。在ddt模块中,@ddt表示元组的列表数据,@unpack表示用来解压元组到多个参数,ddt库应用在UI级别的自动化测试中可以实现编写一个测试用例的代码实现多个测试点的验证,比如在登陆页面,存在多种测试情况如用户名和密码输入框都为空,用户名和密码不为空,密码为空用户名不为空返回的错误提示信息,下面通过ddt来实现这样的一个案例,

源码:
import unittest
from selenium import webdriver
from ddt import data,unpack,ddt
@ddt
class SinaLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.maximize_window()
self.driver.get('http"//mail.sina.com.cn')
self.driver.implicitly_wait(30)
def tearDown(self):
self.driver.quit()
@data(('','','请输入邮箱名'),('','admin','请输入邮箱名'),('admin','','你输入的邮箱格式不正确'))
@unpack
def test_login(self,username,password,result):
'''验证:测试新浪邮箱登录N中情况'''
self.driver.find_element_by_id('freename').send_keys(username)
self.driver.find_element_by_id('freepassword').send_keys(password)
self.driver.find_element_by_link_text('登陆').click()
divTest = self.driver.find_element_by_xpath('/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]').text
self.assertEqual(divTest,result)
if __name__ == '__main__':
unittest.main(verbosity=2)
【注解】注解:在如上的代码中主要应用了 ddt 在测试用例中的应用,在@data 中数据类型是元组,
在@data 中可以看到不同情况下的测试数据,实际上就是三个测试点:
1. 用户名和密码为空,点击登录按钮,验证错误提示信息是否是“请输入邮箱名”;
2. 用户名为空,密码不为空,点击登录,验证错误是否是”请输入邮箱名”;
3. 输入错误的用户名, 点击登录,验证错误是否是”您输入的邮箱格式不正确”
在测试用例中 test_login 中有三个参数,分别是 username,password,result 分别对应
@data 你的元组数据是一一对应。
在上面的例子中把数据放在@data 并不是很好的选择,可以把@data 中的
数据分离到一个方法中,比如存储在列表中,下面实现把@data 中的数据放在一
个列表中,见实现的代码:

源码:
def getData():
'''数据分离出来放到列表'''
return [
['','','请输入邮箱名'],
['','admin','请输入邮箱名'],
['admin','','您输入的邮箱格式不正确']
]
@ddt
class SinaLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.maximize_window()
self.driver.get('http"//mail.sina.com.cn')
self.driver.implicitly_wait(30)
def tearDown(self):
self.driver.quit()
@data(*getData())
@unpack
def test_login(self,username,password,result):
'''验证:测试新浪邮箱登录N中情况'''
self.driver.find_element_by_id('freename').send_keys(username)
self.driver.find_element_by_id('freepassword').send_keys(password)
self.driver.find_element_by_link_text('登陆').click()
divTest = self.driver.find_element_by_xpath('/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]').text
self.assertEqual(divTest,result)
if __name__ == '__main__':
unittest.main(verbosity=2)
【注解】:注解:在上面的代码中可以看到把@data 中的数据分离到了 getData 的函数中,在@data 中
调用函数 getData 加了*是因为@data 要求的数据类型是元组,加*后会把 getData 函数返
回的数据列表类型转为元组类型。
















