自动化测试框架 —— 数据驱动

1520 篇文章 61 订阅
1432 篇文章 54 订阅

1、数据驱动概述

相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动。

例如:测试网站的登录功能,自动化测试工程师想验证不同的用户名和密码在网站登录时对系统影响,就可以使用数据驱动模式来进行自动化测试。


实施数据驱动测试步骤如下:
(1)编写测试脚本,脚本需要支持从程序对象、文件或数据库读入测试数据。
(2)将测试脚本使用的测试数据存入程序对象、文件或数据库等外部介质中。
(3)运行脚本过程中,循环调用存储在外部介质中的测试数据。
(4)验证所有的测试结果是否符合预期结果。

数据存储介质包括:ddt、文件(json,txt,excel,xml)、数据库

2、数据驱动单元测试的环境准备-安装ddt

(1)进入cmd,输入命令 pip install ddt,回车进行安装
(2)安装完成后,在python交互模式下,执行"import ddt",如果未报错,则说明安装成功
(3)pip安装失败的可以在https://pypi.python.org/pypi/ddt下载ddt的源码包进行安装
(4)解压下载的压缩包,将cmd当前工作目录切换到setup.py文件所在的目录,并执行"python setup.py install"进行安装

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

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

测试逻辑:

(1)打开百度首页
(2)在搜索框输入一个搜索关键字
(3)单击搜索按钮
(4)验证搜索结果页面是否包含预期关键字串,包含则认为测试执行通过,否则认为测试执行失败,并在测试过程中打印日志

#encoding=utf-8
import unittest,time,ddt
from selenium import webdriver
import logging,traceback
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,%d %b %Y %H: %M: %S",
    #日志文件存放的目录(目录必须存在)及日志文件名
    filename = "D:\\test\\DataDrivenTesting\\report.log",
    #打开日志文件的方式
    filemode = "w"
)

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

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

    @ddt.data([u"神奇动物在哪里",u"叶茨"],
              [u"疯狂动物城",u"古德温"],
              [u"大话西游之月光宝盒",u"周星驰"])
    @ddt.unpack
    def test_dataDrivenByDdt(self,testdata,expectdata):
        url = "http://www.baidu.com"
        self.driver.get(url)
        #设置隐式等待时间为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,e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息:"+str(traceback.format_exc()))
        except AssertionError,e:
            #注意引号格式
            logging.info(u"搜索“%s”,期望“%s”,失败" % (testdata,expectdata))
        except Exception,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()

4、使用数据文件(json)进行数据驱动

测试逻辑:

(1)打开百度首页
(2)从扩展名为json的文件中读出测试相关数据,并将要查询的数据输入搜索框中
(3)单击搜索按钮
(4)断言搜索结果页面是否包含文本文件中提供的预期关键字串,包含则认为测试执行通过,否则认为测试执行失败,并生成自定义的html测试报告


测试数据文件准备:

Pycharm中新建一个名叫DataDrivenProject的Python工程,在该工程下新建test_data_list.json、ReportTemplate.py以及DataDrivenTestByJson.py三个文件。

文件test_data_list.json用于存放测试所需要的测试数据,具体内容如下:
[
    "邓肯||蒂姆",
    "乔丹||迈克尔",
    "库里||斯蒂芬",
    "杜兰特||凯文",
    "詹姆斯||勒布朗"
]

文件ReportTemplate.py用于生成自定义HTML测试报告,具体内容如下:

# encoding=utf-8

