数据驱动python

数据驱动:程序不变,数据变
首先自定义一个data.txt文件,下面附data.txt文件内容供参考
data.txt
gloryroad test||光荣之路
摔跤爸爸||阿米尔
超人||电影
data_driven_by_txt_file.py
适合做局部自动化:

#encoding=utf-8
from selenium import webdriver
import time
import traceback
with open(u"E:\\PythonDemo\\Glory\\20190224\\data.txt") as fp:
    data=fp.readlines()

driver=webdriver.Ie(executable_path="d:\\chromedriver.exe")
test_result=[]
for i in range(len(data)):
    try:
        driver.get("http://www.baidu.com")

        driver.find_element_by_id("kw").send_keys(\
        data[i].split("||")[0].strip())
        driver.find_element_by_id("su").click()
        time.sleep(3)
        assert data[i].split('||')[1].strip()\
        in driver.page_source
        test_result.append(data[i].strip()+u"||成功\n")
        print (data[i].split('||')[0].strip()+u"搜索测试执行成功")
    except AssertionError as e:
        print (data[i].split('||')[1].strip()+u"测试断言失败")
        test_result.append(data[i].strip()+u"||断言失败\n")
    except Exception as e:
        print (data[i].split('||')[1].strip()+u"测试执行失败")
        test_result.append(data[i].strip()+u"||异常失败\n")
        traceback.print_exc()
with open(u"result.txt","w") as fp:
            fp.writelines(test_result)
#driver.quit()

优化第2种方法:
换了路径

#encoding=utf-8
from selenium import webdriver
import time
import traceback
with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),"data.txt")) as fp:
    data=fp.readlines()

driver=webdriver.Ie(executable_path="e:\\IEDriverServer")
test_result=[]
for i in range(len(data)):
    try:
        driver.get("http://www.baidu.com")
        driver.find_element_by_id("kw").send_keys(\
        data[i].split("||")[0].strip())
        driver.find_element_by_id("su").click()
        time.sleep(3)
        assert data[i].split('||')[1].strip()\
        in driver.page_source
        test_result.append(data[i].strip()+u"||成功\n")
        print (data[i].split('||')[0].strip()+u"搜索测试执行成功")
    except AssertionError as e:
        print (data[i].split('||')[1].strip()+u"测试断言失败")
        test_result.append(data[i].strip()+u"||断言失败\n")
    except Exception as e:
        print (data[i].split('||')[1].strip()+u"测试执行失败")
        test_result.append(data[i].strip()+u"||异常失败\n")
        traceback.print_exc()

with open(u"result.txt","w") as fp:
            fp.writelines(test_result)
driver.quit()

data_driven_by_xml.py

#encoding=utf-8
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from XmlUtil import ParseXML
from selenium.common.exceptions import NoSuchElementException

#初始化日志对象
logging.basicConfig(
    # 日志级别
    level = logging.INFO,
    # 日志格式
    # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
    format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    # 打印日志的时间
    datefmt = '%a, %Y-%m-%d %H:%M:%S',
    # 日志文件存放的目录(目录必须存在)及日志文件名
    filename = 'e:/dataDriveRreport.log',
    # 打开日志文件的方式
    filemode = 'a'
)

#创建ParseXML类实例对象
xml = ParseXML("TestData.xml")

@ddt.ddt
class TestDemo(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Ie(executable_path = "e:\\IEDriverServer")

    @ddt.data(*xml.getDataFromXml("book"))
    def test_dataDrivenByFile(self, data):
        testData, expectData = data["name"], data["author"]
        url = "http://www.baidu.com"
        # 访问百度首页
        self.driver.get(url)
        # 将浏览器窗口最大化
        self.driver.maximize_window()
        print (testData, expectData)
        # 设置隐式等待时间为10秒
        self.driver.implicitly_wait(10)

        try:
            # 找到搜索输入框,并输入测试数据
            self.driver.find_element_by_id("kw").send_keys(testData)
            # 找到搜索按钮,并点击
            self.driver.find_element_by_id("su").click()
            time.sleep(3)
            # 断言期望结果是否出现在页面源代码中
            self.assertTrue(expectData in self.driver.page_source)
        except NoSuchElementException as e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
                          + str(traceback.format_exc()))
        except AssertionError as e:
            logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
        except Exception as e:
            logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
        else:
            logging.info(u"搜索“%s”,期望“%s”通过" %(testData, expectData))

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

解包:
前面加* 是解包,如下面的例子

def print_sth(a,b,*c):
    print(a,b)
    print(len(c))

print_sth(*[100,200,300,400])

基于XML做数据驱动 程序不变 数据变
涉及到3个例子:
data_driven_by_xml.py
TestData.xml
XmlUtil.py
就是这3个文件 就是一个简单的数据驱动框架 上面如果是txt 那就是基于txt文件做数据驱动
data_driven_by_xml.py

