51Testing软件测试论坛
标题:
自动化测试---被玩坏的数据驱动
[打印本页]
作者:
NewDreamTester
时间:
2017-11-27 11:43
标题:
自动化测试---被玩坏的数据驱动
本帖最后由 NewDreamTester 于 2017-11-27 11:47 编辑
曾几何时,也许某大牛说,搞自动化必须要把测试数据放文件里,然后通过程序读取文件。于是,大家纷纷效仿。
什么?你做自动化测试居然不读取测试数据文件,一看就是新手,没逼格。
小王啊!我们这个自动化框架一定得做数据与代码分离,得读取文件啊!
在这个全民微信的年代,各位大牛开了公从号,传授大家自动化测试技术,教点啥呢?那我们就从读取数据文件开始起吧!
什么是数据驱动?
从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。说人话,其实就是参数化。
数据驱动有什么用?
对开发来说说,数据驱动无处不在,写好了一个模块,传个参数调用一下,看结果是不是等于预期。
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
[1]
password = users[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文件中改你确定一下子就知道对应的哪个用例?
作者:
海海豚
时间:
2017-11-27 14:07
谢谢分享~
作者:
梦想家
时间:
2017-11-28 09:13
作者:
applepen
时间:
2017-11-28 09:28
您篇帖子的目的是告诉我们不要一味追求主流技术,而忽略了自动化测试的中脚本的可读性?
作者:
jingzizx
时间:
2017-11-28 19:42
学习
作者:
xudaleiaini
时间:
2018-1-3 12:18
的确,方法有很多,关键还是看哪一种是最实用的
作者:
Martinzzz
时间:
2018-1-3 15:51
我选择读取Excel
作者:
xieddd
时间:
2018-1-18 15:48
很好
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2