测试框架开发

自动化测试框架就是一个能够进行自动化测试的程序,其本质也是一堆“按照特定结构组织”的代码

使用自动化测试可提供代码的可复用性、可维护和可扩展性

框架设计比较灵活,并没有通用的标准来规定框架必须具备什么结构或功能,框架的目的只有一个,就是提高测试效率,降低测试成本

可复用性:编写的代码不仅只适用于一个模块或项目,同时也适用于其他的项目或模块,这个叫复用性

可维护性:减少代码维护时的工作量,比如需要修改某个功能的代码时,只需要修改一处即可,不需要每处代码去单独修改

可扩展性:当要增加或者是扩展功能时,可以不影响别的模块

自动化测试框架的两大核心功能:驱动测试、辅助测试

驱动测试:数据驱动(ddt) 关键字驱动(KDT)页面驱动(POM)

辅助测试:数据管理 报告管理 配置管理 日志管理等

测试驱动之数据驱动:

将测试代码和测试数据分离,一般用于一个测试场景需要多个不同的测试数据的条件下

通过数据驱动测试(有多少条测试数据,测试就会执行多少次)

典型的应用:unittest的ddt模块

关键字驱动的表达式:object.action(parameters)

关键字驱动将测试代码、测试业务和测试数据相分离

遇到某些xpath当中有逗号,干扰了参数解析,解决方法:

1.换一个分隔符,比如#

2.不用txt来写脚本,用excel等文档格式

data.txt

goto#http://localhost:8080/mms
input#id=username#admin
input#id=password#admin123
delay#1
singleclick#xpath=//input[contains(@onclick,"Login()")]
delay#1
checktext#id=loginName#admin
delay#1
singleclick#xpath=//div[text()="信息录入"]
delay#1
singleclick#xpath=//span[text()="录入顾客信息"]
delay#5
#droplist#xpath=/html/body/div[1]/div[3]/div/div[2]/div/div/div/div/form/div/div[1]/select#女
delay#5
over

keywords.py

import time
from  time import  sleep


class KeyWords:
    @classmethod
    def goto(cls,driver,*args):
        if args and len(args)>=2:
            driver.get(args[1]) #args[0]是goto这个关键字,args[1]是用户指定的url地址
            return  True
        else:
            print("goto命令参数不正确,请检查")
            return  False

    @classmethod
    def input(cls,driver,*args):
        if args and len(args)>=3:
            if 'xpath' in args[1]:
                locate_way='xpath'
                locator=args[1][6:]
                value=args[2].strip()
            else: #用id定位
                locate_way='id'
                locator=args[1][3:]
                value=args[2].strip()
            driver.find_element(locate_way,locator).send_keys(value)
            return True
        else:
            print("input命令参数不正确,请检查")
            return False

    @classmethod
    def singleclick(cls,driver,*args):
        if args and len(args)>=2:
            if 'xpath' in args[1]:
                locate_way='xpath'
                locator=args[1][6:]
            else: #用id定位
                locate_way='id'
                locator=args[1][3:]
            driver.find_element(locate_way,locator).click()
            return True
        else:
            print("singleclick命令参数不正确,请检查")
            return False

    @classmethod
    def delay(cls,driver,*args):
        if args and len(args) >= 2:
            sleep(int(args[1]))  #sleep("1")
            return True
        else:
            print("delay命令参数不正确,请检查")
            return False

    @classmethod
    def checktext(cls,driver,*args):
        if args and len(args)>=3:
            if 'xpath' in args[1]:
                locate_way='xpath'
                locator=args[1][6:]
                value=args[2].strip()
            else: #用id定位
                locate_way='id'
                locator=args[1][3:]
                value = args[2].strip()
            element=driver.find_element(locate_way,locator).text
            if value in element:
                print("文字检查成功,要检查的文字",value,"在文字",element,"内")
            else:
                print("文字检查失败,要检查的文字", value, "不在文字", element, "内")
            return  True
        else:
            print("checktext命令参数不正确,请检查")
            return False

    @classmethod
    def over(cls,driver,*args):
        driver.quit()
        print("测试结束,关闭浏览器")
        return True

    @classmethod
    def droplist(cls,driver,*args):
        driver.maximize_window()
        time.sleep(3)
        if args and len(args)>=3:
            if 'xpath' in args[1]:
                locate_way='xpath'
                locator=args[1][6:]
                value=args[2].strip()
            else: #用id定位
                locate_way='id'
                locator=args[1][3:]
                value=args[2].strip()
            from selenium.webdriver.support.ui import  Select
            Select(driver.find_element(locate_way,locator)).select_by_value(value)
            return True
        else:
            print("droplist命令参数不正确,请检查")
            return False

util.py

import openpyxl
class Util:

    @classmethod
    def get_test_data_from_txt(cls,path):
        cmd=[]
        with open(path,'r',encoding='utf8') as f:
            while True:
                line=f.readline() #读取一行
                if not line:  #读取结束
                    break
                if not line.startswith('#'):
                    cmd.append(line.strip())
            return  cmd

    @classmethod
    def get_test_data_from_excel(cls,path):
        book=openpyxl.load_workbook(path)
        sheet=book.active
        test_data=[]
        for row in range(2,sheet.max_row+1):
            cmds=''
            for col in range(1,sheet.max_column+1):
                content=sheet.cell(row=row,column=col).value
                if content:
                    cmds+=str(content)
                    cmds+='#'
            test_data.append(cmds[:-1])
        return test_data
if __name__=='__main__':
    cmd=Util.get_test_data_from_excel('123.xlsx')
    print(cmd)

run.py

from selenium import  webdriver
from util import Util
from keywords import  KeyWords
def run_case(driver):
    test_data=Util.get_test_data_from_excel('123.xlsx')
    for line in test_data:
        print("当前执行的是:{}".format(line))
        key_words=line.split('#')
        if hasattr(KeyWords,key_words[0]):
            action=getattr(KeyWords,key_words[0])
            result=action(driver,*key_words)
            if not result:
                print("命令执行错误,测试终止")
                break
            else:
                print("命令执行成功")

if __name__=="__main__":
    driver=webdriver.Chrome()
    run_case(driver)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值