result_tool.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. # -*- coding: utf-8 -*-
  2. import sys,os,time
  3. reload(sys)
  4. sys.setdefaultencoding('utf-8')
  5. from utils.test_task import *
  6. from utils.platform_Util import *
  7. from sat_environment import *
  8. from utils import *
  9. from core.process_sync import *
  10. import shutil,json
  11. from runner import runner_sender
  12. class ResultTool(ProcessSync):
  13. Result_DIR = getResultDir()
  14. Result_DETAIL = "detail"
  15. Result_Total_XSL = r"config/all-result.xsl"
  16. Result_Detail_XSL = r"config/case_result_detail.xsl"
  17. Python_Home = sys.prefix
  18. Action_DetailResult = "detail_result"
  19. Action_CaseResult = "case_result"
  20. Key_CaseName = "case_name"
  21. Key_CaseResult = "case_result"
  22. Key_ItemName = "item_name"
  23. Key_ItemResult = "item_result"
  24. Key_ItemScreen = "item_screen"
  25. Key_ItemLog = "item_log"
  26. File_Name = "unknown"
  27. def __init__(self, resultxml = "all-result.xml"):
  28. print "Init ResultTool"
  29. ProcessSync.__init__(self)
  30. ResultTool.updateBaseDir(getResultDir())
  31. self.Result_XMLFile = ResultTool.Result_DIR + "/" +resultxml
  32. self.task = xml_util.parseAllResult(self.Result_XMLFile)
  33. self.Case_Result = "NotExcuted"
  34. self.detailItemIndex = 0
  35. self.caseName = ""
  36. def continueNextItem(self, itemName, itemDesc="None"):
  37. self.detailItemIndex += 1
  38. runner_sender.sendActionStart(self.tc.name, self.detailItemIndex, itemName, itemDesc)
  39. def setNextItem(self, itemName, itemIndex, itemDesc="None"):
  40. self.detailItemIndex = itemIndex
  41. runner_sender.sendActionStart(self.tc.name, self.detailItemIndex, itemName, itemDesc)
  42. # 通过Script_Activity告诉ResultTool,当前脚本名,用于拼接结果文件保存路径
  43. @staticmethod
  44. def setFileName(fileName):
  45. ResultTool.File_Name = fileName
  46. @staticmethod
  47. def checkResultDIR():
  48. ResultTool.mkCHdir(ResultTool.Result_DIR)
  49. ResultTool.mkCHdir(ResultTool.Result_DIR_DETAIL)
  50. ResultTool.mkCHdir(ResultTool.Result_DIR_LOG)
  51. ResultTool.mkCHdir(ResultTool.Result_DIR_SCREEN)
  52. ResultTool.mkCHdir(ResultTool.Result_DIR_SCRIPTS)
  53. @staticmethod
  54. def mkCHdir(dir):
  55. #print "mkCHdir,dir=", dir
  56. if (os.path.exists(dir)):
  57. return
  58. #例如:D:/SAT/result_schedule_id_schedule_name_task_number//detail
  59. #os.path.splite结果:('D:/SAT/result_schedule_id_schedule_name_task_number', 'detail')
  60. #过滤//多个分割符的情况
  61. preDir = os.path.split(dir)[0]
  62. #print "mkdir,preDir=", preDir
  63. if (not os.path.exists(preDir)):
  64. ResultTool.mkCHdir(preDir)
  65. #防止目录字符串最后带有/的情况,会出现两次创建同一个目录
  66. #例如: D:/SAT/。会创建D:/SAT和D:/SAT/
  67. if (not os.path.exists(dir)):
  68. os.mkdir(dir)
  69. @staticmethod
  70. def copyInitFile():
  71. Result_Total_XSL_Path = ResultTool.Python_Home + Environment.SDK_Relative_Path + ResultTool.Result_Total_XSL
  72. Result_Detail_XSL_Path = ResultTool.Python_Home + Environment.SDK_Relative_Path + ResultTool.Result_Detail_XSL
  73. shutil.copyfile(Result_Total_XSL_Path, ResultTool.Result_DIR + "/all-result.xsl")
  74. shutil.copyfile(Result_Detail_XSL_Path, ResultTool.Result_DIR_DETAIL + "/case_result_detail.xsl")
  75. @staticmethod
  76. def updateBaseDir(dir):
  77. print "updateBaseDir,dir=",dir
  78. ResultTool.Result_DIR = unicode(dir)
  79. ResultTool.Result_DIR_DETAIL = ResultTool.Result_DIR + "/" + ResultTool.Result_DETAIL
  80. ResultTool.Result_DIR_LOG = ResultTool.Result_DIR + "/adb_log/" + ResultTool.File_Name
  81. ResultTool.Result_DIR_SCREEN = ResultTool.Result_DIR + "/screen/" + ResultTool.File_Name
  82. ResultTool.Result_DIR_SCRIPTS = ResultTool.Result_DIR + "/scripts/" + ResultTool.File_Name
  83. ResultTool.checkResultDIR()
  84. ResultTool.copyInitFile()
  85. @staticmethod
  86. def setBaseDir(dir):
  87. setResultDir(dir)
  88. def getBaseDir(self):
  89. return ResultTool.Result_DIR
  90. def getDetailDir(self):
  91. return ResultTool.Result_DIR_DETAIL
  92. def getLogDir(self):
  93. return ResultTool.Result_DIR_LOG
  94. def getScreenDir(self):
  95. return ResultTool.Result_DIR_SCREEN
  96. def addTestCase(self, caseName):
  97. tcase = self.task.getCaseByName(caseName)
  98. if (tcase == None):
  99. self.tc = TestCase()
  100. self.tc.name = caseName
  101. self.task.addTestCase(self.tc)
  102. else:
  103. self.tc = tcase
  104. return self.tc
  105. def getItemByName(self, itemlist, itemname):
  106. for item in itemlist:
  107. if (item.name == itemname):
  108. return item
  109. return None
  110. def addItemPicture(self, casename, picpath):
  111. # print "addItemPicture,",casename, picpath
  112. destPicDir = os.path.join(self.getScreenDir(), casename)
  113. self.mkCHdir(destPicDir)
  114. destPicPath = os.path.join(destPicDir,os.path.basename(picpath))
  115. if os.path.isdir(destPicPath):
  116. print u"图片路径为空"
  117. return ""
  118. try:
  119. shutil.copy(picpath,destPicPath)
  120. except IOError, e:
  121. print u"拷贝图片失败"
  122. print e
  123. return casename + "/" + os.path.basename(picpath), os.path.basename(picpath)
  124. def saveDetailResult2(self, destxml, itemname, result, picNameList, logName, data="",remark=""):
  125. print "saveDetailResult2,picNameList:", picNameList
  126. print "saveDetailResult:",destxml
  127. itemList = xml_util.parseDetailResult(destxml.decode('utf-8'))
  128. item = self.getItemByName(itemList,itemname)
  129. if (item == None):
  130. item = Item()
  131. item.name = itemname
  132. itemList.append(item)
  133. item.result = result
  134. del item.screenPathList[:]
  135. for picName in picNameList:
  136. item.screenPathList.append("../screen/" + picName)
  137. if logName <> "":
  138. item.logPath = "../log/" + logName
  139. item.data =data
  140. item.remark = remark
  141. xml_util.saveDetailResult(destxml.decode('utf-8'), itemList)
  142. """
  143. picpathList:图片路径数组.最多存储6张图片
  144. """
  145. def saveDetailResult(self, xmlName, itemname, result, picpathList, logpath="", data="", remark=""):
  146. xmlPath = ResultTool.Result_DIR_DETAIL + "/"+ xmlName
  147. # print "saveDetailResult,xmlPath=", xmlPath
  148. # print "saveDetailResult,picpathList:", picpathList
  149. if (result == "Fail"):
  150. self.Case_Result = result
  151. #兼容之前的参数字符串定义
  152. picList = []
  153. if (type(picpathList) == type("") and picpathList <> "")\
  154. or (type(picpathList) == type(u"") and picpathList <> u""):
  155. # print u"screen字符串"
  156. picList.append(picpathList)
  157. else:
  158. picList = picpathList
  159. # print "saveDetailResult,picList:", picList
  160. rePicNameList = []
  161. picNameList = []
  162. for picpath in picList:
  163. if picpath.__len__() < 5:
  164. break
  165. rePicName, picName = self.addItemPicture(self.tc.name, picpath)
  166. rePicNameList.append(rePicName)
  167. picNameList.append(picName)
  168. logname = os.path.basename(logpath)
  169. self.saveDetailResult2(xmlPath, itemname, result,rePicNameList, logname, data, remark)
  170. destPicDir = os.path.join(self.getScreenDir(), self.tc.name)
  171. runner_sender.sendActionResult(self.tc.name, self.detailItemIndex, itemname, "", result, remark, destPicDir,"", picNameList,"",data)
  172. def saveCaseResult2(self, result, detailFilePath):
  173. self.tc.result = result
  174. self.tc.rdetail = detailFilePath
  175. #print "saveCaseResult2,Result_XMLFile=", self.Result_XMLFile
  176. xml_util.saveAllResult(self.task, self.Result_XMLFile.decode('utf-8'))
  177. #Packet case result
  178. #兼容制定测试用例名,和不指定测试用例的情况
  179. def saveCaseResult(self,result, detailFileName):
  180. #detailFilePath = ResultTool.Result_DIR + detailFileName
  181. detailFilePath = ResultTool.Result_DETAIL + "/"+detailFileName
  182. self.Case_Result = result
  183. self.saveCaseResult2(self.Case_Result, detailFilePath)
  184. runner_sender.sendCaseResult(self.tc.name, self.detailItemIndex, result, "", "", "")
  185. if __name__ == "__main__":
  186. # Result_XMLFile = "all-result.xml"
  187. # detailXml = "test-result.xml"
  188. # # ResultTool.setBaseDir(u"D:/SAT/中文测试/")
  189. # reTool = ResultTool(Result_XMLFile)
  190. # reTool.addTestCase("中文测试")
  191. # reTool.saveDetailResult(detailXml, "测试", "Pass", "item2.png&item3.png", "log.txt")
  192. # reTool.saveCaseResult("Fail", detailXml)
  193. destxml = r"E:\SAT\results\detail\source_select_result.xml"
  194. itemList = xml_util.parseDetailResult(destxml.decode('utf-8'))
  195. print "itemList:",itemList
  196. for item in itemList:
  197. print "item.name:",item.name
  198. print "item.data:",item.data
  199. print "item.remark:",item.remark
  200. print "item.result:",item.result,type(item.result)
  201. print "item.screenPathList:",item.screenPathList
  202. # itemScreenPathList = item.screenPathList
  203. # imageName =
  204. print "item.logPath:",item.logPath