[TOC]
前言
在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程但是一样的。如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成。
## 一、环境准备
1. 安装ddt模块,打开cmd输入pip3 install ddt在线安装
```
>>pip3 install ddt
```
## 二、数据驱动原理
1. 测试数据为多个字典的list类型
2. 测试类前加修饰@ddt.ddt
3. case前加修饰@ddt.data()
4. 运行后用例会自动加载成三个单独的用例
```
import ddt
import unittest
# 测试数据
testData = [{"username":"selenium", "password":"123"},
{"username":"python", "password":"123456"},
{"username":"appium", "password":"456"}]
@ddt.ddt
class Test(unittest.TestCase):
def setUp(self):
print("start!")
def tearDown(self):
print("end!")
@ddt.data(*testData)
def test_ddt(self, data):
print(data)
if __name__ == "__main__":
unittest.main()
```
5. 测试结果:
```
start!
{'username': 'selenium', 'password': '123'}
end!
start!
{'username': 'python', 'password': '123456'}
end!
start!
{'username': 'appium', 'password': '456'}
end!
```
## 三、selenium案例
1. 从上一篇封装的excel方法里面读取数据,作为测试测试
2. 在之前写的登录那篇基础上做点修改,测试参数读取excel里的数据
3. 代码参考如下:
```
from selenium import webdriver
import unittest
from time import sleep
import ddt
# 测试数据
testData = [{"username":"selenium", "password":"123"},
{"username":"python", "password":"123456"},
{"username":"appium", "password":"456"}]
print(testData)
@ddt.ddt
class Blog(unittest.TestCase):
'''登录博客'''
def setUp(self):
self.driver = webdriver.Chrome()
url = "https://account.cnblogs.com/signin"
self.driver.get(url)
self.driver.implicitly_wait(30)
def login(self, username, password):
'''这里写了一个登录的方法,账号和密码参数化'''
self.driver.find_element_by_id("mat-input-0").send_keys(username)
self.driver.find_element_by_id("mat-input-1").send_keys(password)
self.driver.find_element_by_css_selector(".mat-button-wrapper").click()
sleep(3)
def is_login_sucess(self):
'''判断是否获取到登录账号名称'''
try:
text = self.driver.find_element_by_id("lnk_current_user").text
print(text)
return True
except:
return False
@ddt.data(*testData)
def test_login(self, data):
'''登录案例参考'''
print("当前测试数据 %s" %data)
# 调用登录方法
self.login(data["username"], data["password"])
# 判断结果
result = self.is_login_sucess()
self.assertTrue(result)
def tearDown(self):
self.driver.quit()
if __name__ == "__main__":
unittest.main()
```