python关键字驱动框架搭建_【Selenium08篇】python+selenium实现Web自动化:数据驱动框架,ddt,关键字驱动框架...

一、前言

最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新!

这是python+selenium实现Web自动化第八篇博文

二、Selenium前七篇博文地址:

三、Selenium之-数据驱动框架

那么问题来了,什么是数据驱动呢?就是,数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变,也就是参数的应用化。

这里对于数据驱动测试,总结起来就是,数据驱动绝非读取文件(excel、csv、xml)中数据进行参数的赋值测试,因为采用的这种方式的测试,工作重心反而变成了如何读写文件,而对于自动化测试中关心的执行结果统计、断言结果反而不是那么容易去实现。尤其是测试页面结构发生大的调整时,文件类的字段调整获取也要发生较大的修改,所以文件数据驱动测试也是可以的,但是并不是最优解。

那么什么才是最优的数据驱动测试呢?是的,用单元测试 unittest 结合 ddt 库。使用单元测试可以很方便的解决两个问题:

(1)断言。利用单元测试的断言机制,我们可以方便的进行预期结果和实际结果的对比;

(2)数据统计。执行完测试用例后,一共执行了多少条用例,执行成功多少,失败多少,失败的用例错误在哪里?单元测试框架会帮我们统计展示。

1. DDT 入门

Python 的 unittest 没有自带数据驱动功能,如果使用 unittest, 同时又想使用数据驱动,就用 DDT 吧。奉上 ddt 官方文档 《DDT 官方文档》。

DDT 的使用方法:

(1) ddt.ddt --- 装饰类,也就是继承自 TestCase 的类;

(2) ddt.data --- 装饰测试方法,参数是一系列的值。

(3) ddt.file_data --- 装饰测试方法,参数是文件名。文件可以是 json 或 yaml 类型,除.yaml结尾的文件,其他文件均会作为json文件处理。

(4) ddt.unpack --- 传递的是复杂的数据结构是使用。如:元组或列表。添加到 unpack 上之后,ddt 会自动把元组或者列表对应到多个参数上。

(5) 测试用例方法名生成规则 ---

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

"""

@Time : 2020/4/17

@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!

@Contact : 软件测试技术群:695458161

@License : (C)Copyright 2017-2019, Micro-Circle

@Desc : None

"""

import unittest

import ddt

@ddt.ddt

class DDTExample(unittest.TestCase):

@classmethod

def setUpClass(cls) -> None:

print(cls.__name__)

@classmethod

def tearDownClass(cls) -> None:

print('...end...')

@ddt.data(

[1, 2],

[3, 4],

[5, 6]

)

@ddt.unpack

def test_add(self, a, b):

print(a + b)

if __name__ == "__main__":

unittest.main()

2. 实践应用

将 ddt 引入到自动化测试中。

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

"""

@Time : 2020/4/17

@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!

@Contact : 软件测试技术群:695458161

@License : (C)Copyright 2017-2019, Micro-Circle

@Desc : None

"""

import ddt

from page_object_model.register_business import RegisterBusiness

from selenium import webdriver

import unittest

from time import sleep

@ddt.ddt

class RegisterDdtCases(unittest.TestCase):

@classmethod

def setUpClass(cls) -> None:

cls.register_url = 'http://www.5itest.cn/register'

cls.driver = webdriver.Chrome('../tools/chromedriver.exe')

cls.driver.maximize_window()

cls.driver.get(cls.register_url)

sleep(3)

cls.rb = RegisterBusiness(cls.driver)

@classmethod

def tearDownClass(cls) -> None:

sleep(2)

cls.driver.close()

# 邮箱错误测试的测试用例

@ddt.data(

# 顺序分别是:注册邮箱、用户昵称、注册密码、验证码、错误信息定位元素、错误提示信息

['123', 'test01', 'test01abc', 'tyu9'],

['@163.com', 'test01', 'test01abc', 'tyu9'],

['@163', 'test01', 'test01abc', 'tyu9']

)

