import re import sys, os import datetime import csv # read test results from csv file # return them to the xstudio launcher # y.m. ver 1.1 27/mar/2010 # y.m. ver 1.2 09/apr/2010 result and LOG # # def splitSmart(string, delimiter, subDelimiter): """ splits a string by 2 delimiters. input: string - the string to split delimiter - the first delimiter to split by subDelimiter - the second delimiter to split by, may be a substr of original delimiter """ a=[] for element in string.split(delimiter): b = element.split(subDelimiter) a += [ele for ele in b if ele != ''] return a def GetResultDB(theFileName): db = {} print "summary file=",theFileName try: lines = file(theFileName,'rb').read() lines = splitSmart(lines, '\r\n','\n') for elm in lines: res = elm.split(",") db[str(res[2]+"/"+res[7])] = res readFlag = True except: readFlag = False return db,readFlag def timestamp(): date = datetime.datetime.now(); return "%04d-%02d-%02d %02d:%02d:%02d" % ( date.year, date.month, date.day, date.hour, date.minute, date.second); #=============================================== def test_completed(): try: test = open(TEST_COMPLETED, 'w'); test.close(); except IOError: print( timestamp() + FAILURE_STATUS + "Can't write file %s in working directory.\n" % TEST_COMPLETED); sys.exit(NOT_EXECUTED_VAL); return; #=============================================== def prepareForCsv(theInput): tmpStr = theInput.replace(",",".") return tmpStr #================================== def ReadCsvFile(theFileName,theFormat): """ theFileName - full path name theFormat - one of ['excel-tab', 'excel'] """ try: csvDB = [] csvfile = open(theFileName,"rb") reader1 = csv.reader(csvfile,dialect=theFormat,quoting=csv.QUOTE_ALL) for elm in reader1: csvDB.append(elm[:]) except: print >> gFile, "Failed to open csv file: ",theFileName return csvDB #================================== def VerifyCSVdbColumns(theCSVdb): """ theCSVdb - database as read from cdv file """ found = False for row1 in theCSVdb: catCol = -1 folderCol = -1 testCol = -1 testCaseCol = -1 resultCol = -1 commentCol = -1 # patch for old csv files testIDCol = 0 for col1 in xrange(len(row1)): if row1[col1] == "category": catCol = col1 if row1[col1] == "folder": folderCol = col1 if row1[col1] == "test name": testCol = col1 if row1[col1] == "testcase name": testCaseCol = col1 if row1[col1] == "Result(pass/fail)": resultCol = col1 if row1[col1] == "Comment": commentCol = col1 if row1[col1] == "test ID": testIDCol = col1 if catCol != -1 and folderCol != -1 and testCol != -1 and \ testCaseCol != -1 and resultCol != -1 and commentCol != -1 and \ testIDCol != -1: found = True break if not(found): print >> gFile,"Failed to find columns" pass return catCol, folderCol, testCol, testCaseCol, resultCol, commentCol, testIDCol #================================== def ClearExtraSpaces(theName): """ theName - test/testcase name to clear from extra spaces """ v1 = theName while " " in v1: v1 = v1.replace(" "," ") v1 = v1.strip(" ") return v1 #================================== def getArgvParam(theArgv,theKey,theNotFound): """ theArgv - argv list theKey - keyword to find """ a1 = [e1.split(theKey)[1] for e1 in sys.argv if len(e1.split(theKey)) == 2] a1.append(theNotFound) return a1[0] #=============================================== FAILURE_STATUS = " [Failure] " SUCCESS_STATUS = " [Success] " LOG_STATUS = " [Log] " TEST_COMPLETED = "test_completed.txt" LOGFILE = "log.txt" FAILURE_VAL = 2 SUCCESS_VAL = 1 NOT_EXECUTED_VAL = 0 NO_RESULT_VAL = -1 NOT_FOUND_KEY = "NotFound" gFile = open(os.getcwd()+"/"+"output.txt","a+") print >> gFile, "=============================" print >> gFile, "ResultsRead Ver 1.6",timestamp() for e1 in xrange(len(sys.argv)): print >> gFile, sys.argv[e1] testResultFileName = "summary.csv" # Minimun required Xstudio parameters # debug not yet implemented DEBUG = getArgvParam(sys.argv,"/debug",NOT_FOUND_KEY) testcaseIndex = getArgvParam(sys.argv,"/testcaseIndex=",NOT_FOUND_KEY) testId = getArgvParam(sys.argv,"/testID=",NOT_FOUND_KEY) testName = prepareForCsv(getArgvParam(sys.argv,"/test=",NOT_FOUND_KEY)) testCaseName = prepareForCsv(getArgvParam(sys.argv,"/testCase=",NOT_FOUND_KEY)) testResultFileName = getArgvParam(sys.argv,"/resultFileName=",NOT_FOUND_KEY) exepath = getArgvParam(sys.argv,"/exepath=",NOT_FOUND_KEY) LOGFILE = getArgvParam(sys.argv,"/log=",LOGFILE) print >> gFile, timestamp() + \ " TCindx="+testcaseIndex+ \ " Tid="+testId+ \ " Tname="+testName+ \ " TCname="+testCaseName+ \ " ResFile="+testResultFileName+ \ " LOGFILENAME=" + LOGFILE try: file1 = open(LOGFILE, 'w') except IOError: print("Can't write file log.txt in working directory.\n" ) print >> gFile, "Can't write file log.txt in working directory.\n" # return -1 to indicate exceution failed gFile.close() sys.exit(-1) CSVdb = ReadCsvFile(exepath+"/"+testResultFileName,"excel") if len(CSVdb) == 0: file1.write(LOG_STATUS + timestamp() + " " + "Result csv file not Found: " + testResultFileName + ".\n" ) file1.close(); test_completed(); gFile.close() sys.exit(-1) catCol, folderCol, testCol, testCaseCol, resultCol, commentCol, testIDCol = VerifyCSVdbColumns(CSVdb) found = False logVal = "No Comment " result = "" for elm in CSVdb: if (ClearExtraSpaces(testName) == ClearExtraSpaces(elm[testCol])) and \ (ClearExtraSpaces(testCaseName) == ClearExtraSpaces(elm[testCaseCol])) and \ (ClearExtraSpaces(str(testId)) == ClearExtraSpaces(str(elm[testIDCol]))): if found == True: print >> gFile,"Duplicate testcase name",testName, "<==>", testCaseName #print >> gFile, testName,testCaseName,elm[2],elm[7] result = elm[resultCol] if len(elm) > commentCol: logVal = elm[commentCol] else: logVal = "No Comment "+ str(len(elm)) result = str(result) found = True #break print >> gFile, "found="+str(found),"testID="+str(testId),"test="+str(testName),"TC="+str(testCaseName),"Result="+str(result),"comment="+str(logVal) #result in return value: 0-success 1-failure if result.upper() == 'PASS': file1.write(SUCCESS_STATUS + timestamp() + " " + "Test Passed" + ".\n" ) elif result.upper() == 'FAIL': file1.write(FAILURE_STATUS + timestamp() + " " + "Test Failed" + ".\n" ) else: file1.write(LOG_STATUS + timestamp() + " " + "Test Skiped" + ".\n" ) logList = logVal.split("\n") for elm in logList: file1.write(LOG_STATUS + " " + elm.replace("\r"," ") + ".\n" ) #file1.write(LOG_STATUS + timestamp() + " " + elm.replace("\r","") + ".\n" ) file1.close(); # TEST_COMPLETED test_completed(); gFile.close() sys.exit(0)