def htmlTemplate(url, trData):
    htmlStr = u'''<!DOCTYPE HTML>
    <html>
    <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>单元测试报告</title>
    <style>
    body {
        width: 80%; /*整个body区域占浏览器的宽度百分比*/
        margin: 40px auto; /*整个body区域相对浏览器窗口摆放位置(左右,上下)*/
        font-weight: bold; /*整个body区域的字体加粗*/
        font-family: 'trebuchet MS', 'Lucida sans', SimSun; /*表格中文字的字体类型*/
        font-size: 18px; /*表格中文字字体大小*/
        color: #000; /*整个body区域字体的颜色*/
    }
    table {
        *border-collapse: collapse; /*合并表格边框*/
        border-spacing: 0;  /*表格的边框宽度*/
        width: 100%;     /*整个表格相对父元素的宽度*/
    }
    .tableStyle {
        /*border: solid #ggg 1px;*/
        border-style: outset; /*整个表格外边框样式*/
        border-width: 2px; /*整个表格外边框宽度*/
        /*border: 2px;*/
        border-color: blue; /*整个表格外边框颜色*/
    }
    .tableStyle tr:hover {
        background: rgb(173,216,230); /*鼠标滑过一行时,动态显示的颜色146,208,80*/
    }

    .tableStyle td,.tableStyle th {
        border-left: solid 1px rgb(146,208,80); /*表格的竖线颜色*/
        border-top: 1px solid rgb(146,208,80);  /*表格的横线颜色 */
        padding: 15px;                       /*表格内边框尺寸*/
        text-align: center;                   /*表格内容显示位置*/
    }
    .tableStyle th {
        padding: 15px;        /*表格标题栏,字体的尺寸*/
        background-color: rgb(146,208,80); /*表格标题栏背景颜色*/
        /*表格标题栏设置渐变颜色*/
        background-image: -webkit-gradient(linear, left top, left bottom, from(#92D050), to(#A2D668));
        /*rgb(146,208,80)*/
    }
    </style>
    </head>
    <body>
        <center><h1>测试报告</h1></center><br /><br /><br />

        <table class="tableStyle">
            <thead>
            <tr>
            <th>No</th>
            <th>Search Words</th>
            <th>Assert Words</th>
            <th>Start Time</th>
            <th>Waste Time(s)</th>
            <th>Status</th>
            </tr>
            </thead>'''
    endStr = u'''
        </table>
    </body>
    </html>'''
    # 拼接完整的测试报告HTML页面代码
    html = htmlStr + u"<b>测试网址: " + url + u"</b>" + trData + endStr
    print html
    # 生成.html文件
    with open(u"D:\\test\\DataDrivenTesting\\testTemplate.html", "w") as fp:
        fp.write(html.encode("gbk"))

  文件DataDrivenTestByJson.py用于编写数据驱动测试脚本,具体内容如下:

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

# 如果有no json的报错信息,请将json文件存储为utf-8,with Bom
# 初始化日志对象
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='D:\\test\\DataDrivenTesting\\report.log',
    # 打开日志文件的方式
    filemode='w'
)


@ddt.ddt
class TestDemo(unittest.TestCase):
    url = "http://www.baidu.com"
    no = 0

    @classmethod
    def setUpClass(cls):
        # 整个测试过程只被调用一次
        TestDemo.trStr = ""

    def setUp(self):
        self.driver = webdriver.Ie(executable_path="D:\\IEDriverServer")
        status = None  # 用于存放测试结果状态,失败'fail',成功'pass'
        flag = 0  # 数据驱动测试结果的标志,失败置0,成功置1
        TestDemo.no += 1

    @ddt.file_data("test_data_list.json")
    def test_dataDrivenByFile(self, value):
        # 决定测试报告中状态单元格中内容的颜色
        flagDict = {0: 'red', 1: '#00AC4E'}
        # 访问百度首页
        self.driver.get(TestDemo.url)
        # 将浏览器窗口最大化
        self.driver.maximize_window()
        print value
        # 将从.json文件中读取出的数据用“||”进行分隔成测试数据和期望数据
        testdata, expectdata = tuple(value.strip().split("||"))
        # 设置隐式等待时间为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)
        except NoSuchElementException, e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息:" + str(traceback.format_exc()))
            status = 'fail'
            flag = 0
        except AssertionError, e:
            logging.info(u"搜索“%s”,期望“%s”,失败" % (testdata, expectdata))
            status = 'fail'
            flag = 0
        except Exception, e:
            logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
            status = 'fail'
            flag = 0
        else:
            logging.info(u"搜索“%s”,期望“%s”通过" % (testdata, expectdata))
            status = 'pass'
            flag = 1
        # 计算耗时,从将测试数据输入到输入框中到断言期望结果之间所耗时
        wasteTime = time.time() - start - 3  # 减去强制等待的3秒
        # 每一组数据测试结束后,都将其测试结果信息插入表格行
        # 的HTML代码中,并将这些行HTML代码拼接到变量trStr变量中,
        # 等所有测试数据都被测试结束后,传入htmlTemplate()函数中
        # 生成完整测试报告的HTML代码
        TestDemo.trStr += u'''
        <tr>
            <td>%s</td>
            <td>%s</td>
            <td>%s</td>
            <td>%s</td>
            <td>%.2f</td>
            <td style="color:%s">%s</td>
        </tr><br />''' % (TestDemo.no, testdata, expectdata, startTime, wasteTime, flagDict[flag], status)

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

    @classmethod
    def tearDownClass(cls):

        # 写自定义的html测试报告
        # 整个测试过程只被调用一次
        htmlTemplate(TestDemo.url, TestDemo.trStr)

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

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值