@ddt.unpack

def test_ddt_email_error(self, register_email, nickname, password, captcha):

register_email_error = self.rb.register_email_error(register_email, nickname, password, captcha)

print("register_email_error: ", register_email_error)

self.assertFalse(register_email_error, '你输入的邮箱错误,但此条测试用例执行成功')

if __name__ == "__main__":

unittest.main()

四、关键字驱动框架

关键字简单来说就是,把我们的执行操作每一个关键步骤当成一个关键字来对待,用来驱动程序的设计开发。例如:进行web自动化我们的首要是打开浏览器,是的 “打开浏览器” 我们就可以作为一个关键字来对待它,关键字就是来驱动我们程序设计的关键步骤。通过关键字的改变从而驱动自动化测试的执行,最终引起测试结果的改变。

对于测试一个注册页面,我们来梳理下看有哪些关键词,更深层次了解下关键词模型:

(1) 打开浏览器 --->  打开浏览器

(2) 输入注册页面的url --->  输入测试地址

(3) 页面加载等待 ---> 页面加载等待

(4) 输入(注册邮箱、用户名、密码、验证码)--->  输入元素

(5) 点击注册按钮 ---> 点击元素

(6) 退出浏览器

1. 构建关键词类

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

"""

@Time : 2020/4/17

@Author : 公众号:软测之家 更多技术干货,软测视频,面试资料请关注!

@Contact : 软件测试技术群:695458161

@License : (C)Copyright 2017-2019, Micro-Circle

@Desc : None

"""

class RegisterKeyword(object):

def __init__(self, driver):

self.fe = FindElement(driver)

# 打开浏览器

def open_browser(self, browser):

if browser == 'chrome':

self.driver = webdriver.Chrome('../tools/chromedriver.exe')

elif browser == 'firefox':

self.driver = webdriver.Firefox()

else:

self.driver = webdriver.Edge()

# 输入测试地址

def get_url(self, url):

self.driver.get(url)

# 定位元素

def get_element(self, key):

return self.fe.get_element(key)

# 输入元素

def send_element_key(self, key, value):

get_element = self.get_element(key)

get_element.send_keys(value)

# 点击元素

def click_element(self, key):

self.fe.get_element(key).click()

# 页面等待

@staticmethod

def wait_loading():

sleep(3)

# 关闭浏览器

def close_browser(self):

self.driver.close()

if __name__ == "__main__":

register_url = 'http://www.5itest.cn/register'

driver = webdriver.Chrome('../tools/chromedriver.exe')

driver.get(register_url)

rk = RegisterKeyword(driver)

print(rk.get_element('register_email'))

driver.close()

2. 关键词模型测试用例

我们关键词方法直接从 register_keyword 中读取即可,但是测试数据从哪获取到从而传给相应的关键词方法呢?为了方便测试数据方便管理,我们可以将其存储到 Excel中去并获取。

2.1 读取Excel

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

"""

@Time    :   2020/4/17

@Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!

@Contact :   软件测试技术群:695458161

@License :   (C)Copyright 2017-2019, Micro-Circle

@Desc    :   None

"""

import xlrd

from xlutils.copy import copy

class ReadExcel(object):

def __init__(self, excel_path=None, index=None):

if excel_path is None:

self.excel_path = '../data/register_keyword_testdata.xls'

self.index = 0

else:

self.excel_path = excel_path

self.index = index

# 打开 excel 文件,获取数据列表

self.data = xlrd.open_workbook(self.excel_path)

# 读取第一 sheet 页的数据

self.table = self.data.sheets()[0]

def get_data(self):

result = []

rows = self.get_lines()

if rows != '':

for i in range(rows):

col = self.table.row_values(i)

result.append(col)

return result

return None

# 获取 excel 行数

def get_lines(self):

rows = self.table.nrows

if rows >= 1:

return rows

return None

# 获取单元格的值

def get_cell(self, row, col):

if self.get_lines() > row:

data = self.table.cell(row, col).value

