def dosheets(self, excelAPP, reportFileName): Log.debug('start: ExcelColumnFixture.dosheets') self.excelAPP = excelAPP self.reportFileName = reportFileName self.summary["run date"] = time.ctime(time.time()) self.summary["run elapsed time"] = RunTime() sheets = self.excelAPP.getShNameList() self.reportNameList = [] try: if not os.path.exists(REPORTPATH): os.mkdir(REPORTPATH) if not os.path.exists(FAILREPORTPATH): os.mkdir(FAILREPORTPATH) except: Log.error("create report fail") for sheetName in sheets: self.counts = Counts() if sheetName.lower().find("test") == -1: continue self.resetReportFileName(reportFileName, sheetName) self.reportNameList.append(self.reportFileName) #self.reportNameList.append(self.failReportFileName) print 'start test: ', sheetName try: self.doSheet(excelAPP, sheetName) except KeyboardInterrupt: sys.exit(0) self.makeSummaryReport() Log.debug('end: ExcelColumnFixture.dosheets')
def savePreResultInfo(self, resp): Log.debug('start savePreResultInfo: ' + self._CLASSNAME) try: Log.debug('start savePreResultInfo: ' + resp) respDict = strToDict(resp) Log.debug('respDict: ', respDict) Log.debug('needSavePreResults: ', self.needSavePreResults) if respDict and self.needSavePreResults.find('{') > -1: needSavePreResultDict = strToDict(self.needSavePreResults) if needSavePreResultDict: Log.debug('needSavePreResultDict: ', needSavePreResultDict) for key in needSavePreResultDict: self.getValueFromResp(key, needSavePreResultDict[key], respDict) else: print 'json或dictionary is error' + self.needSavePreResults#忽略 else: needSavePreResultList = self.needSavePreResults.split(';') for savePreResult in needSavePreResultList: [key, value] = savePreResult.split('=') # if respDict: # self.getValueFromResp(key, value, respDict) # else: self.getValueFromResp(key, value, resp) except BaseException, e: Log.error(e)
def getCookie(self, respInfo): cookie = '' try: if respInfo and 'Set-Cookie' in respInfo: cookie = respInfo['Set-Cookie'] except BaseException, e: Log.error("get cookie value error", e)
def savePreResultInfo(self, resp): Log.debug('start savePreResultInfo: ' + self._CLASSNAME) try: Log.debug('start savePreResultInfo: ' + resp) respDict = strToDict(resp) Log.debug('respDict: ', respDict) Log.debug('needSavePreResults: ', self.needSavePreResults) if respDict and self.needSavePreResults.find('{') > -1: needSavePreResultDict = strToDict(self.needSavePreResults) if needSavePreResultDict: Log.debug('needSavePreResultDict: ', needSavePreResultDict) for key in needSavePreResultDict: self.getValueFromResp(key, needSavePreResultDict[key], respDict) else: print 'json或dictionary is error' + self.needSavePreResults #忽略 else: needSavePreResultList = self.needSavePreResults.split(';') for savePreResult in needSavePreResultList: [key, value] = savePreResult.split('=') # if respDict: # self.getValueFromResp(key, value, respDict) # else: self.getValueFromResp(key, value, resp) except BaseException, e: Log.error(e)
def dorequest(self, url, args=None, \ content_type=None, \ methodname='POST'): response = None Log.debug('url:', url) Log.debug('args:', args) self.setHeader() if methodname.upper() == 'POST': response = self.httppost(url, args, content_type) elif methodname.upper() == 'GET': response = self.get(url, args, content_type) elif methodname.upper() == 'UPLOAD': if os.path.exists(args): response = self.uploadfile(url, args, content_type) else: Log.error('filepath is not exists: ', args) response = 'filepath is not exists:' else: print 'does not implement!' # try: # cookie = self.getCookie(response.info()) # self.setCookie(cookie) # except: # pass return response
def con2mysql(self): try: self.conn = MySQLdb.connect(self.host, self.user, self.passwd, self.database, self.port, charset='utf8') self.cur = self.conn.cursor() except MySQLdb.Error,e: print "Mysql connect failed! Error %d: %s" % (e.args[0], e.args[1]) Log.error("Mysql Error %d: %s" % (e.args[0], e.args[1]))
def getCookie(self, info): cookie = '' try: if info and 'Set-Cookie' in info: cookie = info['Set-Cookie'] except BaseException, e: Log.error("get cookie value error", e)
def strToDict(data): result = {} try: if data: result = eval(data) except BaseException, e: Log.error("strToDict exception, ", e) Log.error("data is, ", data)
def query(self, sql): results = None try: if self.cur.execute(sql): results = self.cur.fetchall() except: Log.error("query fail!") return results
def close(self): try: self.cur.close() self.conn.close() print "close db success!" except: Log.error("close fail!") print 'close db fail!'
def getValueFromRespByPattern(self, pattern, resp): result = '' temp = re.findall(pattern, resp, re.IGNORECASE) if temp: #获取匹配的第一个元组 try: result = temp[0].split(":")[-1]# except BaseException, e: Log.error('getValueFromRespByPattern: ', e)
def execute(self, sql): result = False try: result = self.cur.execute(sql) Log.debug("execute sql statement!", sql) print "execute sql success" result = True except Exception, e: print "Execute Fail!" Log.error("execute sql fail!", e)
def getDynamicParamVlaue(self, paramvalue, fromWhDict): pattern = '%\\w+%' #动态参数 result = paramvalue try: valueList = re.findall(pattern, paramvalue, re.IGNORECASE) if len(valueList) > 0: keyvalue = valueList[0][1:-1] #去掉%% result = self.getValueFromRespByDict(keyvalue, fromWhDict) print keyvalue, result except BaseException, e: Log.error('getDynamicParamVlaue error:', e)
def getFixture(self, fixturePath): fixture = None temp = fixturePath.split('.') _CLASSNAME = temp[-1] if len(temp) == 1: fixturePath = 'fixture.' + _CLASSNAME try: exec 'import ' + fixturePath exec 'fixture = ' + fixturePath + '.' + _CLASSNAME + '()' except BaseException, e: Log.error('getFixture error:', e)
def con2mysql(self): try: self.conn = MySQLdb.connect(self.host, self.user, self.passwd, self.database, self.port, charset='utf8') self.cur = self.conn.cursor() except MySQLdb.Error, e: print "Mysql connect failed! Error %d: %s" % (e.args[0], e.args[1]) Log.error("Mysql Error %d: %s" % (e.args[0], e.args[1]))
def runSetupFixture(self): if self.setupFixture: fixturePath = self.setupFixture[0] fixtureParams = self.setupFixture[1] _CLASSNAME = fixturePath.split('.')[-1] try: exec 'import ' + _CLASSNAME exec 'fixture = ' + fixturePath + '.' + _CLASSNAME + '()' self.initBeforeTest = fixture.run(fixtureParams) except BaseException, e: Log.error(e) print e
def genHtmlfile(self, repstr, filename): Log.debug('start genHtmlfile: ' + self._CLASSNAME) try: try: outputReport = open(filename, 'w') outputReport.write(repstr) outputReport.flush() outputReport.close() except IOError, e: Log.error(e) finally: outputReport.close() Log.debug('end genHtmlfile: ' + self._CLASSNAME)
def saveRespDataToFile(self, respData): fileName = str(self.testCaseId + 'json.txt') path = LOGFIELPATH + self.curShName if not os.path.exists(LOGFIELPATH): os.mkdir(LOGFIELPATH) try: if not os.path.exists(path): os.mkdir(path) fileObject = open(path + os.sep + fileName, 'w') fileObject.write(respData) fileObject.close() except BaseException, e: Log.error("create jsontxt fail!", e)
def getFixture(self): result = {} if hasattr(self, 'fixturename'): fixturepath = self.fixturename fixturepath = fixturepath.strip() fixturename = fixturepath.split('.')[-1] try: exec 'import ' + fixturepath # test class method exec 'execfixture = ' + fixturepath + '.' + fixturename + '()' result = execfixture.run() except BaseException, e: Log.error(e)
def runSetupFixture(self): if self.setupFixture: fixturePath = self.setupFixture[0] fixtureParams = self.setupFixture[1] returnparam = self.setupFixture[2] temp = fixturePath.split('.') clas = temp[-1] if len(temp) == 1: fixturePath = 'fixture.' + clas try: exec 'import ' + fixturePath exec 'fixture = ' + fixturePath + '.' + clas + '()' self.initBeforeTest = fixture.run(fixtureParams, returnparam) except BaseException, e: Log.error('runSetupFixture ERROR:', e)
def setReqParamsByArgjson(self): self.reqargs = strToDict(self._args) if self.reqargs: #如果json中包含%varname%的变量 fromWhDict = strToDict(self.previousResp) if fromWhDict: for reqarg in self.reqargs: value = self.reqargs[reqarg] if value.find('%') > -1: self.reqargs[reqarg] = \ self.getDynamicParamVlaue(value, fromWhDict) else: print 'setReqParamsByArgjson error', self._args print 'maybe the json format is wrong!' Log.error('setReqParamsByArgjson error', self._args)
def makeRepoter(self): Log.debug('start makeRepoter: ' + self._CLASSNAME) try: try: self.outputReport = open(self.reportFileName, 'w') self.outputReport.write(self.repstr) self.outputReport.flush() self.outputReport.close() #self.reportNameList.append(self.reportFileName) except IOError, e: Log.error(e) # Log.error('reportFileName does not exists ' + self.reportFileName) finally: self.outputReport.close() Log.debug('end makeRepoter: ' + self._CLASSNAME)
def setDynamicUrlPath(self): Log.debug('start setDynamicUrlPath: ' + self.clas) pattern = '{\\w+}' dynamicPathList = re.findall(pattern, self.url, re.IGNORECASE) try: for dynamicpath in dynamicPathList: dynamicpathVar = dynamicpath[1:-1] #去掉{} if dynamicpathVar in self.args: self.url = self.url.replace(dynamicpath, self.args[dynamicpathVar]) self.args.pop(dynamicpathVar) else: Log.error('setDynamicUrlPath fail, args has not ' + dynamicpathVar) except Exception, e: Log.error(e)
class HttpApiFixture(ExcelColumnFixture): """ process http api 1.read excel file, process header of http request. 2.e.g. url = interface + function.. """ _CLASSNAME = 'apifixture.HttpApiFixture' note = '' comments = ['note', 'Note', 'comment', 'Comment'] interface = '' # http url, like http://www.xxx.com:8080/path function = '' #path argCounts = 0 # initSetupFixture = [] #在测试运行前需要执行的测试构建的【构建名,构建参数】 preResultInfo = {} #前一次请求response的需要保存的结果信息 client = HttpClientUtil() #客户端请求 previousResp = None #前一次请求的response link = '' userdefinefixtureresult = None #测试执行过程中测试构建执行的测试结果信息 reqargs = {} #http请求参数 initInfoBeforeTest = {} def runTest(self, cell, a): Log.debug('start runTest: ' + self._CLASSNAME) try: if not self.expected: self.expected = a.parse(cell.text) except BaseException, e: Log.debug("testcaseid " + str(self.testCaseId)) Log.debug(e) self.expected = '' try: actualresult = a.get() #调用测试构建定义的方法 try: #self.needSavePreResults用于保存上次请求response需要保存的测试字段值,不同字段用“,”分割;可用正则或完成字段名, if hasattr(self, 'needSavePreResults') and self.needSavePreResults: self.preResultInfo = {} #clear上次保存的信息 self.savePreResultInfo(actualresult) Log.debug('preResultInfo', self.preResultInfo) except BaseException, e: Log.error('invoke savePreResultInfo error', e) if self.expected and actualresult: bresult, message = ResultCheck.checkResult(actualresult, self.expected) else: if actualresult and actualresult.find('error') < 0: bresult = 1 message = "expect result column is null, only output!\n" else: bresult = 0 message = "expect result column is null, maybe error!\n the url:%s \n" % self.url if bresult > 0: self.right(cell, message) elif bresult == 0: self.wrong(cell, message) else: self.output(cell, message) try: cell.text = cell.text + self.link except: cell.text = self.link
def setDynamicUrlPath(self, fromparams={}): Log.debug('start setDynamicUrlPath: ' + self._CLASSNAME) pattern = '{\\w+}' if not fromparams: fromparams = self.reqargs dynamicPathList = re.findall(pattern, self.url, re.IGNORECASE) try: for dynamicpath in dynamicPathList: dynamicpathVar = dynamicpath[1:-1] #去掉{} print fromparams if dynamicpathVar in fromparams: self.url = self.url.replace(dynamicpath, fromparams[dynamicpathVar]) else: Log.error('setDynamicUrlPath fail, reqargs has not ' + dynamicpathVar) except Exception, e: Log.error(e)
def test(self): Log.debug('start test: ' + self._CLASSNAME) self.clearBeforeTest() self.befortest() self.setReqParams() self.fixtureExecResult = self.execFixture() #self.addPreResultToParams() #从上次请求产生的response中取得需要保存的参数信息,并保存到本次请求的参数列表中 try: Log.debug('testCaseId:', self.testCaseId) self.setRequestMethod() #若果请求的路径信息中含有动态变量,则从参数列表中读取 self.setDynamicUrlPath(self.reqargs) reqargs = self.fileUpload() #如果参数中包含filepath,则为文件上传 respData = self.doRequest(self.url, reqargs, self.requestMethod) self.saveRespDataToFile(respData) self.genResultLink(respData) except BaseException, e: Log.error( e )
def defineVarAndTypeDict(self, heads): codestr = '' len1 = len(heads) sufix = "()" self._typeDict.clear() try: for i in range(len1): varname = heads[i] if varname[-len(sufix):] == sufix: varname = varname[:-len(sufix)] else: # setattr(self, varname, '') codestr = codestr + 'ExcelColumnFixture.' \ + varname + '="" \n' self._typeDict[varname] = 'str' # add varname into type diction exec codestr except BaseException, err: Log.error(err) Log.debug(ExcelColumnFixture.__dict__)
def makeSummaryReport(self): Log.debug('start makeSummaryReport: ' + self._CLASSNAME) if hasattr(self, 'reportNameList') and len(self.reportNameList) > 1: if not os.path.exists(self._DEFAULTREPORTER): os.mkdir(self._DEFAULTREPORTER) self.summaryReport = open(self.summaryReportName, 'w') self.repstr = self.getReportHeader('summary report') self.repstr += self.getReportTableHeader() columnNames = ['filepath', 'summary result', 'detail reporter url'] self.repstr += self.getReportTableColumnName(columnNames) for reportName in self.reportNameList: try: reportfilename = reportName.split(os.sep)[-1] counts = self.summaryCounts[reportfilename] except BaseException, e: Log.error(e) counts = 'ERROR:NO DATA' countcell = Cell(counts) if (hasattr(counts, 'wrong') and counts.wrong == 0): #green countcell.addToTag(" bgcolor=\"#cfffcf\"") else: countcell.addToTag(" bgcolor=\"#ffcfcf\"") #name = reportName.split(os.sep)[-1] linkcell = Cell('<a href=%s>link to html</a>' % reportfilename) # try: # filename = reportfilename[:-12] # except: # filename = 'filename' namecell = Cell(reportName) namecell.addToTag("align='left'") rowdata = namecell.__str__() \ + countcell.__str__() \ + linkcell.__str__() # if self.ismonitorcpu: # self.cpuChart = Cell('<a href=..\\%s>open cpu chart</a>' \ # %self.cpuRatioChartMap[reportName]) self.repstr += self.getReportTableRow(rowdata) self.repstr += self.getReportTail() self.summaryReport.write(self.repstr) self.summaryReport.flush() self.summaryReport.close() print 'make summary report ok'
def defineVarAndTypeDict(self, heads): codestr = '' len1 = len(heads) sufix = "()" self._typeDict.clear() try: for i in range(len1): varname = heads[i] if varname[-len(sufix):] == sufix: varname = varname[:-len(sufix)] else: # setattr(self, varname, '') codestr = codestr + 'ExcelColumnFixture.' \ + varname + '="" \n' self._typeDict[ varname] = 'str' # add varname into type diction exec codestr except BaseException, err: Log.error(err) Log.debug(ExcelColumnFixture.__dict__)
def getToken(self, respdata, returnparam): tokenvalue = '' try: jsonResult = strToDict(respdata) if not returnparam: if jsonResult and 'data' in jsonResult: data = jsonResult["data"] tokenvalue = data["token"] else: tokenvalue = re.findall(returnparam, respdata, re.IGNORECASE)[0] tokenvalue = tokenvalue.split(":")[-1] else: if returnparam in jsonResult: tokenvalue = jsonResult[returnparam] else: #re.findall tokenvalue = re.findall(returnparam, respdata, re.IGNORECASE)[0] tokenvalue = tokenvalue.split(":")[-1] except BaseException, e: Log.error("get token value error", e)
def test(self): Log.debug('start test: ' + self._CLASSNAME) self.clearBeforeTest() self.befortest() self.setUrl() self.setReqParams() self.fixtureExecResult = self.execFixture() self.addPreResultToParams( ) #从上次请求产生的response中取得需要保存的参数信息,并保存到本次请求的参数列表中 try: Log.debug('testCaseId:', self.testCaseId) self.setRequestMethod() #若果请求的路径信息中含有动态变量,则从参数列表中读取 self.setDynamicUrlPath() #若果是上传文件,先调用fielupload,后做doRequest() reqargs = self.fileUpload() respData = self.doRequest(self.url, reqargs, self.requestMethod) self.saveRespDataToFile(respData) self.genResultLink(respData) except BaseException, e: Log.error(e)
#开始HTTP请求 resp = self.client.dorequest(self.url, self.args, \ methodname=self.requestMethod) if isinstance(resp, str): respData = resp else: respData = resp.read() Log.debugvar('respData is ', respData) except HTTPError, e: respData = '{"error":"' + str(e) + '"}' except Exception, e: respData = '{"error":"' + str(e) + '"}' self.saveRespDataToFile(respData) self.genResultLink(respData) except BaseException, e: Log.error(e) Log.debug('end test: ' + self.clas) return respData def runTest(self, cell, a): Log.debug('start runTest: ' + self.clas) try: if not self.expected: self.expected = a.parse(cell.text) except BaseException, e: Log.debug("testcaseid " + str(self.testCaseId)) Log.debug(e) self.expected = '' try: actualresult = a.get() try: