数据驱动 - 不同数据源的读取方式(ddt、数据文件、mysql)
1. ddt 装饰器传参
2. ddt 读取数据文件
3. 读取 txt 文件
4. 读取 excel 文件
5. 连接 mysql
1. ddt 装饰器传参
python 的数据驱动模块 ddt
安装:pip install ddt
4 种使用模式:
- 引入的装饰器 @ddt
- 导入数据的 @data
- 拆分数据的 @unpack
- 导入外部数据的 @file_data
测试程序
1 from selenium import webdriver
2 import unittest, time
3 import logging, traceback
4 import ddt
5 from selenium.common.exceptions import NoSuchElementException
6
7
8 # 初始化日志对象
9 logging.basicConfig(
10 # 日志级别
11 level = logging.INFO,
12 # 日志格式
13 # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
14 format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
15 # 打印日志的时间
16 datefmt = '%a, %d %b %Y %H:%M:%S',
17 # 日志文件存放的目录(目录必须存在)及日志文件名
18 filename = 'report.log',
19 # 打开日志文件的方式
20 filemode = 'a'
21 )
22
23 @ddt.ddt
24 class TestDemo(unittest.TestCase):
25
26 def setUp(self):
27 self.driver = webdriver.Chrome()
28 self.driver.set_page_load_timeout(10)
29
30 @ddt.data(["hello", "哈喽"],
31 ["hiphop", "嘻哈"],
32 ["morning", "早晨"])
33 @ddt.unpack # 将测试数据解包对应到 testdata 和 expectdata;即该测试方法会执行3次
34 def test_dataDrivenByObj(self, testdata, expectdata):
35 url = "https://www.iciba.com"
36 # 访问百度首页
37 self.driver.get(url)
38 # 设置隐式等待时间为5秒
39 #self.driver.implicitly_wait(5)
40 try:
41 # 找到搜索输入框,并输入测试数据
42 self.driver.find_element_by_xpath("//input[@type='search']").send_keys(testdata)
43 # 找到搜索按钮,并点击
44 self.driver.find_element_by_xpath('//input[@placeholder="请输入您要翻译的单词"]/following-sibling::div').click()
45 time.sleep(5)
46 # 断言期望结果是否出现在页面源代码中
47 self.assertTrue(expectdata in self.driver.page_source)
48 except NoSuchElementException as e:
49 logging.error("查找的页面元素不存在,异常堆栈信息:" + str(traceback.format_exc()))
50 raise NoSuchElementException
51 except AssertionError as e:
52 logging.info("搜索“%s”,期望“%s”,失败" % (testdata, expectdata))
53 raise e
54 except Exception as e:
55 logging.error("未知错误,错误信息:" + str(traceback.format_exc()))
56 raise e
57 else:
58 logging.info("搜索“%s”,期望“%s”通过" % (testdata, expectdata))
59
60 def tearDown(self):
61 self.driver.quit()
62
63
64 if __name__ == '__main__':
65 unittest.main()
当前目录生成的 report.log
Fri, 22 Jan 2021 22:37:42 test.py[line:59] INFO 搜索“hello”,期望“哈喽”通过
Fri, 22 Jan 2021 22:38:07 test.py[line:59] INFO 搜索“glory”,期望“光荣”通过
Fri, 22 Jan 2021 22:38:33 test.py[line:59] INFO 搜索“morning”,期望“早晨”通过
2. ddt 读取数据文件
数据文件:test_data_list.json
[
"邓肯||蒂姆",
"乔丹||迈克尔",
"库里||斯蒂芬",
"杜兰特||凯文",
"詹姆斯||勒布朗"
]
测试报告模板:ReportTemplate.py
1 #encoding=utf-8
2
3 def htmlTemplate(trData):
4 htmlStr = u'''<!DOCTYPE HTML>
5 <html>
6 <head>
7 <title>单元测试报告</title>
8 <style>
9 body {
10 width: 80%; /*整个body区域占浏览器的宽度百分比*/
11 margin: 40px auto; /*整个body区域相对浏览器窗口摆放位置(左右,上下)*/
12 font-weight: bold; /*整个body区域的字体加粗*/
13 font-family: 'trebuchet MS', 'Lucida sans', SimSun; /*表格中文字的字体类型*/
14 font-size: 18px; /*表格中文字字体大小*/
15 color: #000; /*整个body区域字体的颜色*/
16 }
17 table {
18 *border-collapse: collapse; /*合并表格边框*/
19 border-spacing: 0; /*表格的边框宽度*/
20 width: 100%; /*整个表格相对父元素的宽度*/
21 }
22 .tableStyle {
23 /*border: solid #ggg 1px;*/
24 border-style: outset; /*整个表格外边框样式*/
25 border-width: 2px; /*整个表格外边框宽度*/
26 /*border: 2px;*/
27 border-color: blue; /*整个表格外边框颜色*/
28 }
29 .tableStyle tr:hover {
30 background: rgb(173,216,230); /*鼠标滑过一行时,动态显示的颜色146,208,80*/
31 }
32
33 .tableStyle td,.tableStyle th {
34 border-left: solid 1px rgb(146,208,80); /*表格的竖线颜色*/
35 border-top: 1px solid rgb(146,208,80); /*表格的横线颜色 */
36 padding: 15px; /*表格内边框尺寸*/
37 text-align: center; /*表格内容显示位置*/
38 }
39 .tableStyle th {
40 padding: 15px; /*表格标题栏,字体的尺寸*/
41 background-color: rgb(146,208,80); /*表格标题栏背景颜色*/
42 /*表格标题栏设置渐变颜色*/
43 background-image: -webkit-gradient(linear, left top, left bottom, from(#92D050), to(#A2D668));
44 /*rgb(146,208,80)*/
45 }
46 </style>
47 </head>
48 <body>
49 <center><h1>测试报告</h1></center><br />
50 <table class="tableStyle">
51 <thead>
52 <tr>
53 <th>Search Words</th>
54 <th>Assert Words</th>
55 <th>Start Time</th>
56 <th>Waste Time(s)</th>
57 <th>Status</th>
58 </tr>
59 </thead>''' # 示例:<tr><td>飞人</td><td>乔丹</td><td>21:13:23</td><td>15s</td><td>成功</td></tr>
60
61 endStr = u'''
62 </table>
63 </body>
64 </html>'''
65 # 拼接完整的测试报告HTML页面代码
66 html = htmlStr + trData + endStr
67 print (html)
68 # 生成.html文件
69 with open(u"testTemplate.html", "w") as fp:
70 fp.write(html)
测试程序
1 from selenium import webdriver
2 import unittest, time
3 import logging, traceback
4 import ddt
5 from ReportTemplate import htmlTemplate
6 from selenium.common.exceptions import NoSuchElementException
7
8
9 # 如果有no json的报错信息,请将json文件存储为utf-8 with Bom
10 # 初始化日志对象
11 logging.basicConfig(
12 # 日志级别
13 level = logging.INFO,
14 # 日志格式
15 # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
16 format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
17 # 打印日志的时间
18 datefmt = '%a, %Y-%m-%d %H:%M:%S',
19 # 日志文件存放的目录(目录必须存在)及日志文件名
20 filename = 'report.log',
21 # 打开日志文件的方式
22 filemode = 'w'
23 )
24
25 @ddt.ddt
26 class TestDemo(unittest.TestCase):
27
28 @classmethod
29 def setUpClass(cls):
30 # 整个测试过程只被调用一次
31 TestDemo.trStr = ""
32
33 def setUp(self):
34 self.driver = webdriver.Chrome()
35 status = None # 用于存放测试结果状态,失败'fail',成功'pass'
36 flag = 0 # 数据驱动测试结果的标志,失败置0,成功置1
37
38 @ddt.file_data("test_data_list.json") # 读取当前目录下的测试数据,每组数据执行该方法一次
39 def test_dataDrivenByFile(self, value):
40 # 决定测试报告中状态单元格中内容的颜色
41 flagDict = {0: 'red', 1: '#00AC4E'}
42
43 url = "https://www.baidu.com"
44 # 访问百度首页
45 self.driver.get(url)
46 # 将浏览器窗口最大化
47 self.driver.maximize_window()
48 print (value)
49 # 将从.json文件中读取出的数据用“||”进行分隔成测试数据
50 # 和期望数据
51 testdata, expectdata = tuple(value.strip().split("||"))
52 # 设置隐式等待时间为10秒
53 self.driver.implicitly_wait(10)
54
55 try:
56 # 获取当前的时间戳,用于后面计算查询耗时用
57 start = time.time()
58 # 获取当前时间的字符串,表示测试开始时间
59 startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
60 # 找到搜索输入框,并输入测试数据
61 self.driver.find_element_by_id("kw").send_keys(testdata)
62 # 找到搜索按钮,并点击
63 self.driver.find_element_by_id("su").click()
64 time.sleep(3)
65 # 断言期望结果是否出现在页面源代码中
66 self.assertTrue(expectdata in self.driver.page_source)
67 except NoSuchElementException as e:
68 logging.error(u"查找的页面元素不存在,异常堆栈信息:" + str(traceback.format_exc()))
69 status = 'fail'
70 flag = 0
71 except AssertionError as e:
72 logging.info(u"搜索“%s”,期望“%s”,失败" % (testdata, expectdata))
73 status = 'fail'
74 flag = 0
75 except Exception as e:
76 logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
77 status = 'fail'
78 flag = 0
79 else:
80 logging.info(u"搜索“%s”,期望“%s”通过" % (testdata, expectdata))
81 status = 'pass'
82 flag = 1
83 # 计算耗时,从将测试数据输入到输入框中到断言期望结果之间所耗时
84 wasteTime = time.time() - start - 3 # 减去强制等待的3秒
85 # 每一组数据测试结束后,都将其测试结果信息插入表格行
86 # 的HTML代码中,并将这些行HTML代码拼接到变量trStr变量中,
87 # 等所有测试数据都被测试结束后,传入htmlTemplate()函数中
88 # 生成完整测试报告的HTML代码
89 TestDemo.trStr += u'''
90 <tr>
91 <td>%s</td>
92 <td>%s</td>
93 <td>%s</td>
94 <td>%.2f</td>
95 <td style="color:%s">%s</td>
96 </tr><br />''' % (testdata, expectdata,startTime, wasteTime, flagDict[flag], status)
97
98 def tearDown(self):
99 self.driver.quit()
100
101 @classmethod
102 def tearDownClass(cls):
103 # 写自定义的html测试报告
104 # 整个测试过程只被调用一次
105 htmlTemplate(TestDemo.trStr)
106
107
108 if __name__ == '__main__':
109 unittest.main()
测试日志
Sun, 2021-01-24 20:52:30 data_drivern_by_file.py[line:80] INFO 搜索“邓肯”,期望“蒂姆”通过
Sun, 2021-01-24 20:53:01 data_drivern_by_file.py[line:80] INFO 搜索“乔丹”,期望“迈克尔”通过
Sun, 2021-01-24 20:53:32 data_drivern_by_file.py[line:80] INFO 搜索“库里”,期望“斯蒂芬”通过
Sun, 2021-01-24 20:54:04 data_drivern_by_file.py[line:80] INFO 搜索“杜兰特”,期望“凯文”通过
Sun, 2021-01-24 20:54:35 data_drivern_by_file.py[line:80] INFO 搜索“詹姆斯”,期望“勒布朗”通过
测试报告:
3. 读取 txt 文件
数据文件:data.txt
hiphop||嘻哈
摔跤爸爸||阿米尔
超人||电影
测试程序
1 from selenium import webdriver
2 import time
3 import traceback
4 import os
5
6
7 # 获取当前目录下的数据文件
8 with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "data.txt")) as fp:
9 data = fp.readlines()
10
11 driver = webdriver.Chrome()
12 # 存放每组数据的测试结果
13 test_result = []
14
15 # 读取每一行测试数据
16 for i in range(len(data)):
17 try:
18 driver.get("http://www.baidu.com")
19 driver.find_element_by_id("kw").send_keys(data[i].split("||")[0].strip())
20 driver.find_element_by_id("su").click()
21 time.sleep(3)
22 assert data[i].split('||')[1].strip() in driver.page_source
23 test_result.append(data[i].strip()+u"||成功\n")
24 print (data[i].split('||')[0].strip()+u"搜索测试执行成功")
25 except AssertionError as e:
26 print (data[i].split('||')[1].strip()+u"测试断言失败")
27 test_result.append(data[i].strip()+u"||断言失败\n")
28 traceback.print_exc()
29 except Exception as e:
30 print (data[i].split('||')[1].strip()+u"测试执行失败")
31 test_result.append(data[i].strip()+u"||异常失败\n")
32 traceback.print_exc()
33
34 # 新建txt文件存放测试结果
35 with open(u"result.txt","w") as fp:
36 fp.writelines(test_result)
37
38 driver.quit()
测试结果:result.txt
hiphop||嘻哈||成功
摔跤爸爸||阿米尔||成功
超人||电影||成功
4. 读取 excel 文件
示例 1:使用 openpyxl 读取 excel 测试数据,并回写 excel 中的测试结果。
数据文件:data.xlsx
测试程序
1 from selenium import webdriver
2 import time
3 import datetime
4 from openpyxl import *
5
6
7 wb = load_workbook('data.xlsx')
8 ws = wb.active # 获取第一个sheet
9 print("最大行号:", ws.max_row)
10
11 driver = webdriver.Chrome()
12 test_result = []
13
14 # openpyxl读取excel的行号和列号是从1开始的,所以这里从2(1是标题行)开始迭代遍历测试数据
15 # 且使用切片,必须有结束行的索引号,不能写为[1:]
16 for row in ws[2: ws.max_row]:
17 print(row[1], row[2]) # 该索引方式则从0开始
18 try:
19 driver.get("http://www.baidu.com")
20 driver.find_element_by_id("kw").send_keys(row[1].value)
21 driver.find_element_by_id("su").click()
22 time.sleep(3)
23 assert row[2].value in driver.page_source
24 row[3].value = time.strftime('%Y-%m-%d %H:%M:%S')
25 row[4].value = "成功"
26 except AssertionError as e:
27 row[3].value = time.strftime('%Y-%m-%d %H:%M:%S')
28 row[4].value = "断言失败"
29 except Exception as e:
30 row[3].value = time.strftime('%Y-%m-%d %H:%M:%S')
31 row[4].value = "出现异常失败"
32
33 driver.quit()
34 wb.save(u"data.xlsx") # 注意:该方式将直接覆盖,不是更新
执行结果:data.xlsx
示例 2:使用 ddt 读取 excel 数据,并将测试结果写入日志文件
数据文件:data.xlsx
excel 操作的工具类:ExcelUtil.py
1 from openpyxl import load_workbook
2
3
4 class ParseExcel:
5
6 def __init__(self, excelPath, sheetName):
7 # 将要读取的excel加载到内存
8 self.wb = load_workbook(excelPath)
9 # 通过工作表名称获取一个工作表对象
10 self.sheet = self.wb.get_sheet_by_name(sheetName)
11 # 获取工作表中存在数据的区域的最大行号
12 self.maxRowNum = self.sheet.max_row
13
14 def getDatasFromSheet(self):
15 # 用于存放从工作表中读取出来的数据
16 dataList = []
17 # 因为工作表中的第一行是标题行,所以需要去掉
18 for line in self.sheet.rows:
19 # 遍历工作表中数据区域的每一行,
20 # 并将每行中各个单元格的数据取出存于列表tmpList中,
21 # 然后再将存放一行数据的列表添加到最终数据列表dataList中
22 tmpList = []
23 tmpList.append(line[1].value)
24 tmpList.append(line[2].value)
25 dataList.append(tmpList)
26 # 将获取工作表中的所有数据的迭代对象返回
27 return dataList[1:]
28
29
30 if __name__ == '__main__':
31 excelPath = 'data.xlsx'
32 sheetName = "搜索数据表"
33 pe = ParseExcel(excelPath, sheetName)
34 print (pe.getDatasFromSheet())
35 for i in pe.getDatasFromSheet():
36 print (i[0], i[1])
执行结果:
[['邓肯', '蒂姆111'], ['乔丹', '迈克尔'], ['库里', '斯蒂芬']]
邓肯 蒂姆111
乔丹 迈克尔
库里 斯蒂芬
测试程序
1 # encoding=utf-8
2 from selenium import webdriver
3 import unittest, time
4 import logging, traceback
5 import ddt
6 from ExcelUtil import ParseExcel
7 from selenium.common.exceptions import NoSuchElementException
8
9
10 # 初始化日志对象
11 logging.basicConfig(
12 # 日志级别
13 level = logging.INFO,
14 # 日志格式
15 # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
16 format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
17 # 打印日志的时间
18 datefmt = '%a, %Y-%m-%d %H:%M:%S',
19 # 日志文件存放的目录(目录必须存在)及日志文件名
20 filename = 'dataDriveRreport.log',
21 # 打开日志文件的方式
22 filemode = 'w'
23 )
24
25 excelPath = 'data.xlsx'
26 sheetName = "搜索数据表"
27
28 # 创建ParseExcel类的实例对象
29 excel = ParseExcel(excelPath, sheetName)
30
31 @ddt.ddt
32 class TestDemo(unittest.TestCase):
33
34 def setUp(self):
35 self.driver = webdriver.Chrome()
36
37 @ddt.data(*excel.getDatasFromSheet()) # 解包二维列表中的每组子列表数据
38 def test_dataDrivenByFile(self, data):
39 print("*****", data)
40 testData, expectData = tuple(data)
41 url = "http://www.baidu.com"
42 # 访问百度首页
43 self.driver.get(url)
44 # 将浏览器窗口最大化
45 self.driver.maximize_window()
46 print (testData, expectData)
47 # 设置隐式等待时间为10秒
48 self.driver.implicitly_wait(10)
49
50 try:
51 # 获取当前的时间戳,用于后面计算查询耗时用
52 start = time.time()
53 # 获取当前时间的字符串,表示测试开始时间
54 startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
55 # 找到搜索输入框,并输入测试数据
56 self.driver.find_element_by_id("kw").send_keys(testData)
57 # 找到搜索按钮,并点击
58 self.driver.find_element_by_id("s").click()
59 time.sleep(3)
60 # 断言期望结果是否出现在页面源代码中
61 self.assertTrue(expectData in self.driver.page_source)
62 end=time.time()
63 print("搜索%s,期望%s" %(testData, expectData))
64 except NoSuchElementException as e:
65 logging.error("查找的页面元素不存在,异常堆栈信息:" + str(traceback.format_exc()))
66 except AssertionError as e:
67 print("断言失败了")
68 logging.info("搜索“%s”,期望“%s”,失败" % (testData, expectData))
69 except Exception as e:
70 logging.error("未知错误,错误信息:" + str(traceback.format_exc()))
71 else:
72 logging.info("搜索“%s”,期望“%s”通过,耗时%s秒" % (testData, expectData, (end-start)/1000))
73
74 def tearDown(self):
75 self.driver.quit()
76
77
78 if __name__ == '__main__':
79 unittest.main()
执行结果:dataDriveRreport.log
Fri, 2021-01-22 23:56:42 data_drivern_by_excel.py[line:67] INFO 搜索“邓肯”,期望“蒂姆111”,失败
Fri, 2021-01-22 23:57:15 data_drivern_by_excel.py[line:71] INFO 搜索“乔丹”,期望“迈克尔”通过,耗时0.004345748424530029秒
Fri, 2021-01-22 23:57:48 data_drivern_by_excel.py[line:71] INFO 搜索“库里”,期望“斯蒂芬”通过,耗时0.004197439908981323秒
5. 连接 mysql
数据表等创建语句:Sql.py
1 # 创建test数据库sql语句
2 create_database = 'CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;'
3
4 # 创建testdata表
5 drop_table_if_exist_sql="drop table if exists testdata;"
6
7 create_table = """
8 create table testdata(
9 id int not null auto_increment comment '主键',
10 bookname varchar(40) unique not null comment '书名',
11 author varchar(30) not null comment '作者',
12 test_result varchar(30) default null,
13 primary key(id)
14 )engine=innodb character set utf8 comment '测试数据表';
15 """
初始化数据操作:DatabaseInit.py
1 import pymysql
2 from Sql import *
3
4
5 # 本类用于完成初始化数据操作
6 # 创建数据库,创建数据表,向表中插入测试数据
7 class DataBaseInit(object):
8
9 def __init__(self, host, port, dbName, username, password, charset):
10 self.host = host
11 self.port = port
12 self.db = dbName
13 self.user = username
14 self.passwd = password
15 self.charset = charset
16
17 def create(self):
18 try:
19 # 连接mysql数据库
20 conn = pymysql.connect(
21 host = self.host,
22 port = self.port,
23 user = self.user,
24 passwd = self.passwd,
25 charset = self.charset
26 )
27 # 获取数据库游标
28 cur = conn.cursor()
29 # 创建数据库
30 cur.execute(create_database)
31 # 选择创建好的gloryroad数据库
32 conn.select_db("gloryroad")
33 # 创建测试表
34 cur.execute(drop_table_if_exist_sql)
35 cur.execute(create_table)
36 except pymysql.Error as e:
37 raise e
38 else:
39 # 关闭游标
40 cur.close()
41 # 提交操作
42 conn.commit()
43 # 关闭连接
44 conn.close()
45 print (u"创建数据库及表成功")
46
47 def insertDatas(self):
48 try:
49 # 连接mysql数据库中具体某个库
50 conn = pymysql.connect(
51 host = self.host,
52 port = self.port,
53 db = self.db,
54 user = self.user,
55 passwd = self.passwd,
56 charset = self.charset
57 )
58 cur = conn.cursor()
59 # 向测试表中插入测试数据
60 sql = "insert into testdata(bookname, author) values(%s, %s);"
61 res = cur.executemany(sql, [('Selenium WebDriver实战宝典', '吴晓华'),
62 ('HTTP权威指南', '古尔利'),
63 ('探索式软件测试', '惠特克'),
64 ('暗时间', '刘未鹏')])
65 except pymysql.Error as e:
66 raise e
67 else:
68 conn.commit()
69 print (u"初始数据插入成功")
70 # 确认插入数据成功
71 cur.execute("select * from testdata;")
72 for i in cur.fetchall():
73 print (i[1], i[2])
74 cur.close()
75 conn.close()
76
77
78 if __name__ == '__main__':
79 db = DataBaseInit(
80 host="localhost",
81 port=3306,
82 dbName="xxx",
83 username="xxx",
84 password="xxx",
85 charset="utf8"
86 )
87 db.create()
88 db.insertDatas()
89 print ("数据库初始化结束")
mysql 操作工具类:MysqlUtil.py
1 import pymysql
2 from DatabaseInit import DataBaseInit
3
4
5 class MyMySQL(object):
6
7 def __init__(self, host, port, dbName, username, password, charset):
8 # 进行数据库初始化
9 dbInit = DataBaseInit(host, port, dbName, username, password, charset)
10 dbInit.create()
11 dbInit.insertDatas()
12 self.conn = pymysql.connect(
13 host = host,
14 port = port,
15 db = dbName,
16 user = username,
17 passwd = password,
18 charset = charset
19 )
20 self.cur = self.conn.cursor()
21
22 def getDataFromDataBases(self):
23 # 从testdata表中获取需要的测试数据
24 # bookname作为搜索关键词,author作为预期关键词
25 self.cur.execute("select bookname, author from testdata;")
26 # 从查询区域取回所有查询结果
27 datasTuple = self.cur.fetchall()
28 return datasTuple
29
30 def closeDatabase(self):
31 # 数据库后期清理工作
32 self.cur.close()
33 self.conn.commit()
34 self.conn.close()
35
36
37 if __name__ == '__main__':
38 db = MyMySQL(
39 host = "localhost",
40 port = 3306,
41 dbName = "xxx",
42 username = "xxx",
43 password = "xxx",
44 charset = "utf8"
45 )
46 print (db.getDataFromDataBases())
测试程序
1 from selenium import webdriver
2 import time
3 import pymysql
4
5
6 def get_test_data():
7 conn = pymysql.connect(
8 host = "127.0.0.1",
9 port = 3306,
10 user = "xxx",
11 passwd = "xxx" ,
12 db = "xxx",
13 charset = "utf8"
14 )
15 # 使用cursor()方法获取数据库的操作游标
16 cursor = conn.cursor()
17 cursor.execute("select * from testdata;")
18 resSet = cursor.fetchall()
19 print("共%s条数据。" % len(resSet))
20 print(resSet)
21 # 关闭游标
22 cursor.close()
23 # 提交事务
24 conn.commit()
25 # 关闭数据库连接
26 conn.close()
27 return resSet
28
29 def update_test_result(data,result):
30 conn = pymysql.connect(
31 host = "127.0.0.1",
32 port = 3306,
33 user = "root",
34 passwd = "gloryroad" ,
35 db = "gloryroad",
36 charset = "utf8"
37 )
38 # 使用cursor()方法获取数据库的操作游标
39 cursor = conn.cursor()
40 print('update testdata set test_result="'+result+'" where bookname="'+data+'";')
41 update=cursor.execute('update testdata set test_result="'+result+'" where bookname="'+data+'";')
42
43 print( u"修改语句受影响的行数:", update)
44 # 关闭游标
45 cursor.close()
46 # 提交事务
47 conn.commit()
48 # 关闭数据库连接
49 conn.close()
50
51 driver=webdriver.Ie(executable_path="e:\\IEDriverServer")
52 test_result=[]
53
54 for data in get_test_data():
55 print("-------------", data)
56 try:
57 driver.get("http://www.baidu.com")
58 driver.find_element_by_id("kw").send_keys(data[1])
59 driver.find_element_by_id("su").click()
60 time.sleep(3)
61 assert data[2] in driver.page_source
62 update_test_result(data[1], "成功")
63 except AssertionError as e:
64 print( data[2] + "断言失败")
65 update_test_result(data[1], "断言失败")
66 except Exception as e:
67 print(e)
68 print(data[1] + "测试执行出现异常")
69 update_test_result(data[1], "执行出现异常")
70
71 driver.quit()
数据驱动 - 不同数据源的读取方式(ddt、数据文件、mysql)的更多相关文章
- impala 表迁移方式 partquet数据文件移动方法
1.原表查询:select count(*) from edm.ucard_wxd0123 where stat_dt = '2024-01-09' and id_no = '110101199003 ...
- 简单学习一下ibd数据文件解析
来源:原创投稿 作者:花家舍 简介:数据库技术爱好者. GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简单学习一下数据文件解析 这是尝试使用Golang语言简单解析My ...
- 【基础】Oracle 表空间和数据文件
多个表空间的优势:1.能够将数据字典与用户数据分离出来,避免由于字典对象和用户对象保存在同一个数据文件中而产生的I/O冲突2.能够将回退数据与用户数据分离出来,避免由于硬盘损坏而导致永久性的数据丢失3 ...
- Oracle OMF管理数据文件
1.什么是OMF? Oracle managed file的缩写,简单的理解,就是oracle自己管理自己的文件,可以是dbf,redolog 等等,具体可以参考官方文档Adiministrator中 ...
- 模拟主库创建数据文件,dg备库空间不足时问题处理
本篇文档测试目的: 模拟实际环境中,主库对表空间添加数据文件,备库空间不足,最终导致MRP进程自动断开,处理方式. 1.问题环境模拟 1)正常情况下的dg 主库创建数据文件,备库接受日志,自动创建表空 ...
- OleDbDataReader快速数据读取方式
查询得到OleDbDataReader后,有三种方式支持数据读取,如下: //方法一**速度中等 OleDbDataReader reader = command.ExecuteReader(); w ...
- geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探
在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...
- XML数据读取方式性能比较(一)
原文:XML数据读取方式性能比较(一) 几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了.现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较 ...
- XML教程、语法手册、数据读取方式大全
XML简单易懂教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 XML --数据格式的写法 二 Re ...
随机推荐
- 微信小程序:点击预览大图功能
点击预览大图功能 1. 给轮播图swiper-item绑定点击事件 2. 预览功能的本质是调用了小程序的api:previewImage 微信公众号----文档----开发----API----媒体- ...
- 永远不要眼高手低,Vue完整实现一套简单的增删改查CURD操作
1: 永远不要眼高手低,看起来很简单,但是你从来没有去动手试一下,就不知道其中真正需要注意的许多细节, 2:完整code如下: 1 <!DOCTYPE html> 2 <html l ...
- C#语言特性及发展史
本文按照C#语言的发展历史,介绍C#每个版本的新增特性,主要参考微软官方文档.了解这些语言特性可以帮助我们更高效的编写C#代码. C# 1.0 与Visual Studio .NET 2002一起发布 ...
- 翻译:《实用的Python编程》03_01_Script
目录 | 上一节 (2.7 对象模型) | 下一节 (3.2 深入函数) 3.1 脚本 在该部分,我们将深入研究编写 Python 脚本的惯例. 什么是脚本? 脚本就是运行和终止一系列语句的程序. # ...
- linux开启FTP服务
目录 打开FTP服务 客户端链接时会出现的问题 打开FTP服务 先ping,查看网络是否联通 打开ssh服务 查看一些服务的状态 #查看ssh状态 service sshd status #防火墙的状 ...
- 企业安全_DNS流量监控的技术选型
方案1 Windows server n ---> packbeat ---> logstash ---> kafka | ┗ ---------> elasticsearch ...
- 《C++ Primer》笔记 第8章 IO库
iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型. 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制 ...
- #progma pack(x)说明
1.字节对齐(内存相关) 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数 ...
- Hi3559AV100板载开发系列-pthread_create()下V4L2接口MJPEG像素格式的VIDIOC_DQBUF error问题解决-采用阻塞方式下select监听
最近一直加班加点进行基于Hi3559AV100平台的BOXER-8410AI板载开发,在开发的过程中,遇到了相当多的问题,其一是板载的开发资料没有且功能不完整,厂家不提供太多售后技术支持,厂家对部分 ...
- [个人总结]pytorch中model.eval()会对哪些函数有影响?
来源于知乎:pytorch中model.eval()会对哪些函数有影响? - 蔺笑天的回答 - 知乎 https://www.zhihu.com/question/363144860/answer/9 ...