数据驱动---excel

一、背景

在之前的文章中已经强调过测试数据的重要性,要想成为一名优秀的测试工程师,数据准备的技能必须要掌握,这里就简单介绍读取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无法分解数据,就会报错。

你可能感兴趣的:(数据驱动---excel)