数据驱动 - 不同数据源的读取方式(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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具