背景:
设计测试用例是,有些测试用例只是参数数据输入不一样而已,比如登录时,需要经常切换账号,而操作基本是一样的。如果用例重复去写操作过程会导致很多冗余的代码
1、安装ddt
pip install ddt
2、原理
- 测试数据为多个字典的list类型
- 测试类前加修饰@ddt.ddt
- case前加修饰@ddt.data()
- 运行后用例会自动加载成三个单独的用例
3、代码
封装读取Excel的数据
# coding=utf-8
import xlrd
class FileUtils():
def __init__(self, file_path, sheet_index):
self.data = xlrd.open_workbook(file_path)
self.table = self.data.sheet_by_index(sheet_index)
self.key = self.table.row_values(0)
self.row_num = self.table.nrows
self.clo_num = self.table.ncols
def read_excel(self):
if self.row_num <= 1:
print(u"excel数据小于1行")
else:
list = []
num = 1
for row in range(self.row_num - 1):
dict = {}
values = self.table.row_values(num)
for clo in range(self.clo_num):
dict[self.key[clo]] = values[clo]
list.append(dict)
num += 1
return list
if __name__ == '__main__':
file_path = "E:\\Python\\portal\\file\\text.xlsx"
sheet_index = 0
file = FileUtils(file_path, sheet_index)
list = file.read_excel()
print(list)
测试类:
# coding=utf-8
from ddtdatatest.FileUtils import FileUtils
from selenium import webdriver
import ddt
import unittest
import time
file_path = "E:\\Python\\portal\\file\\text.xlsx"
sheet_index = 0
file = FileUtils(file_path, sheet_index)
data = file.read_excel()
print(data)
@ddt.ddt
class DDTTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get("https://imail.isoftstone.com")
self.driver.implicitly_wait(3000)
self.driver.maximize_window()
def login(self, username, password):
self.driver.find_element_by_id("account").clear()
self.driver.find_element_by_id("account").send_keys(username)
self.driver.find_element_by_id("password").clear()
self.driver.find_element_by_id("password").send_keys(password)
self.driver.find_element_by_id("bLogin").click()
time.sleep(3)
def is_login_success(self):
try:
text = self.driver.find_element_by_id("zb__App__Mail_title").text
print(text)
return True
except:
return False
@ddt.data(*data)
def test_login(self, data):
print(u"当前测试数据 %s" % data)
self.login(data["username"], data["password"])
result = self.is_login_success()
self.assertTrue(result)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()