自动化测试---被玩坏的数据驱动

最近在整理接口测试相关的资料,所以,看到有关资料就会多看两眼。偶看到别人发的微信公众号。

Python接口测试框第一篇  --- python如何读取txt文件。

Python接口测试框第三篇  --- python如何读取XML文件。

Python接口测试框第四篇  --- python如何读取CSV文件。

曾几何时,也许某大牛说,搞自动化必须要把测试数据放文件里,然后通过程序读取文件。于是,大家纷纷效仿。

什么?你做自动化测试居然不读取测试数据文件,一看就是新手,没逼格。

小王啊!我们这个自动化框架一定得做数据与代码分离,得读取文件啊!

在这个全民微信的年代,各位大牛开了公从号,传授大家自动化测试技术,教点啥呢?那我们就从读取数据文件开始起吧!

什么是数据驱动?

从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。说人话,其实就是参数化。

数据驱动有什么用?

对开发来说说,数据驱动无处不在,写好了一个模块,传个参数调用一下,看结果是不是等于预期。

def add(a,b):
    return a + b

if __name__ == ‘__main__‘:
    result = add(3, 5)
    assert result == 8

对测试有来说就可厉害了,你知道早期的自动化测试(工具)都是流水式,第一步打开浏览器,第二步输入“abc”,第三步点击按钮。假如我有一个登录,登录的步骤完全一样,就是每次登录时用的账号密码不一样。用数据驱动啊!

# 伪代码
def login(username, password):
    driver.find_element_by_id("idInput").send_keys(username)
    driver.find_element_by_id("pwdInput").send_keys(password)
    driver.find_element_by_id("loginBtn").click()

if __name__ == ‘__main__‘:
    login("zhangsan","123")
    #...
    login("lisi","456")

看!是不是很厉害了我的数据驱动。我传zhangsan,程序就会用zhangsan登录,我传lisi,就会用lisi登录。

数据驱动的本质就是“测试数据”与“执行代码”做分离。至于,“测试数据”放哪儿都可以,

定义成变量:

username = "zhangsan"

password = "123"

或放到数组里

users =["zhangsan","123"]

或放到字典:

users = {"zhangsan":"123"}

或放到txt文件里,XML文件里,CSV文件里,再读取过出来,调用登录方法时使用,这其实都是可以的。

但是,我们要做的是自动化测试,要分用例的,一种情况一条用例。

--------------------------------------------------------------------

用例1,用户名密码为空。

用例2,用户名为空。

用例3,密码为空。

用例4,用户名密码正确。

----------------------------------------------------------

相信身为软件测试人员的你,对这个用例没有意见吧?

这里以你们喜闻乐见的读取csv文件为例。

读取数据文件,并得到相应的数据,把这些数据用到具体的某个用例当中。

from selenium import webdriver
import unittest
import csv

# 读取本地 CSV 文件
data = csv.reader(open(‘login_test.csv‘, ‘r‘))

# 读取整个文件的数据放到users数组
users = []
for i in data:
    user = []
    for j in i:
        user.append(j)
    users.append(user)