#encoding=utf-8
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from XmlUtil import ParseXML
from selenium.common.exceptions import NoSuchElementException

#初始化日志对象
logging.basicConfig(
    # 日志级别
    level = logging.INFO,
    # 日志格式
    # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
    format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    # 打印日志的时间
    datefmt = '%a, %Y-%m-%d %H:%M:%S',
    # 日志文件存放的目录(目录必须存在)及日志文件名
    filename = 'e:/dataDriveRreport.log',
    # 打开日志文件的方式
    filemode = 'a'
)

#创建ParseXML类实例对象
xml = ParseXML(r"E:\PythonDemo\Glory\20190224\TestData.xml")

@ddt.ddt
class TestDemo(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Ie(executable_path = "d:\\chromedriver.exe")

    @ddt.data(*xml.getDataFromXml("book"))
    def test_dataDrivenByXml(self, data):
        testData, expectData = data["name"], data["author"]
        url = "http://www.baidu.com"
        # 访问百度首页
        self.driver.get(url)
        # 将浏览器窗口最大化
        self.driver.maximize_window()
        print (testData, expectData)
        # 设置隐式等待时间为10秒
        self.driver.implicitly_wait(10)

        try:
            # 找到搜索输入框,并输入测试数据
            self.driver.find_element_by_id("kw").send_keys(testData)
            # 找到搜索按钮,并点击
            self.driver.find_element_by_id("su").click()
            time.sleep(3)
            # 断言期望结果是否出现在页面源代码中
            self.assertTrue(expectData in self.driver.page_source)
        except NoSuchElementException as e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
                          + str(traceback.format_exc()))
        except AssertionError as e:
            logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
        except Exception as e:
            logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
        else:
            logging.info(u"搜索“%s”,期望“%s”通过" %(testData, expectData))

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

TestData.xml

<?xml version="1.0" encoding="utf-8"?>
<bookList type="technology">
    <book>
        <name>Selenium WebDriver实战宝典</name>
        <author>吴晓华</author>
    </book>
    <book>
        <name>HTTP权威指南</name>
        <author>古尔利</author>
    </book>
    <book>
        <name>探索式软件测试</name>
        <author>惠特克</author>
    </book>
</bookList>

XmlUtil.py
#encoding=utf-8
from xml.etree import ElementTree

‘’’
步骤:
1 读取xml –init()
2 获取root节点–getroot()
3 获取root节点下的book所有节点 —findNodeByName
4 将book节点下的所有信息放到dict里面—findNodeByName
5 将所有book节点的dict放到datalist,来做数据驱动————getDataFromXml
‘’’

class ParseXML(object):
    def __init__(self, xmlPath):
        self.xmlPath = xmlPath

    def getRoot(self):
        # 打开将要解析的xml文件
        tree = ElementTree.parse(self.xmlPath)
        # 获取xml文件的根节点对象,也就是树的根
        # 然后返回给调用者
        return tree.getroot()

    def findNodeByName(self, parentNode, nodeName):
        # 通过节点的名字,获取节点对象
        nodes = parentNode.findall(nodeName)
        return nodes

    def getNodeOfChildText(self, node):
        # 获取节点node下所有子节点的节点名作为key,
        # 文本节点作为value组成的字典对象,若从0开始,则包含父节点的标签,例如book
        childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}
        
        #print( childrenTextDict)
        # 上面代码等价于下面代码
        '''
        childrenTextDict = {}
        for i in list(node.iter())[1:]:
            childrenTextDict[i.tag] = i.text
        '''
        return childrenTextDict

    def getDataFromXml(self,data_name):
        # 获取xml文档树的根节点对象
        root = self.getRoot()
        # 获取根节点下所有名叫book的节点对象
        books = self.findNodeByName(root, data_name)
        dataList = []
        # 遍历获取到的所有book节点对象,
        # 取得需要的测试数据
        for book in books:
            childrenText = self.getNodeOfChildText(book)
            dataList.append(childrenText)
        print( dataList)
        return dataList

if __name__ == '__main__':
    xml = ParseXML(r"TestData.xml")
    datas = xml.getDataFromXml("book")
    #for i in datas:
    #    print( i["name"], i["author"]

数据驱动例子3:
基于Excel做数据驱动
结果可以显示了,因为excel经常用
前置条件是 >py -3 -m pip install openpyxl==2.5.4
ExcelUtil.py
data.xlsx
data_drivern_by_excel.py 一个没有用ddt的
data_drivern_by_excel_1.py ddt
这2个data2种文件 2种框架
数据库做数据驱动 主要用在平台:

ExcelUtil.py

#encoding=utf-8
from openpyxl import load_workbook