return data

return None

def write_data(self, row, col, value):

read_data = xlrd.open_workbook(self.excel_path)

write_data = copy(read_data)

write_data.get_sheet(self.index).write(row, col, value)

write_data.save("../data/register_keyword_testdata.xls")

write_data.save(self.excel_path)

if __name__ == "__main__":

re = ReadExcel()

print(re.get_data())

print(re.get_lines())

print(re.get_cell(0, 0))

re.write_data(11, 0, 123456)

2.2 测试用例实践

前面将测试测数据存在到excel中了,接下来怎么写关键字对应的测试用例。

(1) 拿到操作值,是否执行

(2) 拿到执行方法

(3) 拿到输入数据

(4) 是否有输入数据

执行方法(输入数据,操作元素)

没有输入数据

执行方法(操作元素)

(5) 对比预期结果和实际结果的值

对比结果一样,测试结论为pass;否则为fail

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

"""

@Time    :   2020/4/17

@Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!

@Contact :   软件测试技术群:695458161

@License :   (C)Copyright 2017-2019, Micro-Circle

@Desc    :   None

"""

from util.read_excel import ReadExcel

from keyword_model.register_keyword import RegisterKeyword

from selenium import webdriver

class RegisterKeywordCases(object):

def __init__(self):

self.rk = RegisterKeyword()

self.excel_path = '../data/register_keyword_testdata.xls'

# 执行关键字测试方法

def run_keyword_method(self, keyword_method, operator_element='', send_value=''):

print('keyword_method ---> ', keyword_method)

print("operator_element ---> ", operator_element)

print("send_value ---> ", send_value)

execute_method = getattr(self.rk, keyword_method)

print(execute_method)

if operator_element is '' and send_value is not '':

result = execute_method(send_value)

elif operator_element is not '' and send_value is '':

result = execute_method(operator_element)

elif operator_element is '' and send_value is '':

result = execute_method()

else:

result = execute_method(operator_element, send_value)

return result

# 执行关键词测试用例

def run_keyword_excel_cases(self):

handle_excel = ReadExcel(self.excel_path)

# 获取 excel 关键词测试用例的条数

cases_numbers = handle_excel.get_lines()

print("注册页获取到的关键词测试的测试用例条数为:%s" % cases_numbers)

# 循环遍历测试用例

if cases_numbers:

# 第 0 行是标题行不作为用例执行

for i in range(1, cases_numbers):

# 获取测试用例的名称

testcase_name = handle_excel.get_cell(i, 0)

# 获取用例是否执行

is_run = handle_excel.get_cell(i, 1)

if is_run == 'yes':

keyword_method = handle_excel.get_cell(i, 2)

operator_element = handle_excel.get_cell(i, 3)

send_value = handle_excel.get_cell(i, 4)

except_result = handle_excel.get_cell(i, 5)

actual_result = handle_excel.get_cell(i, 6)

# 反射

self.run_keyword_method(keyword_method, operator_element, send_value)

# if except_result is not '':

# except_value = self.run_keyword_method(keyword_method)

else:

print('第 %s 条用例不执行,用例名称是: [%s],无预期结果' % (i, testcase_name))

else:

print("略略略~,请检查你是否有写测试用例!")

if __name__ == "__main__":

rkc = RegisterKeywordCases()

# rkc.run_keyword_method('open_browser', '', 'chrome')

# rkc.run_keyword_method('get_url', '', 'http://www.5itest.cn/register')

rkc.run_keyword_excel_cases()

五、行为驱动模型

什么是行为驱动测试呢?行为驱动(Behave Driven Development)测试,是一种敏捷的开发方法,通常应用在自动化测试中,通过使用自然描述语言确定自动化脚本。不喜欢这种方式用在自动化脚本里。

六、持续更新中请关注

如果你对此文有任何疑问,如果你觉得此文对你有帮助,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:

软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:来自公众号:软测之家

出处:https://www.cnblogs.com/csmashang/p/12719150.html

原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值