class loginTest(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://xxx.login.page")

    # 封装用户登录
    def user_login(self, username, password):
        self.driver.find_element_by_id("idInput").send_keys(username)
        self.driver.find_element_by_id("pwdInput").send_keys(password)
        self.driver.find_element_by_id("loginBtn").click()

    def test_login1(self):
        ‘‘‘用户名、密码为空登录‘‘‘
        i = 0
        for user in users:
            print(user[0])
            if user[0] == ‘user_pawd_null‘:
                print(i)
                username = users[i][1]
                password = users[i][2]                break;
            else:
                i +=1
        self.user_login(username, password)

    def test_login2(self):
        ‘‘‘用户名正确,密码为空‘‘‘
        username = users[1][1]
        password = users[1][2]
        self.user_login(username, password)

    def test_login3(self):
        ‘‘‘用户名为空,密码正确‘‘‘
        username = users[2][1]
        password = users[2][2]
        self.user_login(username, password)

    def test_login4(self):
        ‘‘‘用户名密码正确 ‘‘‘
        username = users[3][1]
        password = users[3][2]
        self.user_login(username, password)

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

来看看你都干了什么高大上的事儿。

1、创建了一CSV文件,然后把登录用的测试数据写到了文件了。 --->创建了一个专门存放数据的文件,这多有逼格,自我感觉良好。

2、读取CSV文件,并且通过for循环,把所有数据组装成一个二维数组,并放users数组中。--->这没什么呀,只是多写了个for循环而已,继续自我感觉良好。

3、test_login1用例,为用户名密码都为空的用例,判断users数组中某一行的第一列是否为“user_pawd_null”,是的话,说明这一行就是我想要的。取这一行的第二、第三列的测试数据,进行登录测试。 --->这个取数据的方式有点。。。有点麻烦!

4、没关系!没关系!麻烦的话,我们看test_login2 ,用users[1][1]和users[1][2]也能取到CSV表第二行的数据。  ---->这不就不那么麻烦了!嗯,是不那么麻烦了,不过,有点傻逼。你确定你清楚的知道users[1][1]和users[1][2] 代表的啥?别急!别急!我打开CSV文件看看第2行对应是什么数据。

这就是你玩的高大上的“数据驱动”,再下实在是佩服佩服!什么你还有更高大上,简洁的玩法?真心请赐教。。。。

为什么不按照下面的方式写用例?

from selenium import webdriver
import unittest

class loginTest(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("http://xxx.login.page")

    # 封装用户登录
    def user_login(self, username, password):
        self.driver.find_element_by_id("idInput").send_keys(username)
        self.driver.find_element_by_id("pwdInput").send_keys(password)
        self.driver.find_element_by_id("loginBtn").click()

    def test_login1(self):
        ‘‘‘用户名、密码为空登录‘‘‘
        self.user_login("", "")

    def test_login2(self):
        ‘‘‘用户名正确,密码为空‘‘‘
        self.user_login("", "123")

    def test_login3(self):
        ‘‘‘用户名为空,密码正确‘‘‘
        self.user_login("zhangsan", "")

    def test_login4(self):
        ‘‘‘用户名密码正确 ‘‘‘
        self.user_login("zhangsan", "123")

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

我相信,正常人一定看出来了这比上面读CSV文件简单多了。可是,用读取数据文件的话,不懂代码也能写用例!你是在自我YY这种需求吧??不懂自动化测试的同学差点就信了!

“都已经开始写代码做自动化的你告诉我,不想懂开发,你确定这不是任性?”

我在CSV文件中改测试数和在代码中改测试数据有什么区别? 在代码中该测试数据,我是知道对应哪个用例的,在CSV文件中改你确定一下子就知道对应的哪个用例?

那什么情况下才要用到读取测试数据呢?

关于自动化测试的误区(二)

已经说明了自己的观点。这里就不再重复,总之,用到要读取文件的情况并不多。不管是UI自动化测试,还是接口自动化测试。

时间: 2024-10-10 14:51:36

自动化测试---被玩坏的数据驱动的相关文章

从共享健身仓到共享马扎,看共享经济如何被玩坏

看到现在共享经济项目遍地开花,其实很多行业都捶胸顿足感叹自己诞生地太早了.就像网吧,其实也能说是共享经济--提供电脑解决大众上网需求,并占据他们的time和money.而如今,"共享"已经被完全玩坏了,披着"共享"的外衣却有着各种小九九的项目层出不穷. 共享健身仓.共享马扎--这些打着"共享"名号的项目,或者是名不副实,或者是有着其他目的.而最终的结果,就是让业界.投资者和大众谈"共享"即色变.对于共享经济的破坏,什么时候才能

如何在VS上用C#玩坏“Hello World”。

如何在VS上用C#玩坏“Hello World”. 为了开发win8应用,重装了系统到win8.1,安好了VS2013终极版,我们开始使用C#,今天来玩“Hello World”. 首先,打开vs,建立一个控制台应用程序.我的建立路径是C:\Users\ZhangXiao\Desktop\,工程名字是ConsoleHelloWorld. 如图,打出代码行,调用System命名空间中Console类的WriteLine函数,在控制台上输出一句话. 第一种方法,打开cmd命令提示符,用cd命令进入C

那些年被我玩坏的点子和创意-下篇

时光如白驹过隙,继那些年被我玩坏的点子和创意-上篇已过一个月,平常忙活着和队友一起做产品了,挤得时间总结了下篇,分四个故事来说 自动发微博软件为啥做这个呢,淘宝客接口还没有限制以前好多玩淘宝客的.其中我发现有个淘宝客玩的挺特别的,他是在新浪微博和腾讯微博(当时还没有关闭),上通过时光机等一些定时发微博的平台给粉丝推送淘客商品信息,我还记得他的微博马甲叫"型男服装搭配",他推送的微博都是从淘宝男装男鞋等类目下的按销量等某些筛选条件后的top N条商品,我不知道这样效果怎么样,但我知道可以

漫谈可视化Prefuse(四)---被玩坏的Prefuse API

这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的“漫谈可视化”系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感>主要介绍了可视化工具Prefuse API中主要解读的是prefuse.data包中的主要接口,并利用<漫谈可视化Prefuse(一)---从SQL Server数据库读取数据>中例子,将参数配置模块剥离出来,实现界面传值,绘制图形. 本篇决定不再贴API,实在没啥意思,还占篇幅(但是不

Github 恶搞教程(一起『玩坏』自己的 Github 吧)

最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发现原来有人已经做出『玩坏』Github 的工具啦,名叫 gitfiti.主要对应预先定义的模板,进行相应日期的 commit 操作,push 至 Github 后在贡献栏中生成相应像素点,并且利用 Github 贡献数不同颜色深度不同的机制,就可以在自己的贡献栏里面看见像素画了.怎么样,是不是心动啦,那么下面

众筹是被玩坏的C2B

什么叫"众筹"? 我们先来看看京东众筹对"众筹"的阐述. "众筹"译自crowdfunding,即大众筹资或群众筹资,是一种通过互联网方式向网友募集项目资金的模式.从行业来看,国内的众筹还是一个新兴行业,处在初创阶段.众筹的通俗说法就是,彼此成就梦想,大家筹钱完成一个任务.和预售.团购的区别是:预售是B2C,众筹偏向C2B,就是出资人先有购买或投资的意愿,筹资人按需组织生产. 众筹具有三点特征:1. 排他性,即处于众筹期限内的产品仅在单一渠道发售

科技不该被玩坏!宏碁携自拍帽登时装周

虽然平时我们总能见到许多奇葩的人.事.物,但那些似乎都还情有可原--比如凤姐这么奇葩就是为了出名.在这个奇葩层出不穷的时代,我们似乎已经有了很强的免疫力,对什么都见怪不怪.但总有一些表现得太过分的事物是我们所不能容忍的,比如科技产品中的奇葩.科技产品可以不实用,可以价格高,可以很小众,但绝不能被玩坏!而近日,宏碁却无视了这些底线,将旗下的科技产品彻底玩坏. 宏碁推出一款造型怪异的自拍帽子,完全超出了业界和消费者的想象,让我和围观的小伙伴脑洞大开.但"欣赏"完之后,却丝毫没有购买的冲动,

让我们把KBEngine玩坏吧!如何定制我们自己的C++函数(一)

为什么不更新kbe warring的代码解读了,因为在我看来那个demo讲完了实体就没东西可讲了,如果专心的看官方文档和PPT的话demo的代码后面没任何难点了已经,单纯的复制黏贴代码实在太过无聊.程序员一定要做点好玩的事情才行~ 好吧,今天开始想法直接改引擎底层,争取把引擎底层直接玩坏(*^__^*) 另外因为平时工作比较忙,这个系列会不定期的更新. 从自己的HelloWorld写起 先来点简单的,baseapp脚本层调用一个自定义的C++函数,输出helloworld! 因为是baseapp

苹果或将玩坏企业市场?

过去8年的时间里,苹果向世界上输出了大量的iPhone和iPad,而且以一种掌控的姿势不断扩张,现在,他们已经拿走了整个智能手机市场90%的利润,iPad在平板市场也从未丢掉过金牌,包括市场占有率和利润都首屈一指.如果把消费市场比作一场游戏,那么,苹果显然能闭着眼睛通关了,更确切地说,苹果创造了一个全新的消费市场,并利用强大的技术.设计能力.供应链管理能力以及品牌效应,制定了这里的游戏规则,于是,他们总给人一种"怎么玩都行"的感觉,比如其他手机制造商们在推出新产品之前,总不免要担心市场