class ParseExcel(object):

    def __init__(self, excelPath, sheetName):
        # 将要读取的excel加载到内存
        self.wb = load_workbook(excelPath)
        # 通过工作表名称获取一个工作表对象
        self.sheet = self.wb.get_sheet_by_name(sheetName)
        # 获取工作表中存在数据的区域的最大行号
        self.maxRowNum = self.sheet.max_row

    def getDatasFromSheet(self):
        # 用于存放从工作表中读取出来的数据
        dataList = []
        # 因为工作表中的第一行是标题行,所以需要去掉
        for line in self.sheet.rows:  
            # 遍历工作表中数据区域的每一行,
            # 并将每行中各个单元格的数据取出存于列表tmpList中,
            # 然后再将存放一行数据的列表添加到最终数据列表dataList中
            tmpList = []
            tmpList.append(line[1].value)
            tmpList.append(line[2].value)
            dataList.append(tmpList)
        # 将获取工作表中的所有数据的迭代对象返回
        return dataList[1:]

if __name__ == '__main__':
    excelPath = u'data.xlsx'
    sheetName = u"搜索数据表"
    pe = ParseExcel(excelPath, sheetName)
    print (pe.getDatasFromSheet())
    for i in pe.getDatasFromSheet():
        print (i[0], i[1])

data.xlsx
序号 搜索词 期望结果 测试时间 测试结果
1 邓肯 蒂姆111
2 乔丹 迈克尔
3 库里 斯蒂芬

data_drivern_by_excel.py

#encoding=utf-8
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from ExcelUtil import ParseExcel
from selenium.common.exceptions import NoSuchElementException

#初始化日志对象
logging.basicConfig(
    # 日志级别
    level = logging.INFO,
    # 日志格式
    # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
    format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    # 打印日志的时间
    datefmt = '%a, %Y-%m-%d %H:%M:%S',
    # 日志文件存放的目录(目录必须存在)及日志文件名
    filename = 'e:/dataDriveRreport.log',
    # 打开日志文件的方式
    filemode = 'w'
)

excelPath = u'data.xlsx'
sheetName = u"搜索数据表"
#创建ParseExcel类的实例对象
excel = ParseExcel(excelPath, sheetName)

@ddt.ddt
class TestDemo(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Ie(executable_path = "d:\\chromedriver.exe")

    @ddt.data(*excel.getDatasFromSheet())
    def test_dataDrivenByFile(self, data):
        testData, expectData = tuple(data)
        url = "http://www.baidu.com"
        # 访问百度首页
        self.driver.get(url)
        # 将浏览器窗口最大化
        self.driver.maximize_window()
        print (testData, expectData)
        # 设置隐式等待时间为10秒
        self.driver.implicitly_wait(10)

        try:
            # 获取当前的时间戳,用于后面计算查询耗时用
            start = time.time()
            # 获取当前时间的字符串,表示测试开始时间
            startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            # 找到搜索输入框,并输入测试数据
            self.driver.find_element_by_id("kw").send_keys(testData)
            # 找到搜索按钮,并点击
            self.driver.find_element_by_id("su").click()
            time.sleep(3)
            # 断言期望结果是否出现在页面源代码中
            self.assertTrue(expectData in self.driver.page_source)
            print (u"搜索%s,期望%s" %(testData, expectData))
        except NoSuchElementException as e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
                          + str(traceback.format_exc()))
        except AssertionError as e:
            print("断言失败了")
            logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
        except Exception as e:
            logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
        else:
            logging.info(u"搜索“%s”,期望“%s”通过" %(testData, expectData))

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

data_drivern_by_excel_1.py

#encoding=utf-8
from selenium import webdriver
import time
import datetime
from openpyxl import *
wb=load_workbook(u'E:\\PythonDemo\\Glory\\20190224\\data.xlsx')
ws=wb.active  #获取第一个sheet
print (u"最大行号:",ws.max_row)


#excel行是从1开始的,所以我们从2开始迭代遍历
#且使用切片,必须有结束行的索引号,不能写为[1:],这样不行
#列号是从0开始的,列取出来是个元组
driver=webdriver.Ie(executable_path="e:\\IEDriverServer")
test_result=[]
for row in ws[2:ws.max_row]:
    print (row[1],row[2])
    try:
        driver.get("http://www.baidu.com")
        driver.find_element_by_id("kw").send_keys(row[1].value)
        driver.find_element_by_id("su").click()
        time.sleep(3)
        assert row[2].value in driver.page_source
        row[3].value=time.strftime('%Y-%m-%d %H:%M:%S')
        row[4].value=u"成功"
    except AssertionError as e:
        row[3].value=time.strftime('%Y-%m-%d %H:%M:%S')
        row[4].value=u"断言失败"
    except Exception as e:
        row[3].value=time.strftime('%Y-%m-%d %H:%M:%S')
        row[4].value=u"出现异常失败"

driver.quit()
wb.save(u"E:\\PythonDemo\\Glory\\20190224\\data.xlsx")  #注意:将直接覆盖,不是更新。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值