一、背景
在之前的文章中已经强调过测试数据的重要性,要想成为一名优秀的测试工程师,数据准备的技能必须要掌握,这里就简单介绍读取excel文件数据信息,并结合自动化测试示例进行演示。至于如何利用python操作excel文件,可以参考之前的文章,链接如下:https://www.jianshu.com/p/fdb9c6e84035
二、读取excel数据,并执行自动化测试
python自动化测试中,在执行读execl文件时要用到xlrd库,当然也可以用其他的第三方库,比如openpyxl和xlutils库。最后,选择什么模块要根据实际情况而定。这里选择xlrd库进行实际演示。
这里同样以登录新浪邮箱为示例。首先,准备好测试需要的excel数据文档,名字为”TestData.xlsx“,具体内容如下:
具体,读取”TestData.xlsx“表信息方法如下所示:
import xlrd
import os
def read_excel(row):
'''测试数据'''
wb = xlrd.open_workbook(
os.path.join(
os.path.dirname(__file__),
'TestData.xlsx')) #文档路径
sheet = wb.sheet_by_index(0) #索引为0的表
return sheet.row_values(row) #返回row行的值
print('第一行数据:{}'.format(read_excel(0)))
print('第二行数据:{}'.format(read_excel(1)))
print('第三行数据:{}'.format(read_excel(2)))
print('第四行数据:{}'.format(read_excel(3)))
结果:
第一行数据:[' ', '123456', '请输入邮箱名']
第二行数据:[' ', ' ', '请输入邮箱名']
第三行数据:['123456', '123456', '您输入的邮箱名格式不正确']
第四行数据:['[email protected]', '123456', '登录名或密码错误']
其实,这里读取”TestData.xlsx“表的功能比较简单,利用os模块拼接出文档路径,找到并打开”TestData.xlsx“表,最后再读取出表中的信息。
实战代码如下:
import xlrd
import os
import unittest
from selenium import webdriver
import time
def read_excel(row):
'''读取测试数据'''
wb = xlrd.open_workbook(
os.path.join(
os.path.dirname(__file__),
'TestData.xlsx'))
sheet = wb.sheet_by_index(0)
return sheet.row_values(row)
class MyMailLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(30)
def mail_login(self, username, password):
'''登录邮箱'''
self.driver.find_element_by_id('freename').clear()
self.driver.find_element_by_id('freename').send_keys(username)
self.driver.find_element_by_id('freepassword').clear()
self.driver.find_element_by_id('freepassword').send_keys(password)
self.driver.find_element_by_link_text('登录').click()
def error_info(self):
'''定位提取登录错误提示信息'''
freeError = self.driver.find_element_by_xpath(
'//div[@class="freeError"]//span').text
return freeError
def test_username_null(self):
'''测试登录邮箱:用户名为空'''
self.mail_login(read_excel(0)[0], read_excel(0)[1])
self.assertEqual(self.error_info(), read_excel(0)[2])
def test_username_and_password_null(self):
'''测试登录邮箱:用户名及密码为空'''
self.mail_login(read_excel(1)[0], read_excel(1)[1])
self.assertEqual(self.error_info(), read_excel(1)[2])
def test_username_error(self):
'''测试登录邮箱:用户名错误'''
self.mail_login(read_excel(2)[0], read_excel(2)[1])
self.assertEqual(self.error_info(), read_excel(2)[2])
def test_password_error(self):
'''测试登录邮箱:密码错误'''
self.mail_login(read_excel(3)[0], read_excel(3)[1])
time.sleep(3)
self.assertEqual(self.error_info(), read_excel(3)[2])
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
结果:
test_password_error (__main__.MyMailLogin)
测试登录邮箱:密码错误 ... ok
test_username_and_password_null (__main__.MyMailLogin)
测试登录邮箱:用户名及密码为空 ... ok
test_username_error (__main__.MyMailLogin)
测试登录邮箱:用户名错误 ... ok
test_username_null (__main__.MyMailLogin)
测试登录邮箱:用户名为空 ... ok
----------------------------------------------------------------------
Ran 4 tests in 33.012s
OK
三、读取excel数据,并配合ddt执行自动化测试
结合以上的示例,利用第三方库ddt配合xlrd库完成自动化测试,能简化测试代码量,提高效率。ddt的使用可以参考之前的文章,链接如下:https://www.jianshu.com/p/c4f358129c24
import xlrd
import os
import unittest
from selenium import webdriver
import time
from ddt import ddt, data, unpack
def read_excel():
'''读取测试数据'''
data = []
wb = xlrd.open_workbook(
os.path.join(
os.path.dirname(__file__),
'TestData.xlsx'))
sheet = wb.sheet_by_index(0)
for row in range(sheet.nrows):
data.append(sheet.row_values(row))
return data
@ddt
class MyMailLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/')
self.driver.implicitly_wait(30)
def mail_login(self, username, password):
'''登录邮箱'''
self.driver.find_element_by_id('freename').clear()
self.driver.find_element_by_id('freename').send_keys(username)
self.driver.find_element_by_id('freepassword').clear()
self.driver.find_element_by_id('freepassword').send_keys(password)
self.driver.find_element_by_link_text('登录').click()
def error_info(self):
'''定位提取登录错误提示信息'''
freeError = self.driver.find_element_by_xpath(
'//div[@class="freeError"]//span').text
return freeError
@data(*read_excel())#这里加*后会将返回数据分为一个个的列表
@unpack #分解数据
def test_mail_login(self, username, password, result):
'''测试登录邮箱业务'''
self.mail_login(username, password)
time.sleep(3)
self.assertEqual(self.error_info(), result)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
结果:
test_mail_login_1_________123456____请输入邮箱名__ (__main__.MyMailLogin)
测试登录邮箱业务 ... ok
test_mail_login_2_____________请输入邮箱名__ (__main__.MyMailLogin)
测试登录邮箱业务 ... ok
test_mail_login_3___123456____123456____您输入的邮箱名格式不正确__ (__main__.MyMailLogin)
测试登录邮箱业务 ... ok
test_mail_login_4___123456_sina_com____123456____登录名或密码错误__ (__main__.MyMailLogin)
测试登录邮箱业务 ... ok
从结果来看,测试内容不是很清晰,若从功能模块来看,代码更简洁了,能提高测试效率。
另外,需要注意@data( * read_excel()) 这里加*后会将返回数据分为一个个的列表,否则unpack无法分解数据,就会报错。