def searchApp(): driver = webdriver.Remote('http://localhost:4723/wd/hub', getDesiredcaps()) try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) searchSheet = excelObj.getSheetByName("搜索") isExecute = excelObj.getColumn(searchSheet, search_isExecute) searchKeyWordCols = excelObj.getColumn(searchSheet, search_searchKeyWord) for idx, i in enumerate(isExecute[1:]): searchKeyWord = searchKeyWordCols[idx + 1].value logger.info("----------搜索APP“{}”开始执行".format(searchKeyWord)) if i.value == 'y': searchRow = excelObj.getRow(searchSheet, idx + 2) assertKeyWord = searchRow[search_assertKeyWord - 1].value try: SearchAction.search(driver, searchKeyWord, assertKeyWord) except Exception as e: excelObj.writeCellCurrentTime(searchSheet, rowNo=idx + 2, colsNo=search_runTime, style="red") excelObj.writeCell(searchSheet, "Faild", rowNo=idx + 2, colsNo=search_testResult, style="red") logger.error("搜索APP“{}”失败\n异常信息:{}".format( searchKeyWord, traceback.format_exc())) else: excelObj.writeCellCurrentTime(searchSheet, rowNo=idx + 2, colsNo=search_runTime, style="green") excelObj.writeCell(searchSheet, "Pass", rowNo=idx + 2, colsNo=search_testResult, style="green") logger.info("搜索APP“{}”成功".format(searchKeyWord)) else: excelObj.writeCell( searchSheet, "", rowNo=idx + 2, colsNo=search_runTime, ) excelObj.writeCell(searchSheet, "", rowNo=idx + 2, colsNo=search_testResult) logger.info("搜索APP“{}”的用例被忽略执行".format(searchKeyWord)) except Exception as e: logger.error("数据驱动框架主程序发生异常\n异常信息:{}" % (traceback.format_exc())) finally: driver.quit()
def appRankAndSearchApp(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) caseSheet = excelObj.getSheetByName("测试用例") caseNum = excelObj.getRowsNumber(caseSheet) isExecuteCaseCols = excelObj.getColumn(caseSheet, testCase_isExecute) # 记录需要执行的用例个数 requiredCaseNum = 0 # 记录执行成功的用例个数 successfulCaseNum = 0 for idx, i in enumerate(isExecuteCaseCols[1:]): caseName = excelObj.getCellOfValue(caseSheet, rowNo=idx + 2, colsNo=testCase_testCaseName) logger.info("----------" + caseName) # 测试用例sheet中第一行为标题,无须执行 if i.value == "y": requiredCaseNum += 1 caseRow = excelObj.getRow(caseSheet, idx + 2) frameworkName = caseRow[testCase_frameworkName - 1].value stepSheetName = caseRow[testCase_testStepSheetName - 1].value if frameworkName == "关键字": logger.info("**********调用关键字驱动**********") # 根据用例的sheet名获取用例的sheet对象 stepSheet = excelObj.getSheetByName(stepSheetName) # 记录用例步骤的个数 stepNum = excelObj.getRowsNumber(stepSheet) # 记录用例步骤执行成功的个数 successfulStepNum = 0 for j in range(2, stepNum + 1): # 用例步骤中的第一行为标题,无须执行 stepRow = excelObj.getRow(stepSheet, j) # 获取用例步骤中描述 StepDescription = stepRow[caseStep_caseStepDescription - 1].value # 获取函数名 keyWord = stepRow[caseStep_keyWord - 1].value print("keyWord = ", keyWord) # 获取操作元素的定位方式 locationType = stepRow[caseStep_locationType - 1].value # 获取操作元素定位方式的表达式 locatorExpression = stepRow[caseStep_locatorExpression - 1].value # 获取函数中的参数 operatorValue = stepRow[caseStep_operatorValue - 1].value # 数值类数据从excel取出后为long型数据,转换为字符串,方便拼接 if isinstance(operatorValue, int): operatorValue = str(operatorValue) if keyWord and locationType and locatorExpression and operatorValue: step = keyWord + "('%s','%s','%s')" % ( locationType, locatorExpression, operatorValue) elif keyWord and locationType and locatorExpression: step = keyWord + "('%s','%s')" % ( locationType, locatorExpression) elif keyWord and operatorValue: step = keyWord + "('%s')" % operatorValue elif keyWord: step = keyWord + "()" try: # 用例步骤执行执行成功,写入执行结果和日志 print(step) eval(step) successfulStepNum += 1 writeResult(excelObj, stepSheet, "Pass", j, "caseStep") logger.info("执行步骤“%s”成功" % StepDescription) except Exception as err: #用例步骤执行执行成功 errPicPath = capture_screen() errMsg = traceback.format_exc() writeResult(excelObj, stepSheet, "Faild", j, "caseStep", errMsg=errMsg, errPicPath=errPicPath) logger.error( "执行步骤“%s”失败\n异常信息:%s" % (StepDescription, str(traceback.format_exc()))) if successfulStepNum == stepNum - 1: successfulCaseNum += 1 writeResult(excelObj, caseSheet, "Pass", idx + 2, "testCase") logger.info("用例“%s”执行成功" % caseName) else: writeResult(excelObj, caseSheet, "Faild", idx + 2, "testCase") logger.info("用例“%s”执行失败" % caseName) elif frameworkName == "数据": logger.info("**********调用数据驱动**********") dataSourceSheetName = caseRow[testCase_dataSourceSheetName - 1].value # print dataSourceSheetName,stepSheetName stepSheet = excelObj.getSheetByName(stepSheetName) dataSheet = excelObj.getSheetByName(dataSourceSheetName) result = searchApp(excelObj, stepSheet, dataSheet) if result: successfulCaseNum += 1 writeResult(excelObj, caseSheet, "Pass", idx + 2, "testCase") logger.info("用例“%s”执行成功" % caseName) else: writeResult(excelObj, caseSheet, "Faild", idx + 2, "testCase") logger.info("用例“%s”执行失败" % caseName) else: # 清空不需要执行用例的执行时间和执行结果, writeResult(excelObj, caseSheet, "", idx + 2, "testCase") logger.info("用例“%s”被设置为忽略执行" % caseName) logger.info("共%s条用例,%s条需要被执行,本次执行通过%s条" % (caseNum - 1, requiredCaseNum, successfulCaseNum)) except Exception as err: logger.error("驱动框架主程序发生异常\n异常信息:%s" % str(traceback.format_exc()))
def createContacts(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) userSheet = excelObj.getSheetByName("126账号") isExecute = excelObj.getColumn(userSheet, account_isExecute) userNameCols = excelObj.getColumn(userSheet, account_userName) for idx, i in enumerate(isExecute[1:]): if i.value == 'y': userRow = excelObj.getRow(userSheet, idx + 2) userName = userRow[account_userName - 1].value passWord = str(userRow[account_passWord - 1].value) contactSheetName = userRow[account_dataSourceSheetName - 1].value driver = webdriver.Chrome() driver.maximize_window() driver.get("https://mail.126.com/") LoginAction.login(driver, userName, passWord) #断言前停顿3秒,防止页面跳转太快,断言失败 time.sleep(3) try: assert "收 信" in driver.page_source except Exception as e: logger.error("用户“{}”登录后,断言页面关键字“退出”失败\n异常信息:{}".format( userName, traceback.format_exc())) else: logger.info("用户“{}”登录后,断言页面关键字“退出”成功".format(userName)) contactSheet = excelObj.getSheetByName(contactSheetName) isExecuteAddContact = excelObj.getColumn( contactSheet, contacts_isExecute) contactNum = 0 successAddContactNum = 0 coutactPersonNameCols = excelObj.getColumn( contactSheet, contacts_contactPersonName) for id, j in enumerate(isExecuteAddContact[1:]): if j.value == 'y': contactNum += 1 contactRow = excelObj.getRow(contactSheet, id + 2) coutactPersonName = coutactPersonNameCols[id + 1].value coutactPersonEmail = contactRow[ contacts_contactPersonEmail - 1].value isStar = contactRow[contacts_isStar - 1].value countactPersonPhone = str( contactRow[contacts_contactPersonPhone - 1].value) countactPersonComment = contactRow[ contacts_contactPersonComment - 1].value assertKeyWords = contactRow[contacts_assertKeyWords - 1].value logger.info("**********开始添加联系人“%s”**********" % coutactPersonName) AddContactAction.addContact(driver, coutactPersonName, coutactPersonEmail, isStar, countactPersonPhone, countactPersonComment) time.sleep(3) try: assert assertKeyWords in driver.page_source except Exception as e: excelObj.writeCell(contactSheet, "faild", rowNo=id + 2, colsNo=contacts_testResult, style="red") excelObj.writeCellCurrentTime( contactSheet, rowNo=id + 2, colsNo=contacts_runTime, style="red") logger.error("添加联系人“{}”失败\n异常信息:{}".format( coutactPersonName, traceback.format_exc())) else: successAddContactNum += 1 excelObj.writeCell(contactSheet, "pass", rowNo=id + 2, colsNo=contacts_testResult, style="green") excelObj.writeCellCurrentTime( contactSheet, rowNo=id + 2, colsNo=contacts_runTime, style="green") logger.info( "添加联系人“{}”成功".format(coutactPersonName)) else: excelObj.writeCell(contactSheet, "", rowNo=id + 2, colsNo=contacts_runTime) excelObj.writeCell(contactSheet, "", rowNo=id + 2, colsNo=contacts_testResult) logger.info("联系人“{}”被忽略执行".format( coutactPersonNameCols[idx + 1].value)) driver.quit() if contactNum == successAddContactNum: excelObj.writeCell(userSheet, "Pass", rowNo=idx + 2, colsNo=account_testResult, style="green") else: excelObj.writeCell(userSheet, "Faild", rowNo=idx + 2, colsNo=account_testResult, style="red") else: excelObj.writeCell(userSheet, "", rowNo=idx + 2, colsNo=account_testResult) logger.info("账号“{}”被忽略执行".format(userNameCols[idx + 1].value)) except Exception as e: logger.error("数据驱动框架主程序发生异常\n异常信息:{}".format(traceback.format_exc()))
def appstore(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) caseSheet = excelObj.getSheetByName("测试用例") caseNameCols = excelObj.getColumn(caseSheet, testCase_testCaseName) isExecuteCaseCols = excelObj.getColumn(caseSheet, testCase_isExecute) # 记录需要执行的用例个数 requiredCaseNum = 0 # 记录执行成功的用例个数 successfulCaseNum = 0 for idx, i in enumerate(isExecuteCaseCols[1:]): # 测试用例sheet中第一行为标题,无须执行 if i.value == "y": requiredCaseNum += 1 caseRow = excelObj.getRow(caseSheet, idx + 2) caseName = caseNameCols[idx + 1].value stepSheetName = caseRow[testCase_testStepSheetName - 1].value # 根据用例的sheet名获取用例的sheet对象 stepSheet = excelObj.getSheetByName(stepSheetName) # 记录用例步骤的个数 stepNum = excelObj.getRowsNumber(stepSheet) # 记录用例步骤执行成功的个数 successfulStepNum = 0 logger.info("----------" + caseName) for j in range(2, stepNum + 1): # 用例步骤中的第一行为标题,无须执行 stepRow = excelObj.getRow(stepSheet, j) # 获取用例步骤中描述 StepDescription = stepRow[caseStep_caseStepDescription - 1].value # 获取函数名 keyWord = stepRow[caseStep_keyWord - 1].value # 获取操作元素的定位方式 locationType = stepRow[caseStep_locationType - 1].value # 获取操作元素定位方式的表达式 locatorExpression = stepRow[caseStep_locatorExpression - 1].value # 获取函数中的参数 operatorValue = stepRow[caseStep_operatorValue - 1].value # 数值类数据从excel取出后为int型数据,转换为字符串,方便拼接 if isinstance(operatorValue, int): operatorValue = str(operatorValue) if keyWord and locationType and locatorExpression and operatorValue: step = keyWord + "('{}','{}','{}')".format( locationType, locatorExpression, operatorValue) elif keyWord and locationType and locatorExpression: step = keyWord + "('{}','{}')".format( locationType, locatorExpression) elif keyWord and operatorValue: step = keyWord + "('{}')".format(operatorValue) else: step = keyWord + "()" try: # 用例步骤执行执行成功,写入执行结果和日志 eval(step) successfulStepNum += 1 writeResult(excelObj, stepSheet, "Pass", j, "caseStep") logger.info("执行步骤“{}”成功".format(StepDescription)) except Exception as e: # 用例步骤执行执行成功 errPicPath = capture_screen() errMsg = traceback.format_exc() writeResult(excelObj, stepSheet, "Faild", j, "caseStep", errMsg=errMsg, errPicPath=errPicPath) logger.error("执行步骤“{}”失败\n异常信息:{}".format( StepDescription, traceback.format_exc())) if successfulStepNum == stepNum - 1: successfulCaseNum += 1 writeResult(excelObj, caseSheet, "Pass", idx + 2, "testCase") else: writeResult(excelObj, caseSheet, "Faild", idx + 2, "testCase") else: writeResult(excelObj, caseSheet, "", idx + 2, "testCase") logger.info("用例“{}”被设置为忽略执行".format(caseNameCols[idx + 1].value)) logger.error("共{}条用例,{}条需要被执行,本次执行通过{}条".format( len(isExecuteCaseCols) - 1, requiredCaseNum, successfulCaseNum)) except Exception as e: logger.info("关键字驱动框架主程序发生异常\n异常信息:{}".format(traceback.format_exc()))
def sendRequest(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) apiSheet = excelObj.getSheetByName(ApiSheetName) apiNameCols = excelObj.getColumn(apiSheet, API_name) apiIsExecuteCols = excelObj.getColumn(apiSheet, API_isExecute) for idx, i in enumerate(apiIsExecuteCols[1:]): apiName = apiNameCols[idx + 1].value if i.value == "y": case_total = 0 case_passNum = 0 case_ignoreNum = 0 case_failNum = 0 case_errorNum = 0 apiRow = excelObj.getRow(apiSheet, idx + 2) requestUrl = apiRow[API_requestUrl - 1].value requestMothod = apiRow[API_requestMothod - 1].value paramsType = apiRow[API_paramsType - 1].value testCaseSheetName = apiRow[API_testCaseSheetName - 1].value logger.info("----------" + apiName) testCaseSheet = excelObj.getSheetByName(testCaseSheetName) testCaseIsExecuteCols = excelObj.getColumn(testCaseSheet, TestCase_isExecute) for id, j in enumerate(testCaseIsExecuteCols[1:]): case_total += 1 try: if j.value == "y": testCaseRow = excelObj.getRow(testCaseSheet, id + 2) requestHeaders = testCaseRow[TestCase_requestHeaders - 1].value headersEncrypt = testCaseRow[TestCase_headersEncrypt - 1].value requestData = testCaseRow[TestCase_requestData - 1].value dependData = testCaseRow[TestCase_dependData - 1].value bodyEncrypt = testCaseRow[TestCase_bodyEncrypt - 1].value responseData = testCaseRow[TestCase_responseData - 1].value responseDecrypt = testCaseRow[TestCase_responseDecrypt - 1].value dependDataStore = testCaseRow[TestCase_dependDataStore - 1].value checkPoint = testCaseRow[TestCase_checkPoint - 1].value # 当请求参数中不是数值时,处理成字典 if not isinstance(requestData, int): requestData = eval(requestData) # 处理请求参数中的依赖数据 if requestData and dependData: requestData = getDependData(requestData, eval(dependData)) # 处理请求参数中的加密数据 if requestData and bodyEncrypt: requestData = bodyEncryptOper(requestData, eval(bodyEncrypt)) httpC = HttpClient() response = httpC.request(requestMothod, requestUrl, paramsType, requestData=requestData) # 接口响应结果写入用例工作表 excelObj.writeCell(testCaseSheet, response.text, rowNo=id + 2, colsNo=TestCase_responseData) # 当接口响应成功时,验证检查点是否满足 if response.status_code == 200 and checkPoint: # 获取检查点错误信息 errData = checkResult(response, eval(checkPoint)) if errData: # 接口执行失败,执行的错误结果写入到测试用例工作表 case_failNum += 1 writeResult(excelObj, testCaseSheet, "Faild", id + 2, "testcase", testCaseErrMsg=str(errData)) logger.info("接口“{}”的第“{}”条用例执行失败".format(apiName, id + 1)) else: # 接口执行成功,执行的正确结果写入到测试用例工作表 case_passNum += 1 writeResult(excelObj, testCaseSheet, "Pass", id + 2, "testcase") logger.info(u"接口“{}”的第“{}”条用例执行成功".format(apiName, id + 1)) # 当接口执行成功时,保存依赖数据到全局变量RequestData、ResponseData,供后面的接口使用 if dependDataStore: dataStore(eval(dependDataStore), testCaseSheetName, id + 2, requestSource=requestData, responseSource=response.json()) elif response.status_code != 200: # 接口响应失败,执行失败的接口写入到测试用例工作表 case_errorNum += 1 writeResult(excelObj, testCaseSheet, "Error", id + 2, "testcase", testCaseErrMsg="接口响应异常!") logger.info( "接口“{}”的第“{}”条用例执行过程出错\n错误信息:{}".format(apiName, id + 1, traceback.format_exc())) else: # 清空忽略执行的测试用例工作表数据 case_ignoreNum += 1 writeResult(excelObj, testCaseSheet, "", id + 2, "testcase") logger.info("接口“{}”的第“{}”条用例被设置为忽略执行".format(apiName, id + 1)) except Exception as e: # 接口请求中,发生异常情况,将错误结果写入测试用例工作表 case_errorNum += 1 writeResult(excelObj, testCaseSheet, "Error", id + 2, "testcase", testCaseErrMsg=traceback.format_exc()) logger.info( "接口请求发生异常情况,接口“{}”的第“{}”条用例执行过程出错\n错误信息:{}".format(apiName, id + 1, traceback.format_exc())) if case_errorNum or case_failNum: # 存在异常错误或者失败测试用例时,表示接口api执行错误,将相关的统计数据写入到接口api的工作表中 writeResult(excelObj, apiSheet, "Faild", idx + 2, "api", apiResult=[case_total, case_passNum, case_ignoreNum, case_failNum, case_errorNum]) else: writeResult(excelObj, apiSheet, "Pass", idx + 2, "api", apiResult=[case_total, case_passNum, case_ignoreNum, case_failNum, case_errorNum]) else: # 清空忽略执行api工作表的数据 writeResult(excelObj, apiSheet, "", idx + 2, "api") logger.info("接口“{}”被设置为忽略执行".format(apiName)) except Exception as e: logger.info("接口框架主程序发生异常\n异常信息:{}".format(traceback.format_exc()))
def main(): # 实现从获取接口测试数据到发送情况,再到获取返回结果,并处理结果 # 创建ParseExcel类的实例对象 parseE = ParseExcel() # 调用封装好的加载excel到内存的方法将需要解析的excel加载到内存 parseE.loadWorkBook(excelPath) # 获取“API”表的表对象 sheetObj = parseE.getSheetByName(apiExcelName) # 获取API表中是否需要执行api自动化case的列对象 activeList = parseE.getColumn(sheetObj, API_active) # 遍历是否需要执行标记列,只执行标记为yes的api自动化测试 for idx, cell in enumerate(activeList[1:], 2): if cell.value == "y": # 需要执行的api rowObj = parseE.getRow(sheetObj, idx) apiName = rowObj[API_apiName - 1].value requestUrl = rowObj[API_requestUrl - 1].value requestMethod = rowObj[API_requestMothod - 1].value paramsType = rowObj[API_paramsType - 1].value apiTestCaseSheetName = rowObj[API_apiTestCaseFileName - 1].value # 下一步就是获取api的测试case,然后准备执行用例 caseSheetObj = parseE.getSheetByName(apiTestCaseSheetName) caseActiveObj = parseE.getColumn(caseSheetObj, CASE_active) print(caseActiveObj) for c_idx, col in enumerate(caseActiveObj[1:], 2): if col.value == "y": # 说明当前case是需要被执行的 caseRowObj = parseE.getRow(caseSheetObj, c_idx) requestData = caseRowObj[CASE_requestData - 1].value relyData = caseRowObj[CASE_relyData - 1].value dataStore = caseRowObj[CASE_dataStore - 1].value checkPoint = caseRowObj[CASE_checkPoint - 1].value # 下一步,在发送接口请求之前,需要处理数据依赖 if relyData: # 需要进行数据依赖处理 requestData = GetRelyValue.get(requestData, relyData) print(requestData) else: print("第%s个API的第%s条不需要做数据依赖处理!" % ((idx - 1), (c_idx - 1))) # 没有数据依赖处理时,需要判断下是不是json数据类型 if requestData[0] == "{" and requestData[-1] == "}": # 说明请求参数是一个json串格式数据,若是,需要转成字典类型 requestData = eval(requestData) # 处理登录时的密码加密 if apiName == "login": requestData["password"] = md5_encrypt( requestData["password"]) # 处理完接口请求参数的依赖数据后,接下来就是发送请求并获取响应结果 response = HttpClient.request(requestUrl, requestMethod, paramsType, requestData) print(response.status_code) print(response.json()) # 下一步,根据接口响应结果,做数据依赖存储以及结果检测 if response.status_code == 200: # 获取接口的响应body(获取的是字典类型) responseBody = response.json() # 接下来做数据依赖存储 if dataStore: RelyDataStore.do(apiName, c_idx - 1, requestData, responseBody, eval(dataStore)) # 接下来进行接口响应结果的检测 if checkPoint: errorKey = CheckResult.check(response.json(), eval(checkPoint)) # 将测试结果写回excel write_result(parseE, caseSheetObj, response.json(), errorKey, c_idx) else: print("第%s个API的第%s条case被忽略执行!" % ((idx - 1), (c_idx - 1))) else: print("第%s个API被忽略执行!" % (idx - 1))