最近在整理接口测试相关的资料,因此,看到有关资料就会多看两眼。偶看到别人发的微信公众号。html
Python接口测试框第一篇 --- python如何读取txt文件。python
Python接口测试框第三篇 --- python如何读取XML文件。web
Python接口测试框第四篇 --- python如何读取CSV文件。数组
曾几什么时候,也许某大牛说,搞自动化必需要把测试数据放文件里,而后经过程序读取文件。因而,你们纷纷效仿。浏览器
什么?你作自动化测试竟然不读取测试数据文件,一看就是新手,没逼格。微信
小王啊!咱们这个自动化框架必定得作数据与代码分离,得读取文件啊!app
在这个全民微信的年代,各位大牛开了公从号,传授你们自动化测试技术,教点啥呢?那咱们就从读取数据文件开始起吧!框架
什么是数据驱动?工具
从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引发测试结果的改变。说人话,其实就是参数化。post
数据驱动有什么用?
对开发来讲说,数据驱动无处不在,写好了一个模块,传个参数调用一下,看结果是否是等于预期。
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()
来看看你都干了什么高大上的事儿。
一、建立了一CSV文件,而后把登陆用的测试数据写到了文件了。 --->建立了一个专门存放数据的文件,这多有逼格,自我感受良好。
二、读取CSV文件,而且经过for循环,把全部数据组装成一个二维数组,并放users数组中。--->这没什么呀,只是多写了个for循环而已,继续自我感受良好。
三、test_login1用例,为用户名密码都为空的用例,判断users数组中某一行的第一列是否为“user_pawd_null”,是的话,说明这一行就是我想要的。取这一行的第2、第三列的测试数据,进行登陆测试。 --->这个取数据的方式有点。。。有点麻烦!
四、不要紧!不要紧!麻烦的话,咱们看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自动化测试,仍是接口自动化测试。
咱们还能够借助单元测试框架的功能进行参数化:
坚持我原来的见解,不接受反驳!
@虫师
我理解自动化和手工的区别点只是执行方式上的区别,自动化是由代码来执行用例,手工是由人来执行用例。这里的test_login方法,只是用来执行用例的代码,它并非真正意义上的用例。本质上说,那个csv文件才是用例,“一种状况一个用例”,而做为用例,这个csv文件中缺乏了预期结果。是否能够考虑将预期结果的内容按照必定格式也补充到csv中,而后作一个专门解析csv中结果的方法,加入到test_login中,这样即便是远超过4组数据的状况,也只须要用一个方法就能够进行测试,而不是每组数据写一个方法,失败与否也是针对每组数据而言。
至于用例数量,一样,实际上是拿数据组的数量来计算,而后体如今最后生成的测试报告中
@ nuist_kevin
你说的我很同意,我以前作音乐搜索排序的效果测试时就是使用数据+指望结果组成一条case,并保存在excel中的一行数据,而后用method去一行一行使用数据,并把每条case的实际结果写到对应case的后面,用例跑完以后,再对比便可知道测试报告。
这两段留言,我看了!也明白是什么意思。
我上面的观点是创建在unittest 单元测试框架的基础上面的,在unittest 中一个以“test”开头的方式被计算为一条用例,按照上面的两哥们的观点 excel 文件里面的一条数据计算为一个用例。
我很想弄明白,用例不一样,步骤不同,数据字段不同(登陆须要“用户名”和“密码”, 搜索须要“搜索关键字”, 添加用户须要"id", "name", "age"....),因此,一个方法只能涵盖一组测试,对吧!? 那是否是须要建立多个测试数据文件?,同时也须要多个方法?
这些数据文件中的结果是否是最终还要汇合到一块儿统计。用例运行失败的错误提示信息是否是也要 写到 excel 文件里? ”方便“查看报错嘛。
总结:
* 维护不便,多个方法 和 多个数据文件,不一样的方法还要找对应的数据文件。
* 测试结果统计,测试结果是分散在不一样的数据文件中的。
这个须要本身灵活点。数据量越大,数据驱动的优点越明显。还有,数据文件里须要包含:
一、用例名字
二、输入值一、输入值2.。。。
三、指望值
这样脚本里只须要一直一个测试方法就能够了
数据量越大,“数据驱动”越有优点? 你是拿登陆或搜索之类的功能测试一万遍么? 那确实挺有优点的,毕竟字段都是同样的。一个方法就能够搞定了。
咱们知道UI自动化测试是模拟用户行为,用户确定不肯意傻逼的重复作某事,能让用户选择的就不要让用户输入,须要用户输入的大数据是不存在的。除了,我如今写博客是在输入大量数据。
你还能再给我举两个例子是让用户输入不少数据的例子么? 谈到数据驱动,大家立刻跳出来个想法。若是须要不少数据的话就须要数据驱动了。别YY这个伪需求了!我就问啥功能须要?
再说了,就算数据驱动就必定要读文件么?