自动化测试关键字模型学习总结

自动化测试 专栏收录该内容
11 篇文章 0 订阅

今天跟着网上教程学习了一种关键字模型设计的方法,做下总结。

目录

关键字驱动测试

关键字模型设计

处理excel的两个扩展包

代码实现


关键字驱动测试

又称为表驱动测试或基于动作字测试。这类框架会把自动化操作封装为‘关键字’,避免测试人员直接接触代码,多以‘填表格’的形式降低脚本的编写难度。

Robot Framework是主流的关键字驱动测试框架之一。

关键字模型设计

目标:简单实现一个百度搜索的关键字模型自动化测试脚本。

设计步骤:

新建四个Python Package和一个文件夹,分别存放4个py文件和一个excel文件:

  • config包,创建data.xls文件,用来存放测试步骤。测试人员可以只维护这个文件来实现自动化测试,而不用直接接触代码。
  • util包,excel_util.py文件, 用于解析Excel文件内容。
  • base包,search_base.py文件,用于再次封装定位页面元素的方法,便于后面使用
  • keywordselenium包,actionMethod.py文件,用来封装关键字
  • case包,keyword_case.py文件,用来执行excel中的case,并写入执行结果。

处理excel的两个扩展包

xlrd和xlutils (注意:xlrd只支持xls格式的excel文件的写入,若用xlsx格式文件,写入后文件会打不开)

pip install xlrd

pip install xlutils

代码实现

data.xls文件

每一行是一条操作步骤,AB列可忽略,C列是想要实现的操作。

D列表示是否要执行自动化,E列是执行该条用例需要调用的实例方法(关键字)。

F列输入数据,比如搜索时要输入搜索关键字。

G列是具体要操作的元素,比如chrome是指要打开chrome浏览器,kw是百度搜索框的id。

H列是为了获取预期结果所要使用的实例方法。

I列是预期结果值,根据“=”左右两侧进行判断,比如“text=百度",是指获取浏览器title后,校验标题是否包含”百度“。”element=1"中1是百度搜索结果第一条数据的id,通过get_element方法判断第一条数据是否存在。

J列是执行完脚本后,填入执行结果pass或fail。

excel_util.py中代码,用于解析excel。

import xlrd
from xlutils.copy import copy
import time
class ExcelUtil():
    def __init__(self,excel_path=None,index=None):
        #设置excel的文件位置
        if excel_path == None:
            self.excel_path="..\config\data2.xls"
        else:
            self.excel_path=excel_path
        if index==None:
            index=0  # index指excel的sheet页
        self.data=xlrd.open_workbook(self.excel_path) # 打开excel
        self.table=self.data.sheets()[index] # 获取对应sheet的内容

    # 获取excel行数
    def get_rows(self):
        rows = self.table.nrows
        if rows>0:
            return rows
        return None  # 如果excel中没有内容,直接返回None

    # 获取单元格数据
    def get_col_value(self,row,col):
        if self.get_rows()>row: #如果传入的行数小于当前excel数据行最大行数
            data=self.table.cell(row,col).value # 获取对应行列单元格的内容
            return data
        return None

    # 写入数据
    def write_value(self,row,value):
        read_value=xlrd.open_workbook(self.excel_path)# 获取excel的数据,由于每次写入数据的时候要获取最新文件内容,所以每次要重新打开excel
        write_data=copy(read_value)  # 将数据复制一份
        write_data.get_sheet(0).write(row,9,value) #将数据写入第row行第9列,即实际结果那一列
        write_data.save(self.excel_path) #保存文件
        time.sleep(1)

if __name__ == '__main__':
    eu=ExcelUtil()
    print(eu.get_col_value(10,2))

searh_base.py文件。

class SearchBase(object):
    def __init__(self,driver):
        self.driver=driver
    def by_id(self,id):
        try:
            return self.driver.find_element_by_id(id)
        except:
            return None

actionMethod.py文件代码。

from selenium import  webdriver
from baidu.base.search_base import SearchBase
import time
class ActionMethod(object):
    def open_browser(self,browser):
        if browser=='chrome':
            self.driver=webdriver.Chrome()
        elif browser=='Edge':
            self.driver=webdriver.Edge()
        else:
            self.driver=webdriver.Firefox()

    #输入地址
    def get_url(self,url):
        self.driver.get(url)

    #定位元素
    def get_elment(self,loc):
        find_element=SearchBase(self.driver)
        element=find_element.by_id(loc)
        return  element
    #输入元素
    def element_send_value(self,value,loc):
        element=self.get_elment(loc)
        element.send_keys(value)

    # 点击元素
    def click_element(self,loc):
        self.get_elment(loc).click()

    # 等待
    def sleep_time(self):
        time.sleep(5)

    # 关闭浏览器
    def close_browser(self):
        self.driver.quit()

    # 获取浏览器标题
    def get_title(self):
        return self.driver.title

keyword_case.py 中代码,用来执行excel中的步骤并写入结果。

from baidu.util.excel_util import ExcelUtil
from baidu.keywordselenium.actionMethod import ActionMethod
class KeywordCase(object):
    def run_main(self):
        self.action_method = ActionMethod()
        handle_excel=ExcelUtil()
        case_lines=handle_excel.get_rows() # 获取excel数据行数

        if case_lines: # 如果有数据
            for i in range(1,case_lines): # 循环遍历第二行到最后一行的数据
                is_run=handle_excel.get_col_value(i,3) # 取‘是否执行’列的单元格内容
                if is_run=='Y':
                    method=handle_excel.get_col_value(i,4) # 获取执行方法名
                    send_value=handle_excel.get_col_value(i,5) #获取要输入的值
                    handle_value=handle_excel.get_col_value(i,6) #获取要操作的元素locator
                    expect_result_method=handle_excel.get_col_value(i,7) #获取为了获得预期结果要调用的方法名
                    expect_result=handle_excel.get_col_value(i,8) #获取预期结果值

                    self.run_method(method,send_value,handle_value) #执行关键字
                    if expect_result!='': # 如果有预期结果
                        expect_value=self.get_expect_result_value(expect_result) #获得=左右两侧的值,为一个list
                        # print(expect_value)
                        if expect_value[0] == 'text':
                            result=self.run_method(expect_result_method) #调用关键字获取页面title
                            #如果预期结果值正确,往excel中写入实际结果为pass,否则为fail
                            if expect_value[1] in result:  
                                handle_excel.write_value(i,'pass')
                            else:
                                handle_excel.write_value(i, 'fail')
                        elif expect_value[0] == 'element':
                            result=self.run_method(expect_result_method,handle_value=expect_value[1])
                            # 如果存在搜索结果,实际结果写入pass,否则fail
                            if result:
                                handle_excel.write_value(i, 'pass')
                            else:
                                handle_excel.write_value(i, 'fail')
                    else:
                        print("无预期结果")

    # 获取预期结果值
    def get_expect_result_value(self,data):
        return data.split('=')
     
    #执行excel中的方法名(即关键字)
    def run_method(self,method,send_value='',handle_value=''):
        method_value=getattr(self.action_method,method) # getattr返回对象属性值,如果是一个方法,返回值直接加括号就可以调用这个方法
        if send_value != '' and handle_value!='': # 如果有输入数据
            result=method_value(send_value,handle_value)
        elif handle_value!='': #如果有操作元素
            result=method_value(handle_value)
        else:
            result=method_value()
        return result

if __name__ == '__main__':
    kc=KeywordCase()
    kc.run_main()

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏

七月_M

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值