精华内容
下载资源
问答
  • 关键字驱动测试框架

    千次阅读 2011-08-14 17:52:02
    自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段,它是当前比较流行的一种框架之一,并且现在的自动化测试工具QuickTest已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性...

    自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段,它是当前比较流行的一种框架之一,并且现在的自动化测试工具QuickTest已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性保存到对象库中。

    录制完成后的每个测试步骤主要有三个元素组成:

    1.          Item:指对象名,可以是一个窗口、按钮等;
    2.          Operation:指要执行的动作,如Select、Click等;
    3.          Value:操作动作所输入的数据值;

    以QuickTest自带的飞机订票系统为例,录制其登录过程,生成的代码如下:

    Dialog("Login").WinEdit("Agent Name:").Set "test"

    Dialog("Login").WinEdit("Password:").SetSecure "4d410e55b694bada39e235f9896e6eb810ba0e60"

    Dialog("Login").WinButton("OK").Click

    这是QuickTest以关键驱动的方式生成的代码,但也可以通过代码来实现关键字驱动测试。关键字驱动测试最核心的是关键字表格。以飞机订票系统的登录为例,其关键字表格见表19-1。

    父对象

    孩子对象

    描述

    事件

    Dialog

     

    text:=Login

    Launch

    D:\QuickTest Professional\samples\flight\app\flight4a.exe

    Dialog

    WinEdit

    attached text:=Agent Name:

    Set

    test

    Dialog

    WinEdit

    attached text:=Password:

    Set

    mercury

    Dialog

    WinButton

    text:=ok

    Click

     

     

    关键字驱动的思路是将关键字表中的对象及数据提取出来并构造成每个测试步骤,如步骤:

    Dialog("Login").WinEdit("Agent Name:").Set "test"

    需要将关键字表中的对象、属性及输入的数据读取出来,将它们构造同以上格式的代码步骤,通过这种方式来实现关键字驱动的功能。

    下面是调试好的一个的关键字驱动的框架,代码如下:

    —————————————————————————————————

    ''

    ' 工程名:关键字驱动

    '

    ' 方法:

    '    GetExcelCells —————读取单元格中的值

    '    GetExcleSheetRowsCount—————获取关键字驱动表中的行数

    '    oParentObject—————构造父对象

    '    oChildObject—————构造子对象

    '    oEventObject —————对对象属性赋值

    '

    ' 版本:v1.0

    '作者:黄文高

    '时间:2011-01-27

    '———————————————————————————————————

    Dim arrObjectName

    Dim oParent

    Dim oChild

    Dim oClassName

    Dim oValue

    dim object

    '———————————————————————————————————

    ''

    ' 函数名:GetExcelCells

    '

    ' 参数:

    '    ExcelPath —————关键字驱动表的路径

    '    SheetName—————关键字驱动表的sheet名

    '    SheetRow—————单元格中的行

    '    SheetColumn—————单元格中的列

    '

    '时间:2011-01-27

    '——————————————————————————————————

    Function GetExcelCells(ExcelPath,SheetName,SheetRow,SheetColumn)

             Set ExcelBook = CreateObject("Excel.Application")

             Set ExcelSheet = CreateObject("Excel.Sheet")

             Set myExcelBook = ExcelBook.WorkBooks.Open(ExcelPath)

             Set myExcelSheet = myExcelBook.WorkSheets(SheetName)

             SheetValue = myExcelSheet.cells(SheetRow,SheetColumn).value

             GetExcelCells = SheetValue

             ExcelBook.Quit

             set ExcelSheet = Nothing

             Set ExcelBook = Nothing

    End Function

    '——————————————————————————————————

    ''

    ' 函数名:GetExcleSheetRowsCount

    '

    ' 参数:

    '    ExcelPath —————关键字驱动表的路径

    '    SheetName—————关键字驱动表的sheet名

    '

    '时间:2011-01-27

    '——————————————————————————————————

    Function GetExcleSheetRowsCount(ExcelPath,SheetName)

             Set ExcelBook = CreateObject("Excel.Application")

             Set ExcelSheet = CreateObject("Excel.Sheet")

             Set myExcelBook = ExcelBook.WorkBooks.Open(ExcelPath)

             Set myExcelSheet = myExcelBook.WorkSheets(SheetName)

             GetExcleSheetRowsCount = myExcelSheet.UsedRange.Rows.Count

             ExcelBook.Quit

             set ExcelSheet = Nothing

             Set ExcelBook = Nothing     

    End Function

    '——————————————————————————————————

    ''

    ' 函数名:oParentObject

    '

    ' 参数:

    '    parentobject —————关键字驱动表的Parent列

    '

    '时间:2011-01-27

    '——————————————————————————————————

    Function oParentObject(parentobject)

             arrObjectName = array("text:=Login","regexpwndtitle:=Flight Reservation")

             '在这里可以添加其它的一些对象类型,如Browser对象

             '因为在关键字驱动表中可能存在多种对象

          Select Case LCase(parentobject)

                       Case "window"

                         Set object = window(arrObjectName(1))

                       Case "dialog"

                                Set object = dialog(arrObjectName(0))

                       Case else

                                print "对象错误"

             End Select

    End Function

    '——————————————————————————————————

    ''

    ' 函数名:oChildObject

    '

    ' 参数:

    '    childobject —————关键字驱动表的Child列

    '    childobjectName —————关键字驱动表的Description列

    '

    '时间:2011-01-27

    '————————————————————————————————

    Function oChildObject(childobject,childobjectName)

             If childobject <> "" Then

                       '在这里可以添加其它的一些子对象类型

                       '如WebList对象

                       Select Case LCase(childobject)

                                Case "winedit"

                                         Set object = object.WinEdit(childobjectName)

                                Case "winbutton"

                                         Set object = object.WinButton(childobjectName)

                        End Select

             End If

    End Function

    '———————————————————————————————————

    ''

    ' 函数名:oEventObject

    '

    ' 参数:

    '    eventobject —————关键字驱动表的Event列

    '    oValue —————关键字驱动表的Value列

    '

    '时间:2011-01-27

    '——————————————————————————————————

    Function oEventObject(eventobject,oValue)

          If eventobject <> "" Then

                       '在这里可以添加其它的多种属性,如Type

                       Select Case LCase(eventobject)

                                Case "set"

                                         object.set oValue

                                Case "click"

                                  object.click

                                Case else

                                         print "属性错误"

                       End Select

             End If

    End Function

    systemutil.Run "D:\QuickTest Professional\samples\flight\app\flight4a.exe","","",""

    For i =5 to GetExcleSheetRowsCount("C:\Data.xls","TestCase")

             oParent = GetExcelCells("C:\Data.xls","TestCase",i,1)

             oChild = GetExcelCells("C:\Data.xls","TestCase",i,2)

             oClassName = GetExcelCells("C:\Data.xls","TestCase",i,3)

             oEvent = GetExcelCells("C:\Data.xls","TestCase",i,4)

             oValue = GetExcelCells("C:\Data.xls","TestCase",i,5)

             oParentObject oParent

             oChildObject oChild,oClassName

             oEventObject oEvent,oValue

    Next

     

    摘自《QTP自动化测试与框架模型设计》书中的关键字驱动测试框架

    展开全文
  • 关键字驱动测试框架的研究,为了挣点积分才上传的关键字驱动测试框架的研究,为了挣点积分才上传的关键字驱动测试框架的研究,为了挣点积分才上传的
  • 关键字驱动测试框架搭建(3)关键字驱动的完整框架:在Pycharm中创建一Python工程,其下再创建Util包,action包,config包,testScripts包,log目录,testData目录,exceptionPictures目录,具体内容如下:Util包中...

    关键字驱动测试框架搭建(3)
    关键字驱动的完整框架:
    在Pycharm中创建一Python工程,其下再创建Util包,action包,config包,testScripts包,log目录,testData目录,exceptionPictures目录,具体内容如下:
    Util包中存放封装的常用函数:
    ParseExcel.py 解析Excel

    #encoding=utf-8
    import openpyxl
    from openpyxl.styles import Border,Side,Font
    import time
    
    class ParseExcel(object):
        def __init__(self):
            self.workbook = None
            self.excelFile = None
            self.font = Font(color = None) #设置字体的颜色
            self.RGBDict = {"red":"FFFF3030","green":"FF008B00"}
    
        def loadWorkbook(self,excelPathAndName):
            #将excel加载到内存,并获取其workbook对象
            try:
                self.workbook = openpyxl.load_workbook(excelPathAndName)
            except Exception,e:
                raise e
            self.excelFile = excelPathAndName
            return self.workbook
    
        def getSheetByName(self,sheetName):
            #要报sheet名称获取sheet对象
            try:
                sheet = self.workbook.get_sheet_by_name(sheetName)
                return sheet
            except Exception,e:
                raise e
    
        def getSheetByIndex(self,sheetIndex):
            #根据sheet的索引号获取sheet对象
            try:
                sheetname = self.workbook.get_sheet_names()[sheetIndex]
            except Exception,e:
                raise e
            sheet = self.workbook.get_sheet_by_name(sheetname)
            return sheet
    
        def getRowsNumber(self,sheet):
            #获取sheet中有数据区域的结束行号
            return sheet.max_row
    
        def getColsNumber(self,sheet):
            #获取sheet中有数据区域的结束列号
            return sheet.max_column
    
        def getStartRowNumber(self,sheet):
            #获取sheet中有数据区域的开通行号
            return sheet.min_row
    
        def getStartColNumber(self,sheet):
            #获取sheet中有数据区域的开始列号
            return sheet.min_column
    
        def getRow(self,sheet,rowNo):
            #获取sheet中的某一行,返回的是这一行所有的数据内容组成的tuple
            #下标从1开始,sheet.rows[1]表示第一行
            try:
                rows = []
                for row in sheet.iter_rows():
                    rows.append(row)
                return rows[rowNo-1]
            except Exception,e:
                raise e
    
        def getColumn(self,sheet,colNo):
            #获取sheet中的某一列,返回的是这一列所有的数据内容组成的tuple
            # 下标从1开始,sheet.cols[1]表示第一列
            try:
                cols = []
                for col in sheet.iter_cols():
                    cols.append(col)
                return cols[colNo-1]
            except Exception,e:
                raise e
    
        def getCellOfValue(self,sheet,coordinate = None,rowNo = None,colNo = None):
            #要报单元格所在的索引位置获取该单元格的值,下标从1开始
            #sheet.cell(row=1,column=1).value,表示 excel中第一行第一列的值
            if coordinate != None:
                try:
                    return sheet.cell(coordinate = coordinate).value
                except Exception,e:
                    raise e
            elif coordinate == None is None and rowNo is not None and colNo is not None:
                try:
                    return sheet.cell(row = rowNo,column = colNo).value
                except Exception,e:
                    raise e
            else:
                raise Exception("Insufficient Coordinate of cell")
    
        def getCellOfObject(self,sheet,coordinate = None,rowNo = None,colNo = None):
            #获取某个单元格对象,可以通过单元格的位置索引,也可以通过Excel单元格的编码坐标、,
            #如 getCellOfObject(sheet,coordinate = "A1")  , 或getCellOfObject(sheet,rowNo=1,colNo=1)
            if coordinate != None:
                try:
                    return sheet.cell(coordinate = coordinate)
                except Exception,e:
                    raise e
            elif coordinate == None and rowNo is not None and colNo is not None:
                try:
                    return sheet.cell(row = rowNo,column = colNo)
                except Exception,e:
                    raise e
            else:
                raise Exception("Insufficient Coordinate of cell")
    
        def writeCell(self,sheet,content,coordinate = None,rowNo = None,colNo = None,style = None):
            #根据单元格在excel中的编码坐标或数字索引坐标向单元 格中写入数据
            #下标从1开始,参数style表示字体的颜色的名称,red green
            if coordinate is not None:
                try:
                    sheet.cell(coordinate = coordinate).value = content
                    if style is not None:
                        sheet.cell(coordinate = coordinate).font = Font(color = self.RGBDict[style])
                    self.workbook.save(self.excelFile)
                except Exception,e:
                    raise e
            if coordinate == None and rowNo is not None and colNo is not None:
                try:
                    sheet.cell(row = rowNo,column = colNo).value  = content
                    if style is not None:
                       sheet.cell(coordinate=coordinate).font = Font(color=self.RGBDict[style])
                    self.workbook.save(self.excelFile)
                except Exception,e:
                    raise e
            else:
                raise Exception("Insufficient Coordinate of cell")
    
        def writeCellCurrentTime(self,sheet,coordinate = None,rowNo = None,colNo = None):
            #写入当前时间
            now = int(time.time())
            timeArray = time.localtime(now)
            currentTime = time.strftime("%Y-%m-%d %H:%M:%S",timeArray)
            if coordinate != None:
                try:
                    sheet.cell(coordinate = coordinate).value = currentTime
                    self.workbook.save(self.excelFile)
                except Exception,e:
                    raise e
            elif coordinate == None and rowNo is not None and colNo is not None:
                try:
                    sheet.cell(row = rowNo,column = colNo).value = currentTime
                    self.workbook.save(self.excelFile)
                except Exception,e:
                    raise e
            else:
                raise Exception("Insufficient Coordinate of cell")
    
    if __name__ == "__main__":
        pe = ParseExcel()
        pe.loadWorkbook("D:\\test\\test.xlsx")
        print u"通过名称获取sheet对象的名字:",pe.getSheetByName("test2").title
        print u"通过序号获取sheet对象的名字:",pe.getSheetByIndex(0).title
        sheet = pe.getSheetByIndex(1)
        print type(sheet)
        print u"最大行号:",pe.getRowsNumber(sheet)
        print u"最大列号:",pe.getColsNumber(sheet)
        row = pe.getRow(sheet,2) #获取第二行
        print row
        for i in row:
            print i.value
    
        print pe.getCellOfValue(sheet,rowNo = 1,colNo = 1)
        pe.writeCell(sheet,u"I love Python代码",rowNo = 10,colNo= 10)
        pe.writeCellCurrentTime(sheet,rowNo = 10,colNo = 11)
        print pe.getCellOfValue(sheet,rowNo = 10,colNo = 10)
        print pe.getCellOfValue(sheet,rowNo = 10,colNo = 11)

    DirAndTime.py 封装时间和异常截图目录

    #encoding=utf-8
    import os,time
    from datetime import datetime
    from config.VarConfig import screenPicturesDir
    
    #获取当前日期
    def getCurrentDate():
        timeTup = time.localtime()
        currentDate = str(timeTup.tm_year) + "-" + str(timeTup.tm_mon) + "-" + str(timeTup.tm_mday)
        return currentDate
    
    #获取当前的时间
    def getCurrentTime():
        timeStr = datetime.now()
        nowTime = timeStr.strftime("%H:%M:%S")
        return  nowTime
    
    #创建截图存放的目录
    def createCurrentDateDir():
        dirName = os.path.join(screenPicturesDir,getCurrentDate())
        if not os.path.exists(dirName):
            os.mkdir(dirName)
        return dirName
    
    if __name__ == "__main__":
        print getCurrentDate()
        print getCurrentTime()
        print createCurrentDateDir()

    log.py 封装日志

    #encoding=utf-8
    import logging
    import logging.config
    from config.VarConfig import parentDirPath
    
    #读取日志配置文件
    logging.config.fileConfig(parentDirPath + u"\\config\\Logger.conf")
    
    #选择一个日志格式
    logger = logging.getLogger("example01")
    
    def debug(message):
        #定义debug级别日志打印方法
        logger.debug(message)
    
    def info(message):
        #定义info级别日志打印方法
        logger.info(message)
    
    def warning(message):
        #定义warning级别日志打印方法
        logger.warning(message)

    ObjectMap.py  封装获取页面元素方法

    #encoding=utf-8
    from selenium.webdriver.support.ui import WebDriverWait
    
    #获取单个页面元素
    def getElement(driver,locationType,locatorExpression):
        try:
            element = WebDriverWait(driver,30).until(lambda x:x.find_element(by = locationType,value = locatorExpression))
            return element
        except Exception,e:
            raise e
    
    #获取多个相同页面元素对象,以list返回
    def getElements(driver,locationType,locatorExpression):
        try:
            elements = WebDriverWait(driver,30).until(lambda x:x.find_elements(by = locationType,value = locatorExpression))
            return elements
        except Exception,e:
            raise e
    
    if __name__ == "__main__":
        from selenium import webdriver
        #进行单元测试
        driver = webdriver.Firefox(executable_path="D:\\geckodriver")
        driver.get("http://www.baidu.com")
        searchBox = getElement(driver,"id","kw")
        #打印页面对象的标签名
        print searchBox.tag_name
        aList = getElements(driver,"tag name","a")
        print len(aList)
        driver.quit()

    WaitUtil.py 封装等待类

    #encoding=utf-8
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    class WaitUtil(object):
        def __init__(self,driver):
            self.locationTypeDict = {
                "xpath":By.XPATH,
                "id":By.ID,
                "name":By.NAME,
                "css_selector":By.CSS_SELECTOR,
                "class_name":By.CLASS_NAME,
                "tag_name":By.TAG_NAME,
                "link_text":By.LINK_TEXT,
                "partial_link_text":By.PARTIAL_LINK_TEXT,
            }
            self.driver = driver
            self.wait = WebDriverWait(driver,30)
    
        def presenceOfElementLocated(self,locatorMethod,locatorExpression,*args):
            """显式等待页面元素出现在DOM中,但并不一定可见,存在则返回该页面元素"""
            try:
                if self.locationTypeDict.has_key(locatorMethod.lower()):
                    self.wait.until(EC.presence_of_element_located((self.locationTypeDict[locatorMethod.lower()],locatorExpression)))
                else:
                    raise Exception(u"未找到定位方式,请确认定位方式是否书写正确")
            except Exception,e:
                raise e
    
        def frameToBeAvailableAndSwitchToIt(self,locationType,locatorExpression,*args):
            """检查frame是否存在,存在则切换进frame控件中"""
            try:
                self.wait.until(EC.frame_to_be_available_and_switch_to_it((self.locationTypeDict[locationType.lower()],locatorExpression)))
            except Exception,e:
                raise e
    
        def visibilityOfElementLocated(self,locationMethod,locatorExperssion,*args):
            """显式等待页面元素出现在DOM中,并且可见,存在则返回该页面元素对象"""
            try:
                self.wait.until(EC.visibility_of_element_located((self.locationTypeDict[locationMethod.lower()],locatorExperssion)))
            except Exception,e:
                raise e
    
    if __name__ == "__main__":
        from selenium import webdriver
        driver = webdriver.Firefox(executable_path = "D:\\geckodriver")
        driver.get("https://mail.126.com/")
        waitUtil = WaitUtil(driver)
        driver.find_element_by_id("lbNormal").click()
        # waitUtil.presenceOfElementLocated("id","lbNormal")
        waitUtil.frameToBeAvailableAndSwitchToIt("xpath",'//iframe[contains(@id,"x-URS-iframe")]')
        waitUtil.visibilityOfElementLocated("xpath","//input[@name='email']")
        waitUtil.presenceOfElementLocated("xpath","//input[@name='email']")
        driver.quit()

    ClipboardUtil.py  封装操作剪切板方法

    #encoding=utf-8
    import win32clipboard as w
    import win32con
    
    class Clipboard(object):
        """模拟windows设置剪切板"""
        #读取剪切板
        @staticmethod
        def getText():
            #打开剪切板
            w.OpenClipboard()
            #获取剪切板中的数据
            d = w.GetClipboardData(win32con.CF_TEXT)
            #关闭剪切板
            w.CloseClipboard()
            #返回剪切板数据给调用者
            return d
    
        #设置剪切板内容
        @staticmethod
        def setText(aString):
            #打开剪切板
            w.OpenClipboard()
            #清空剪切板
            w.EmptyClipboard()
            #将数据aString写入剪切板
            w.SetClipboardData(win32con.CF_UNICODETEXT,aString)
            #关闭剪切板
            w.CloseClipboard()

    KeyBoardUtil.py 封装键盘按键方法

    #encoding=utf-8
    import win32con
    import win32api
    
    class KeyBoardKeys(object):
        """模拟键盘按键类"""
        VK_CODE = {
            'enter': 0x0D,
            'ctrl': 0x11,
            'v': 0x56
        }
    
        @staticmethod
        def keyDown(keyName):
            #按下按键
            win32api.keybd_event(KeyBoardKeys.VK_CODE[keyName],0,0,0)
    
        @staticmethod
        def keyUp(keyName):
            #释放按键
            win32api.keybd_event(KeyBoardKeys.VK_CODE[keyName],0,win32con.KEYEVENTF_KEYUP,0)
    
        @staticmethod
        def oneKey(key):
            #模拟单个按键
            KeyBoardKeys.keyDown(key)
            KeyBoardKeys.keyUp(key)
    
        @staticmethod
        def twoKeys(key1,key2):
            KeyBoardKeys.keyDown(key1)
            KeyBoardKeys.keyDown(key2)
            KeyBoardKeys.keyUp(key2)
            KeyBoardKeys.keyUp(key1)

    config包存放日志配置文件和变量:
    Logger.conf

    #logger.conf
    ###############################################
    [loggers]
    keys=root,example01,example02
    [logger_root]
    level=DEBUG
    handlers=hand01,hand02
    
    [logger_example01]
    handlers=hand01,hand02
    qualname=example01
    propagate=0
    
    [logger_example02]
    handlers=hand01,hand03
    qualname=example02
    propagate=0
    
    ###############################################
    [handlers]
    keys=hand01,hand02,hand03
    
    [handler_hand01]
    class=StreamHandler
    level=INFO
    formatter=form01
    args=(sys.stderr,)
    
    [handler_hand02]
    class=FileHandler
    level=DEBUG
    formatter=form01
    args=('log\\Mail126TestLogfile.log', 'a')
    
    [handler_hand03]
    class=handlers.RotatingFileHandler
    level=INFO
    formatter=form01
    args=('log\\Mail126TestLogfile.log', 'a', 10*1024*1024, 5)
    
    ###############################################
    [formatters]
    keys=form01,form02
    
    [formatter_form01]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
    datefmt=%Y-%m-%d %H:%M:%S
    
    [formatter_form02]
    format=%(name)-12s: %(levelname)-8s %(message)s
    datefmt=%Y-%m-%d %H:%M:%S

    VarConfig.py 存放变量

    #encoding=utf-8
    import os
    
    ieDriverFilePath = "D:\\IEDriverServer"
    chromeDriverFilePath = "D:\\chromedriver"
    firefoxDriverFilePath = "D:\\geckodriver"
    
    #当前文件所在目录的父目录的绝对路径
    parentDirPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    #异常截图存放目录绝对路径
    screenPicturesDir = parentDirPath + u"\\exceptionpictures"
    
    #测试数据文件存放的绝对路径
    dataFilePath = parentDirPath + u"\\testData\\126邮箱发送邮件.xlsx"
    
    # 测试数据文件中,测试用例表中部分列对应的数字序号
    testCase_testCaseName = 2
    testCase_testStepSheetName = 4
    testCase_isExecute = 5
    testCase_runTime = 6
    testCase_testResult = 7
    
    # 用例步骤表中,部分列对应的数字序号
    testStep_testStepDescribe = 2
    testStep_keyWords = 3
    testStep_locationType = 4
    testStep_locatorExpression = 5
    testStep_operateValue = 6
    testStep_runTime = 7
    testStep_testResult = 8
    testStep_errorInfo = 9
    testStep_errorPic = 10

    testData目录下存放测试数据,26邮箱发送邮件.xlsx
    sheet--测试用例            
    序号    用例名称         用例描述                             步骤sheet名             是否执行           执行结束时间            结果
    1    登录126邮箱             使用有效的账号登录126邮箱                 登录                      y    
    2    发送带附件的邮件    登录126邮箱后,发送一封带附件的邮件         发邮件                      y    

    sheet--登录
    序号    测试步骤描述    关键字    操作元素的定位方式    操作元素的定位表达式    操作值    测试执行时间    测试结果    错误信息    错误截图
    1         打开浏览器    open_browser            chrome                
    2        访问被测试网址http://www.126.com    visit_url            http://www.126.com                
    3        最大化窗口    maximize_browser                            
    4        等待126邮箱登录主页加载完成    sleep            5                
    5        断言当前活动页面源码中是否包含“126网易免费邮--你的专业电子邮局”    assert_string_in_pagesource            126网易免费邮--你的专业电子邮局                
    6        显示等待id属性值为x-URS-iframe的frame框的出现,然后切换进入该frame框中    waitFrameToBeAvailableAndSwitchToIt    id    x-URS-iframe                    
    7        输入登录用户名    input_string    xpath    //input[@name='email']    xxxx
    8        输入登录密码    input_string    xpath    //input[@name='password']    xxxx
    9        点击登录按钮    click    id    dologin                    
    10        等待    sleep            5                
    11        切回默认会话窗体    switch_to_default_content                            
    12    断言登录成功后的页面标题是否包含“网易邮箱6.0版”关键内容    assert_title            网易邮箱6.0版                


    sheet--发邮件
    序号    测试步骤描述    关键字    操作元素的定位方式    操作元素的定位表达式    操作值    测试执行时间    测试结果    错误信息    错误截图
    1    判断“写信”按钮是否在页面上可见    waitVisibilityOfElementLocated    xpath    //span[text()='写 信']                    
    2    点击“写信”按钮    click    xpath    //span[text()='写 信']                    
    3    输入收件人地址    input_string    xpath    //div[contains(@id,'_mail_emailinput')]/input    xxx@126.com                
    4    输入邮件主题    input_string    xpath    //div[@aria-label='邮件主题输入框,请输入邮件主题']/input    带附件的邮件                
    5    点击“上传附件”链接    click    xpath    // div[contains( @ title, '点击添加附件')]                    
    6    输入附件所在绝对路径    paste_string            D:\\test\\test.txt                
    7    模拟键盘回车键    press_enter_key                            
    8    显示等待附件上传完毕    waitVisibilityOfElementLocated    xpath    //span[text()="上传完成"]                    
    9    如果邮件正文的frame框是否可见,切换进该frame中    waitFrameToBeAvailableAndSwitchToIt    xpath    //iframe[@tabindex=1]                    
    10    输入邮件正文    input_string    xpath    /html/body    发给光荣之路的一封信                
    11    退出邮件正文的frame    switch_to_default_content                            
    12    点击邮件发送按钮    click    xpath    //header//span[text()='发送']                    
    13    等待邮件发送成功,返回结果    sleep            3                
    14    断言页面源码中是否出现“发送成功”关键内容    assert_string_in_pagesource            发送成功                
    15    关闭浏览器    close_browser                            


    创建log目录,存放日志文件
    创建exceptionpictures目录,存放异常截图
    创建action包,存放关键字对应的方法
    PageAction.py

    #encoding=utf-8
    from selenium import webdriver
    from config.VarConfig import ieDriverFilePath
    from config.VarConfig import chromeDriverFilePath
    from config.VarConfig import firefoxDriverFilePath
    from Util.ObjectMap import getElement
    from Util.KeyBoardUtil import KeyBoardKeys
    from Util.ClipboardUtil import Clipboard
    from Util.DirAndTime import *
    from Util.WaitUtil import WaitUtil
    from selenium.webdriver.firefox.options import Options
    from selenium.webdriver.chrome.options import Options
    import time
    
    #定义全局变量driver
    driver = None
    #定义全局的等待类实例对象
    waitUtil = None
    
    def open_browser(browserName,*args):
        #打开浏览器
        global driver,waitUtil
        try:
            if browserName.lower() == "ie":
                driver = webdriver.Ie(executable_path = ieDriverFilePath)
            elif browserName.lower == "chrome":
                #创建Chrome浏览器的一个Options实例对象
                chrome_options = Options()
                #添加屏蔽--ignore--certificate--errors提示信息的设置参数项
                chrome_options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
                driver = webdriver.Chrome(executable_path = chromeDriverFilePath,chrome_options = chrome_options)
            else:
                driver = webdriver.Firefox(executable_path = firefoxDriverFilePath)
            #driver对象创建成功后,创建等待类实例对象
            waitUtil = WaitUtil(driver)
        except Exception,e:
            raise e
    
    def visit_url(url,*args):
        #访问某个网站
        global driver
        try:
            driver.get(url)
        except Exception,e:
            raise e
    
    def close_browser(*args):
        #关闭浏览器
        global driver
        try:
            driver.quit()
        except Exception,e:
            raise e
    
    def sleep(sleepSeconds,*args):
        #强制等待
        try:
            time.sleep(int(sleepSeconds))
        except Exception,e:
            raise e
    
    def clear(locationType,locatorExpression,*args):
        #清空输入框默认内容
        global driver
        try:
            getElement(driver,locationType,locatorExpression).clear()
        except Exception,e:
            raise e
    
    def input_string(locationType,locatorExpression,inputContent):
        #在页面输入框中输入数据
        global driver
        try:
            getElement(driver,locationType,locatorExpression).send_keys(inputContent)
        except Exception,e:
            raise e
    
    def click(locationType,locatorExpression,*args):
        #点击页面元素
        global driver
        try:
            getElement(driver,locationType,locatorExpression).click()
        except Exception,e:
            raise e
    
    def assert_string_in_pagesource(assertString,*args):
        #断言页面源码是否存在某个关键字或关键字符串
        global driver
        try:
            assert assertString in driver.page_source,u"%s not found in page source!" % assertString
        except AssertionError,e:
            raise AssertionError(e)
        except Exception,e:
            raise e
    
    def assert_title(titleStr,*args):
        #断言页面标题是否存在给定的关键字符串
        global driver
        try:
            assert titleStr in driver.title,u"%s not found in page title!" % titleStr
        except AssertionError,e:
            raise AssertionError(e)
        except Exception,e:
            raise e
    
    def getTitle(*args):
        #获取页面标题
        global driver
        try:
            return driver.title
        except Exception,e:
            raise e
    
    def getPageSource(*args):
        #获取页面源码
        global driver
        try:
            return driver.page_source
        except Exception,e:
            raise e
    
    def switch_to_frame(locationType,frameLocatorExpressoin,*args):
        #切换进frame
        global driver
        try:
            driver.switch_to.frame(getElement(driver,locationType,frameLocatorExpressoin))
        except Exception,e:
            print "frame error!"
            raise e
    
    def switch_to_default_content(*args):
        #切换妯frame
        global driver
        try:
            driver.switch_to.default_content()
        except Exception,e:
            raise e
    
    def paste_string(pasteString,*args):
        #模拟Ctrl+V操作
        try:
            Clipboard.setText(pasteString)
            #等待2秒,防止代码执行过快,而未成功粘贴内容
            time.sleep(2)
            KeyBoardKeys.twoKeys("ctrl","v")
        except Exception,e:
            raise e
    
    def press_tab_key(*args):
        #模拟tab键
        try:
            KeyBoardKeys.oneKey("tab")
        except Exception,e:
            raise e
    
    def press_enter_key(*args):
        #模拟enter键
        try:
            KeyBoardKeys.oneKey("enter")
        except Exception,e:
            raise e
    
    def maximize_browser(*args):
        #窗口最大化
        global driver
        try:
            driver.maximize_window()
        except Exception,e:
            raise e
    
    def capture_screen(*args):
        #截取屏幕图片
        global driver
        currentTiem = getCurrentTime()
        picNameAndPath = str(createCurrentDateDir()) + "\\" + str(currentTiem) + ".png"
        try:
            driver.get_screenshot_as_file(picNameAndPath.replace(("\\",r"\\")))
        except Exception,e:
            raise e
        else:
            return picNameAndPath
    
    def waitPresenceOfElementLocated(locationType,locatorExpression,*args):
        """显式等待页面元素出现在DOM中,但不一定可见,存在则返回该页面元素对象"""
        global waitUtil
        try:
            waitUtil.presenceOfElementLocated(locationType,locatorExpression)
        except Exception,e:
            raise e
    
    def waitFrameToBeAvailableAndSwitchToIt(locationType,locatorExprssion,*args):
        """检查frame是否存在,存在则切换进frame控件中"""
        global waitUtil
        try:
            waitUtil.frameToBeAvailableAndSwitchToIt(locationType,locatorExprssion)
        except Exception,e:
            raise e
    
    def waitVisibilityOfElementLocated(locationType,locatorExpression,*args):
        """显式等待页面元素出现在Dom中,并且可见,存在返回该页面元素对象"""
        global waitUtil
        try:
            waitUtil.visibilityOfElementLocated(locationType,locatorExpression)
        except Exception,e:
            raise e

    testScript包,存放写入测试结果和执行测试脚本,TestSendMailWithAttachment.py

    #encoding=utf-8
    from action.PageAction import *
    from Util.ParseExcel import ParseExcel
    from config.VarConfig import *
    import time,traceback
    from Util.Log import *
    
    #设置此次测试的环境编码为utf8
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    #创建解析Excel对象
    excelObj = ParseExcel()
    #将Excel数据文件加载到内存
    excelObj.loadWorkbook(dataFilePath)
    
    #用例或用例步骤执行结束后,向excel中写入结果信息
    def writeTestResult(sheetObj,rowNo,colNo,testResult,errorInfo = None,picPath = None):
        #测试通过结果信息为绿色,失败为红色
        colorDict = {"pass":"green","fail":"red"}
    
        #因为“测试用例”工作表和“用例步骤”sheet表中都有测试执行时间和测试结果列,定义此字典是为了区分具体应该写那个工作表
        colsDict = {"testCase":[testCase_runTime,testCase_testResult],"testStep":[testStep_runTime,testStep_testResult]}
        try:
            #在测试步骤sheet中,写入测试时间
            excelObj.writeCellCurrentTime(sheetObj,rowNo = rowNo,colNo = colsDict[colNo][0])
            #在测试步骤sheet中,写入测试结果
            excelObj.writeCell(sheetObj,content = testResult,rowNo = rowNo,colNo = colsDict[colNo][1],style = colorDict[testResult])
            if errorInfo and picPath:
                #在测试步骤sheet中,写入异常信息
                excelObj.writeCell(sheetObj,content = errorInfo,rowNo = rowNo,colNo = testStep_errorInfo)
                #在测试步骤sheet中,写入异常截图
                excelObj.writeCell(sheetObj,content = picPath,rowNo = rowNo,colNo = testStep_errorPic)
            else:
                #在测试步骤sheet中,清空异常信息单元格
                excelObj.writeCell(sheetObj,content="",rowNo = rowNo,colNo = testStep_errorInfo)
                #在测试步骤sheet中,清空异常截图单元格
                excelObj.writeCell(sheetObj,content="",rowNo = rowNo,colNo = testStep_errorPic)
        except Exception,e:
            #在日志文件是写入详细异常堆栈信息
            logging.debug(u"写入excel出错,%s" % traceback.format_exc())
    
    def TestSendMailWithAttachment():
        try:
            #根据excel中的sheet名称获取sheet对象
            caseSheet = excelObj.getSheetByName(u"测试用例")
            #获取测试用例hsheet中是否执行列对象
            isExecuteColumn = excelObj.getColumn(caseSheet,testCase_isExecute)
            #记录执行成功的测试用例个数
            successfulCase = 0
            #记录需要执行的用例个数
            requiredCase = 0
            for idx,i in enumerate(isExecuteColumn[1:]):
                #因为测试用例sheet中第一行为标题,无需执行,所以从第二行开始遍历
                #循环遍历“测试用例”sheet表中的用例, 执行被设置为“执行”的用例
                print i.value
                if i.value.lower() == "y":
                    requiredCase += 1
                    #获取“测试用例”表中第第idx+2行数据
                    caseRow = excelObj.getRow(caseSheet,idx+2)
                    #获取第idx+2行的“步骤sheet名”单元格内容
                    caseStepSheetName = caseRow[testCase_testStepSheetName - 1].value
                    print caseStepSheetName
                    #根据用例步骤名获取步骤sheet对象
                    stepSheet = excelObj.getSheetByName(caseStepSheetName)
                    #获取步骤sheet中步骤数
                    stepNum = excelObj.getRowsNumber(stepSheet)
                    print stepNum
                    #记录测试用例i的步骤执行成功数
                    successfulSteps = 0
                    logging.info(u"开始执行用例“%s”" % caseRow[testCase_testCaseName - 1].value)
                    for step in xrange(2,stepNum + 1):
                        #因为步骤sheet中的第一行为标题行,无需执行,
                        #获取步骤sheet中的step行对象
                        stepRow = excelObj.getRow(stepSheet,step)
                        #获取关键字作为调用 的函数名
                        keyWord = stepRow[testStep_keyWords - 1].value
                        #获取操作元素定位方式作为调用函数的参数
                        locationType = stepRow[testStep_locationType - 1].value
                        #获取操作元素的定位表达式作为调用函数的参数
                        locatorExpression = stepRow[testStep_locatorExpression - 1].value
                        #获取操作值作为调用函数的参数
                        operateValue = stepRow[testStep_operateValue - 1].value
                        #将操作值为数字类型的数据转换成字符串类型,方便字符拼接
                        if isinstance(operateValue,long):
                            operateValue = str(operateValue)
    
                        print keyWord,locationType,locatorExpression,operateValue
    
                        expressionStr = ""
                        #构造需要执行的python语句,对应的是PageAction.py文件中的页面动作函数调用的字符串表示
                        if keyWord and operateValue and locationType is None and locatorExpression is None:
                            expressionStr = keyWord.strip() + "(u'" + operateValue + "')"
                        elif keyWord and operateValue is None and locationType is None and locatorExpression is None:
                            expressionStr = keyWord.strip() + "()"
                        elif keyWord and operateValue is None and locationType and locatorExpression:
                            expressionStr = keyWord.strip() + "('" + locationType.strip() + "','" + \
                                            locatorExpression.replace("'",'"').strip() + "',u'" + operateValue + "')"
                        elif keyWord and operateValue is None and locationType and locatorExpression:
                            expressionStr = keyWord.strip() + "('" + locationType.strip() + "','" + \
                                            locatorExpression.replace("'",'"').strip() + "')"
                        print expressionStr
    
                        try:
                            #通过eval函数,将拼接的页面动作函数调用的字符串表示,当成有效的python表达式执行,从而执行测试步骤sheet中
                            #关键字在PageAction.py文件中对应的映射方法赤完成对页面元素的操作
                            eval(expressionStr)
                            #在测试执行时间列中写入时间
                            excelObj.writeCellCurrentTime(stepSheet,rowNo = step,colNo = testStep_runTime)
                        except Exception,e:
                            #截取异常屏幕图片
                            capturePic = capture_screen()
                            #获取详细的异常堆栈信息
                            errorInfo = traceback.format_exc()
                            #在测试步骤sheet中写入失败信息
                            writeTestResult(stepSheet,step,"caseStep","failed",errorInfo,capturePic)
                            logging.error(u"步骤“%s”执行失败,错误信息:%s" % (stepRow[testStep_testStepDescribe - 1].value,errorInfo))
                        else:
                            #在测试步骤sheet中写入成功信息
                            writeTestResult(stepSheet,step,"caseStep","pass")
                            #每成功一步,successfulSteps变量自增
                            successfulSteps += 1
                            logging.info(u"步骤“%s”执行通过。" % stepRow[testStep_testStepDescribe - 1].value)
                    if successfulSteps == stepNum - 1:
                        #当测试用例步骤sheet中所有的步骤都执行成功,方认为此测试用例执行通过,然后将成功信息写入测试用例工作表中,否则写入失败信息
                        writeTestResult(caseSheet,idx + 2,"testCase","pass")
                        successfulCase += 1
                    else:
                        writeTestResult(caseSheet,idx + 2,"testCase","Failed")
            logging.info(u"共%d条用例,%d条需要执行,本次执行通过%d条。" % (len(isExecuteColumn)-1,requiredCase,successfulCase))
        except Exception,e:
            #打印详细的异常堆栈信息
            print traceback.print_exc()

    在框架目录创建RunTest.py,执行测试脚本:

    #encoding=utf-8
    from testScripts.TestSendMailWithAttachment import TestSendMailWithAttachment
    
    if __name__ == "__main__":
        TestSendMailWithAttachment()

    总结:

    完整框架是参考别人的代码写的,最后虽然可以执行成功,但测试结果未成功写入Excel,以后再进行优化

    转载于:https://www.cnblogs.com/test-chen/p/11222872.html

    展开全文
  • 关键字驱动测试框架案例框架分析:1.使用外部测试数据文件,使用Excel管理测试用例的集合和每个测试用例的所有测试步骤,实现一个文件中完成测试用例的维护2.每个测试用例的测试结果在一个文件中查看和统计3.通过...

    关键字驱动测试框架案例

    框架分析:

    1.使用外部测试数据文件,使用Excel管理测试用例的集合和每个测试用例的所有测试步骤

    ,实现一个文件中完成测试用例的维护

    2.每个测试用例的测试结果在一个文件中查看和统计

    3.通过定义关键字,操作元素的定位方式及定位表达式和操作值就可以实现每个测试用例步

    骤的执行,可以更加灵活地实现自动化测试的需求

    4.实现定位表达式和测试代码的分离,实现定位表达式直接在测试数据文件中进行维护。

    5.框架提供日志功能,方便调试和监控自动化测试程序的执行

    6.基于关键字测试框架,即使不懂开发技术的测试人员也可以实施自动化测试,便于在整个

    测试团队中推广和使用自动化测试技术,降低自动化测试实施的技术门槛

    7.基于关键字的方式,可以进行任意关键字的扩展,以满足更加复杂项目的自动化测试需求

    运行框架:

    .确保您的本地环境已配置chrome/firefox/ie浏览器及对应版本驱动

    .cd D:\KeyWordDriverTestFrameWork

    .python RunTest.py

    说明:

    .本项目完全是为了学习使用,项目中的账户和密码我并没有删除,希望您不要使用我的邮箱做有违国家安全或者对我个人有害的事情,彼此的信任是最重要的不是嘛

    .如果您有好的建议或者改进,可以fork本项目后修改你认为可以改进的代码后发起pull requests给我哦

    .如果你有不同的想法, 且你的改进对本项目有帮助, 我很愿意使用你的代码提高本项目的完整性, 对此表示感谢!

    修改说明:

    .modify by linuxchao at 2019.08.03

    .修改了整个项目代码编写规范

    .针对126邮箱升级后,修改了部分用例的逻辑,具体修改内容请查看项目原代码

    .针对126邮箱上传附件的用例, 放弃了模拟键盘和剪切板的操作部分(这个方法相对来说不稳定), 采用了最原始的send_keys方法实现

    .为了方便他人clone本项目后能够顺利的运行本项目, 我添加了环境管理文件requirements.txt,文件表明了本项目使用的所有第三方库

    当你clone本项目后, 请使用命令pip install -r requirements.txt来安装所有依赖库

    .特别说明:防止您的本地环境和本项目环境冲突,最好为本项目创建虚拟环境,使用虚拟环境的pip工具执行安装依赖库

    展开全文
  • 用TestComplete实现一个关键字驱动测试框架
                   
    用TestComplete实现一个关键字驱动测试框架
    陈能技  2008-6-27
         最近在做使用TestComplete做一个自动化测试项目的时候,发现在TestComplete中,可以利用其中的FindChild方法来实现一个简单的关键字驱动的框架,方法如下:
    (1)在Excel编写测试关键字。
    在Excel文件中编写测试关键字,包括测试对象、测试操作、输入的参数等,如图所示:
     
    (2)编写测试脚本,读入Execl中的测试关键字。
    // 全局的变量数组,用于存储从Excel读入的测试关键字
    Var KeyWord_TestObject,KeyWord_Operation,KeyWord_Parameters;
    //.............................................................................
    // 目的:通过ADO查询Excel数据
    // 输入参数:
    //           ExcelFilePath :Excel文件的路径
    //           QueryString:查询语句
    // 返回结果:
    //           返回所有关键字数据,赋值给KeyWord_TestObject,KeyWord_Operation,KeyWord_Parameters这3个全局的变量数组
    // 注意事项:
    // 作者:陈能技
    // 日期:2008-6-3
    //.............................................................................
    Function ReadKeyWordFromExcel(ExcelFilePath,QueryString);
     Var ConStr,Connection,RS,ClassObjArray,LineIndex,ClassObject:OleVariatn;
    begin
     // 定义连接串
     ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%S;Extended Properties=Excel 8.0';
     ConStr := Utilities.Format(ConStr,[ExcelFilePath]);
     Connection := Sys.OleObject('ADODB.Connection');
     // 打开连接
     Connection.Open(ConStr);
     // 执行查询操作
     RS := Connection.Execute(QueryString);
     // 创建变量数组
     KeyWord_TestObject := CreateVariantArray(0,0);
     KeyWord_Operation := CreateVariantArray(0,0);
     KeyWord_Parameters := CreateVariantArray(0,0);
     LineIndex := 0;
     // 循环读入所有数据
     While Not RS.EOF do
     begin
        Inc(LineIndex);
        // 动态修改数组大小
        VarArrayRedim(KeyWord_TestObject,LineIndex-1);
        VarArrayRedim(KeyWord_Operation,LineIndex-1);
        VarArrayRedim(KeyWord_Parameters,LineIndex-1);  
        // 赋值
        KeyWord_TestObject[LineIndex-1] := RS['TestObject'].Value;
        KeyWord_Operation[LineIndex-1] := RS['Operation'].Value;
        KeyWord_Parameters[LineIndex-1] := RS['Parameters'].Value;   
        // 下一条数据
        RS.MoveNext;
     end;
     RS.Close;
     // 关闭连接
     Connection.Close;
    end;
    Procedure Test_ReadKeyWordFromExcel;
     Var I : OleVariant;
    begin
     ReadKeyWordFromExcel('D:/Code/MyTestSuite/Data/KeyWord.xls','Select * from [KeyWord$]');
     For I := 0 to VarArrayHighBound(KeyWord_TestObject,1) do
     begin
        Log.Message(VarToStr(KeyWord_TestObject[I])+ '   | '
                   + VarToStr(KeyWord_Operation[I])+' | '
                   + VarToStr(KeyWord_Parameters[I]));
     end; 
    end;
     
    (3)封装一个函数,用于根据Excel读入的测试关键字创建可用的测试对象。
    Uses CheckUIPerformance;
    //.............................................................................
    // 目的:返回当前进程中的指定测试对象
    // 输入参数:
    //           Process :进程对象
    //           TestObject:测试对象的描述
    // 返回结果:
    //           返回当前进程中的指定测试对象
    // 注意事项:
    // 作者:陈能技
    // 日期:2008-6-3
    //.............................................................................
    Function getObject(Process,TestObject);
    var
     PropArray, ValuesArray;
    begin
     PropArray := CreateVariantArray(0, 0);
     ValuesArray := CreateVariantArray(0, 0);
     PropArray[0] :='FullName';
     ValuesArray[0] := TestObject;
     // 调用 FindTestObject 函数,返回当前进程中的指定测试对象
     Result := FindTestObject(Process,PropArray,ValuesArray);
    end;
     
    这里调用了CheckUIPerformance脚本中编写的FindTestObject函数,该函数用于根据测试对象的描述信息查找指定进程中的测试对象,脚本如下:
    Function FindTestObject(Process,PropArray,ValueArray);
     var res;
    begin
     Result := False;
     // 查找指定的测试对象
     Process.Refresh();
     res := Process.FindChild(PropArray, ValueArray, 1000);
     // 返回测试对象
     if res.Exists then
     begin
        Result := res;
        Log.Message('找到测试对象: ' + res.FullName)
     end
     else
        Log.Message('未找到测试对象');
    end;
     
    (4)封装一个函数,用于根据Excel读入的测试关键字执行测试操作。
    //.............................................................................
    // 目的:执行测试操作
    // 输入参数:
    //           TestObject :测试对象
    //           Operation:测试操作的描述
    //           Parameters:测试操作对应的参数
    // 返回结果:无
    // 注意事项:
    // 作者:陈能技
    // 日期:2008-6-3
    //.............................................................................
    Function DoOperation(TestObject,Operation,Parameters);
    begin
     case Operation of
        'Keys' : TestObject.Keys(Parameters);
        'Click' : TestObject.Click;
        // 添加其它类型的测试操作的处理代码 ...
     else
        Log.Error('不支持该测试操作!');
     end; 
    end;
     
    注:这里仅仅添加了 Keys 和 Click 的测试操作。
     
    (5)关键字驱动的核心框架
    有了前面几个函数的基础,就可以写出下面一个简单的关键字驱动的核心框架:
    //.............................................................................
    // 目的:关键字驱动的核心框架
    // 输入参数:
    // 返回结果:
    // 注意事项:
    // 作者:陈能技
    // 日期:2008-6-3
    //.............................................................................
    Procedure Driver;
     Var TestObject,I;
    begin
     // 1、读入关键字
     ReadKeyWordFromExcel('D:/Code/MyTestSuite/Data/KeyWord.xls','Select * from [KeyWord$]');
     // 2、遍历关键字,创建测试对象、执行测试操作
     For I := 0 to VarArrayHighBound(KeyWord_TestObject,1) do
     begin
    //    Log.Message(VarToStr(KeyWord_TestObject[I])+ '   | '
    //               + VarToStr(KeyWord_Operation[I])+' | '
    //               + VarToStr(KeyWord_Parameters[I]));
        // 创建测试对象
        TestObject := getObject(Sys.Process('flight4a'),VarToStr(KeyWord_TestObject[I]));
        // 执行测试操作
        DoOperation(TestObject,VarToStr(KeyWord_Operation[I]),VarToStr(KeyWord_Parameters[I]));  
     end;
    end;
     
    经试验,这种方法是可以实现类似QTP的关键字驱动测试框架,但是仅仅是一个非常基础的关键字驱动测试框架,如果想把这个框架应用在实际项目中的话,还需要进一步地修改和完善,还有很多工作要做,包括:
    (1)关键字编辑器的编写。
    目前采用直接在Excel文件中填写测试关键字的方法,存在效率和可用性问题,需要创建一个类似QTP的更加好用的关键字视图编辑器。
    (2)添加更多的测试操作和方法。
    目前作为试验,仅仅添加了 Keys 和 Click 的测试操作,还有很多控件的很多测试方法需要封装,例如List控件的ClickItem、SelectItem等,另外,对测试对象的属性赋值操作、属性检查操作(类似于QTP的CheckPoint)等都需要进一步地编写框架代码来处理。
    (3)关键字代码与测试脚本之间的同步。
    仅仅依赖Excel的关键字数据来实现整个项目的自动化测试未免过于理想化了,QTP提供了很好的代码生成机制,关键字视图的数据与专家视图的测试脚本之间可以随时同步、切换,因此这个关键字驱动测试框架还缺少一个代码生成器,如何建立Excel数据与测试脚本之间的映射关系是下一步的主要工作之一。
     
               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • Selenium 关键字驱动测试框架之数据文件解析 摘要:在关键字驱动测试框架中,除了PO模式以及一些常规Action的封装外,一个很重要的内容就是读写EXCEL,在团队中如何让不会写代码的人也可以进行自动化测试? 我们可以...
  • 之前的七篇都是数据驱动的WEB UI自动化测试框架,现在学习并记录一下关键字驱动测试框架。 这两者在实现技术上可能没有太本质的区别,都是以selenium为核心,但在实现逻辑和思想上可能有较大的区别。 一.关键字...
  • 摘要:在关键字驱动测试框架中,除了PO模式以及一些常规Action的封装外,一个很重要的内容就是读写EXCEL,在团队中如何让不会写代码的人也可以进行自动化测试? 我们可以将自动化测试用例按一定的规格写到EXCEL中去...
  • 【附源码】关键字驱动也称为表格驱动或者操作...早期介入:可以在应用未提交测试之前,就可以建立关键字驱动测试用例对象库,从而减少后期工作。使用需求和其它相关文档进行收集信息,关键字数据表可以建立手工测试程序
  • 1、小练习:定义三个方法(加法、减法、断言),通过使用关键字驱动测试这个三个方法compute.py #encoding=utf-8 def add(a,b): print a + b return a + b def sub(a,b): print a - b return a - b...
  • 1、小练习:定义三个方法(加法、减法、断言),通过使用关键字驱动测试这个三个方法 compute.py #encoding=utf-8 def add(a,b): print a + b return a + b def sub(a,b): print a - b return a - b def ...
  • 2、练习:使用excel,使用关键字驱动,实现一个搜狗搜索4个关键字:访问某个网站、输入文字、点击搜索按钮、断言普通脚本如下:test_no_keyword.py #encoding=utf-8 from selenium import webdriver import ...
  • 关键字驱动的完整框架: 在Pycharm中创建一Python工程,其下再创建Util包,action包,config包,testScripts包,log目录,testData目录,exceptionPictures目录,具体内容如下: Util包中存放封装的常用函数: ...
  • 2、练习:使用excel,使用关键字驱动,实现一个搜狗搜索 4个关键字:访问某个网站、输入文字、点击搜索按钮、断言 普通脚本如下: test_no_keyword.py #encoding=utf-8 from selenium import webdriver import ...
  • 本篇文章我来分享一下如何采用QTP自动化测试工具来采用关键字驱动测试框架来完成一个企业系统TechExcel DevTest的回归测试。 我们的需求是: 对于回归测试,由于我们自己的DevTest系统 GUI界面是比较稳定的...
  • 关键字驱动的完整框架:在Pycharm中创建一Python工程,其下再创建Util包,action包,config包,testScripts包,log目录,testData目录,exceptionPictures目录,具体内容如下:Util包中存放封装的常用函数:...
  • 以前经常自己琢磨着写测试框架,结果在真正投入使用后总发现有很多弊端,要么是难于维护,要么是不能适合大众化,还可能发生这样那个的BUG,由于短期投入产出不成正比,最后都作罢。 自动化还是需要团队的力量,仅...
  • 做QTP的同学都知道,脚本语言的编写重复性很烦琐,本身来说这样自动化,对不会编程的同学也有点障碍~~~关键字驱动设计思想:把对象库里的对象处理后,用Winform来提取层级对象和Action操作,并保存到Access中;...
  • 主要是对框架用的的Action关键字进行管理,根据Category设置该Action隶属于Step还是Keyword,Type来设置该Action是Built-in还是User-defined。对此些事情况会有不同的处理方式:如果Category是TestObject,此Action...
  • 我们对测试报告有两种方式的存储:把测试状态填写到测试用例列表里。自动生成QTP报告,保存到框架TestReport文件夹下,并自动生成HTML文件。BTW,如果运行时Trigger了场景回复,会提取出错的详细信息并记录到测试...
  • 框架目录的说明:●ObjectRepository:DepositpublicObjectRepositotry。●TestCase:DepositTestCaseDB。●TestScript:DepositallQTPtest。●RecoverySceniao:DeposiRSfileAndcustomRSfunction。●TestConf...
  • 测试用例用Access数据库管理,通过Winform把测试用例和相关设置添加到数据库中。Case_Tree:用例树和列表的管理,以及测试结果的存储Case_Step:测试用例的步骤管理,包括几种方式:QTP步骤,Keyword,自定义的...
  • 我们在框架的左侧Project树中添加测试用例和Keyword。添加完了测试用例在右侧添加测试步骤,可以按照Step和Keyword两种方式进行添加:按照QTP的关键字开发思想进行添加按照用户自定义和built-in的Keyword进行添加...
  • 这里主要是存放一些框架相关的Global设置的相关项,如图所示: 转载于:https://www.cnblogs.com/yongfeiuall/archive/2013/03/18/4134155.html
  • 我们可以在CaseList中手动选择要运行的Case,也可以分类执行Case。可以对当前运行设置相关项。 转载于:https://www.cnblogs.com/yongfeiuall/archive/2013/03/19/4134154.html...
  • 此处的Keyword是用户自定义的,我们也可以这么认为,它是一些公用的,提取出来的Moulde,如Login==所以添加Keyword时和添加用例步骤时是一样的操作。唯一不同的是添加Keyword的时候会有参数的时候,这样我们会把参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 788
精华内容 315
关键字:

关键字驱动测试框架