result_tool.py 8.8 KB

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