自动化测试 数据驱动(自动化测试解决数据错误)

数据驱动将测试数据和测试行为完全分离,实施数据驱动测试步骤如下:A、编写测试脚本,脚本需要支持从程序对象、文件或者数据库读入测试数据;B、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中;C、运行脚本过程中,循环调用存储在外部介质中的测试数据;D、验证所有的测试结果是否符合预期结果; 1、使用unittest和ddt进行数据驱动:#-*-coding…

大家好,又见面了,我是你们的朋友全栈君。

数据驱动将测试数据和测试行为完全分离,实施数据驱动测试步骤如下:

A、编写测试脚本,脚本需要支持从程序对象、文件或者数据库读入测试数据;

B、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中;

C、运行脚本过程中,循环调用存储在外部介质中的测试数据;

D、验证所有的测试结果是否符合预期结果;

 

1、使用unittest和ddt进行数据驱动:

#-*- coding: UTF-8 -*-
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from selenium.common.exceptions import NoSuchElementException

# 初始化日志对象
logging.basicConfig(
    # 日志级别
    level = logging.INFO,

    # 日志格式
    # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
    format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',

    # 打印日志时间
    datafomat='%a, %d %b %Y %H: %M: %S',


    # 日志文件存放的目录及日志文件名
    filename='d:/DataDriverTesting/report.log',

    # 打开日志文件的方式
    filemode='w'
)
@ddt.ddt
class TestDemo(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
    @ddt.data(
        [u"神奇动物在哪里", u"叶"],
        [u"疯狂动物成", u"古德温"],
        [u"大话西游之月光宝盒", u"周星驰"]
    )
    @ddt.unpack
    def test_data(self,testdata, expectdata):
        self.driver.get("http://www.baidu.com")
        self.driver.implicitly_wait(2)

        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,e:
            logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

        except Exception, e:
            logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

        else:
            logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

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

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

 

备注:

在unittest中结合ddt实现数据驱动,首先是在头部导入ddt模块,其次在测试类前声明使用ddt,然后在测试方法前使用@ddt.data()添加该测试方法需要的测试数据,该函数接收一个可迭代的类型,以此来判断需要执行的次数,多组测试数据间以逗号隔开,如果每组数据存在多个,需要将每组数据存于列表中;最后使用@unpack 进行修饰,对测试数据解包,传参;

 

2、使用JSon存储数据实现数据驱动测试:

数据存储:test_data_list.json中

[
  "邓肯||蒂姆",
  "乔丹||迈克尔",
  "库里||斯蒂芬",
  "杜兰特||凯文",
  "詹姆斯||勒布朗"
]

数据和脚本文件要在同一级目录中:

#-*- coding: UTF-8 -*-
from selenium import webdriver
import HTMLTestRunner
import unittest
import time
import logging
import traceback
import ddt
from selenium.common.exceptions import NoSuchElementException

# 初始化日志对象
logging.basicConfig(
    # 日志级别
    level = logging.INFO,

    # 日志格式
    # 时间、代码所在文件名、代码行号、日志级别名字、日志信息
    format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',

    # 打印日志时间
    datafomat='%a, %d %b %Y %H: %M: %S',


    # 日志文件存放的目录及日志文件名
    filename='d:/DataDriverTesting/report.log',

    # 打开日志文件的方式
    filemode='w'
)
@ddt.ddt
class TestDemo(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()

    @ddt.file_data("test_data_list")
    def test_data(self, value):
        self.driver.get("http://www.baidu.com")
        self.driver.implicitly_wait(2)
        testdata, expectdata = tuple(value.strip().split("||"))
        self.driver.implicitly_wait(2)

        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,e:
            logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

        except Exception, e:
            logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

        else:
            logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

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

if __name__ == '__main__':
    suite1 = unittest.TestLoader().loadTestsFromTestCase(TestDemo)
    suite = unittest.TestSuite(suite1)
    filename = "d:\\test.html"
    fp = file(filename,'wb')
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Report_title", description='Report_description')
    runner.run(suite)

 

3、使用Excel进行数据驱动测试:

安装Python解析Excel 2007及以上版本的模块:pip install openpyxl==2.3.3;

在Pycharm上新建一个工程,创建文件测试数据.xlsx文件,sheet名为搜索数据表;

序号 搜索词 期望结果
1 邓肯 蒂姆
2 乔丹 迈克尔
3 库里 斯蒂芬

创建ExcelUtil.py文件:

# -*- coding: 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[1:]:
            # 遍历工作表中数据区域的每一行,并将每行中每个单元格的数据去除存于列表tmpList中
            # 然后再将存放一行数据的列表添加到最终数据列表dataList中
            tmpList = []
            tmpList.append(line[1].value)
            tmpList.append(line[2].value)
            dataList.append(tmpList)
        return dataList


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

创建DataDriven.py文件:

# -*- coding: UTF-8 -*-
from selenium import webdriver
import unittest
import time
import logging
import 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',

    # 打印日志时间
    datafomat='%a, %d %b %Y %H: %M: %S',


    # 日志文件存放的目录及日志文件名
    filename='d:/DataDriverTesting/report.log',

    # 打开日志文件的方式
    filemode='w'
)

excelPath = u"测试数据.xlsx"
sheetName = u"搜索数据表"
excel = ParseExcel(excelPath, sheetName)

@ddt.ddt
class TestDemo(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()

    @ddt.data(*excel.getDatasFromSheet())
    def test_data(self, data):
        testdata,expectdata = tuple(data)
        self.driver.get("http://www.baidu.com")
        print testdata,expectdata
        self.driver.implicitly_wait(2)

        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,e:
            logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

        except Exception, e:
            logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

        else:
            logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

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

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

备注:@ddt.data从excel.getDatasFormSheet()方法中接收一个可迭代的数组对象,以此来判断需要执行的次数。如果@ddt.data()中传的是一个方法,方法前需要加型号(*)修饰;

 

4、使用xml进行数据驱动测试:

在pycharm中创建一个项目,创建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>HTTP</author>
    </book>
    <book>
        <name>探索式软件测试</name>
        <author>惠特克</author>
    </book>
</bookList>

创建XmlUtil.py文件用于解析XML文件,获取测试数据:

# -*- coding: UTF-8 -*-
from xml.etree import ElementTree

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

    def getRoot(self):
        tree = ElementTree.parse(self.xmlPath)
        return tree.getroot()

    def findNodeName(self,parentNode,nodeName):
        nodes = parentNode.findall(nodeName)
        return nodes

    def getNodeOfChildText(self, node):
        # childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}

        childrenTextDict = {}
        for i in list(node.iter())[1:]:
            childrenTextDict[i.tag] = i.text
        return childrenTextDict

    def getDataFromXml(self):
        root = self.getRoot()
        books = self.findNodeName(root, "book")
        dataList = []
        for book in books:
            childrenText = self.getNodeOfChildText(book)
            dataList.append(childrenText)
        return dataList
if __name__=='__main__':
    xml = ParseXML(r'TestData')
    datas = xml.getDataFromXml()
    for i in datas:
        print i['name'],i['author']

创建DataDrivenByXML.py文件用于编写数据驱动测试脚本:

# -*- coding: UTF-8 -*-
from selenium import webdriver
import unittest
import time
import os
import logging
import 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',

    # 打印日志时间
    datafomat='%a, %d %b %Y %H: %M: %S',


    # 日志文件存放的目录及日志文件名
    filename='d:/DataDriverTesting/report.log',

    # 打开日志文件的方式
    filemode='w'
)
'''
# 获取当前文件所在父目录的绝对路径
currentPath = os.path.dirname(os.path.abspath(__file__))

# 获取数据文件的绝对路径
dataFilePath = os.path.join(currentPath, "TestData.xml")

print dataFilePath
'''

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

@ddt.ddt
class TestDemo(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()

    @ddt.data(* xml.getDataFromXml())
    def test_data(self, data):
        testdata, expectdata = data['name'], data['author']
        self.driver.get("http://www.baidu.com")
        print testdata,expectdata
        self.driver.implicitly_wait(2)

        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,e:
            logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

        except Exception, e:
            logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

        else:
            logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

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

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

 

5、使用MySQL数据库记性数据驱动测试:

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125504.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 舵机控制原理和结构图_舵机的相关原理与控制原理

    舵机控制原理和结构图_舵机的相关原理与控制原理原文:https://blog.zeruns.tech/index.php/archives/358/什么是PWM信号PWM,英文名PulseWidthModulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平…

    2025年7月24日
    1
  • 算法的时间复杂度和空间复杂度-总结[通俗易懂]

    算法的时间复杂度和空间复杂度-总结[通俗易懂]算法的时间复杂度和空间复杂度1、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(

    2022年5月14日
    54
  • iOS 签名机制与证书

    iOS 签名机制与证书iOS 签名机制与证书 声明 纯粹就是总结,很多地方跟参考资料一样,就是自己手动打一遍,自己亲自画个图增加理解和加强记忆力,而不只是复制粘贴 iOS 打包流程也不在此叙述,相信很多人已经对照过各种图文

    2022年5月23日
    43
  • pycharm免费版安装教程_pycharm 安装教程

    pycharm免费版安装教程_pycharm 安装教程Pycharm安装教程简单好用

    2025年7月30日
    0
  • 考核题2「建议收藏」

    6.springmvc的工作流程是什么?SpringMVC流程1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controll

    2022年4月11日
    167
  • Java语言中一个字符占几个字节?「建议收藏」

    Java语言中一个字符占几个字节?「建议收藏」要区分清楚内码(internalencoding)和外码(externalencoding)就好了。内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String…

    2022年6月26日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号