1from ast import Return 2import os 3import sys 4from unittest import suite 5 6G_SUITE = "" 7G_MAXCASECNT = 5 8G_MUSTPASSPATH = "mustpass/" 9G_MUSTPASSFILE = ".txt" 10G_TMPPATH = "template/" 11G_TMPDIRPATH = G_TMPPATH + "ace_ets_template" 12G_HAPDIRPATH = "../act_etc_component_" 13G_IMPORTTEST = "import {}Jsunit from \'./{}.test.ets\';" 14G_IMPORTTESTCASE = "{}Jsunit()" 15G_PATHDIRPATH = "/entry/src/main/ets/MainAbility/pages/" 16G_PAGETEMPPATH = "/pagetemplate.ets" 17G_PAGEATTRTEMPPATH = "/pageattrtemplate.ets" 18G_TESTDIRPATH = "/entry/src/main/ets/test/" 19G_TESTCASETEMPPATH = "/testcasetemplate.ets" 20G_TESTTEMPPATH = "/List.test.ets" 21G_LISTTESTETSPATH = "/entry/src/main/ets/test/List.test.ets" 22G_PAGENAMEPATTERN = "##PAGENAME" 23G_ATTRNAMEPATTERN = "##ATTRNAME" 24G_LOWATTRNAMEPATTERN = "##LOWATTRNAME" 25G_PAGENAMETESETPATTERN = "##PAGENAMETEST" 26G_PAGEFILENAMEPATTERN = "##PAGEFILENAME" 27G_SUITENAMEPATTERN = "##SUITENAME" 28G_PAGENAMETESTPATTERN = "##PAGENAMETEXT" 29G_CONFIGJSONPATH = "/entry/src/main/config.json" 30G_BUILDGNPATH = "/BUILD.gn" 31G_TESTJSONPATH = "/Test.json" 32G_INDEXETSPATH = "/entry/src/main/ets/MainAbility/pages/index.ets" 33 34def writemultestcase(): 35 print("writemultestcase") 36 writemultestcasecpp() 37 print("writemulbuildgn") 38 writemulbuildgn() 39 40def writemulbuildgn(): 41 #生成buildgn 42 for suiteitem in G_SUITE: 43 subcasecnt = 0 44 subattcnt = 0 45 subgncnt = 0 46 suiteitemcap = "".join(suiteitem[:1].upper() + suiteitem[1:]) 47 print("suite:", suiteitem, "----------------------") 48 #创建一个hap目录 49 hapdirpath = G_HAPDIRPATH + suiteitem.lower() 50 if os.path.exists(hapdirpath): 51 os.system(r"rm -rf {}".format(hapdirpath)) 52 os.system(r"cp {} {} -r".format(G_TMPDIRPATH, hapdirpath)) 53 else: 54 os.system(r"cp {} {} -r".format(G_TMPDIRPATH, hapdirpath)) 55 56 mustpass = G_MUSTPASSPATH + suiteitem + G_MUSTPASSFILE 57 with open(mustpass) as mastpassfile: 58 compdict = {"":1} 59 60 importtestheads = [] 61 importtests = [] 62 for line in mastpassfile: 63 if line[0] == "#": 64 continue 65 line = line.replace("\n", "") 66 linelist = line.split(",") 67 suitename = linelist[0] 68 casename = linelist[1] 69 70 if suitename in compdict: 71 #同文件里加属性 72 ind = compdict[suitename] 73 subattcnt += 1 74 #在page文件里追加attr内容 75 suitenamecap = "".join(suitename[:1].upper() + suitename[1:]) 76 casenamecap = "".join(casename[:1].upper() + casename[1:]) 77 pagename = suitenamecap + casenamecap 78 pagenametext = suitename + "-" + casenamecap 79 pagefilename = hapdirpath + G_PATHDIRPATH + suitename + ".ets" 80 attrtmp = G_TMPPATH + G_PAGEATTRTEMPPATH 81 with open(attrtmp, encoding="utf-8", mode="r") as attrtmpfile: 82 for attrtempline in attrtmpfile: 83 attrtempline = attrtempline.replace(" ", "\ ") 84 attrtempline = attrtempline.replace(G_PAGENAMETESTPATTERN, pagenametext) 85 attrtempline = attrtempline.replace(G_ATTRNAMEPATTERN, casename) 86 os.system(r"sed -i '{}a {}' {}".format(ind, attrtempline, pagefilename)) 87 ind += 1 88 compdict[suitename] = ind 89 90 else: 91 #创建不同页面 92 subgncnt += 1 93 subattcnt = 1 94 ind = 29 95 compdict[suitename] = ind 96 postfix = '%04d' % subgncnt 97 dirpath = suitename + postfix 98 temppagefilename = G_TMPPATH + G_PAGETEMPPATH 99 suitenamecap = "".join(suitename[:1].upper() + suitename[1:]) 100 casenamecap = "".join(casename[:1].upper() + casename[1:]) 101 pagename = suitename + casenamecap 102 capagename = suitenamecap + casenamecap 103 testname = pagename 104 pagefilename = hapdirpath + G_PATHDIRPATH + suitename + ".ets" 105 os.system(r"cp {} {}".format(temppagefilename, pagefilename)) 106 #替换page里的名称 107 os.system(r"sed -i 's/{}/{}/g' {}".format(G_PAGENAMEPATTERN, capagename, pagefilename)) 108 #追加page里的attr 109 pagenametext = suitename + "-" + casenamecap 110 attrtmp = G_TMPPATH + G_PAGEATTRTEMPPATH 111 with open(attrtmp, encoding="utf-8", mode="r") as attrtmpfile: 112 for attrtempline in attrtmpfile: 113 attrtempline = attrtempline.replace(" ", "\ ") 114 attrtempline = attrtempline.replace(G_PAGENAMETESTPATTERN, pagenametext) 115 attrtempline = attrtempline.replace(G_ATTRNAMEPATTERN, casename) 116 os.system(r"sed -i '{}a {}' {}".format(ind, attrtempline, pagefilename)) 117 ind += 1 118 compdict[suitename] = ind 119 120 temptestfilename = G_TMPPATH + G_TESTCASETEMPPATH 121 testfilename = hapdirpath + G_TESTDIRPATH + suitename + ".test.ets" 122 os.system(r"cp {} {}".format(temptestfilename, testfilename)) 123 #替换test里的名称 124 os.system(r"sed -i 's/{}/{}/g' {}".format(G_ATTRNAMEPATTERN, testname, testfilename)) 125 os.system(r"sed -i 's/{}/{}/g' {}".format(G_PAGENAMETESETPATTERN, testname+"Test", testfilename)) 126 os.system(r"sed -i 's/{}/{}/g' {}".format(G_PAGEFILENAMEPATTERN, pagename, testfilename)) 127 os.system(r"sed -i 's/{}/{}/g' {}".format(G_LOWATTRNAMEPATTERN, casename, testfilename)) 128 #替换config.json里的名称 129 configjsonname = hapdirpath + G_CONFIGJSONPATH 130 os.system(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, configjsonname)) 131 os.system(r"sed -i 's/{}/{}/g' {}".format(G_PAGEFILENAMEPATTERN, casenamecap, configjsonname)) 132 #替换BUILD.gn里的名称 133 buildgnname = hapdirpath + G_BUILDGNPATH 134 os.system(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, buildgnname)) 135 # formate gn 136 formatcmd = "cat "+buildgnname+" | ~/workspace/oh31/prebuilts/build-tools/linux-x86/bin/gn format --stdin > FORMAT_RESULT.gn;cp -f FORMAT_RESULT.gn "+buildgnname+";rm FORMAT_RESULT.gn" 137 os.system(formatcmd) 138 #替换index.ets里的名称 139 indexetsname = hapdirpath + G_INDEXETSPATH 140 os.system(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, indexetsname)) 141 142 #替换Test.json里的名称 143 testjsonname = hapdirpath + G_TESTJSONPATH 144 os.system(r"sed -i 's/{}/{}/g' {}".format(G_SUITENAMEPATTERN, suiteitemcap, testjsonname)) 145 146 importtestheads.append(G_IMPORTTEST.format(testname, suitename)) 147 importtests.append(G_IMPORTTESTCASE.format(testname)) 148 subcasecnt += 1 149 #插入List.test.ets,装载多个testcase 150 ind = 16 151 for importtestsline in importtests: 152 os.system(r"sed -i '{}a \ \ {}' {}".format(ind, importtestsline, hapdirpath + G_LISTTESTETSPATH)) 153 ind += 1 154 ind = 14 155 for importtestheadsline in importtestheads: 156 os.system(r"sed -i '{}a {}' {}".format(ind, importtestheadsline, hapdirpath + G_LISTTESTETSPATH)) 157 ind += 1 158 159def writemultestcasecpp(): 160 #生成testcase 161 for suiteitem in G_SUITE: 162 print("suite:", suiteitem) 163 164def removedir(rootdir): 165 for root,dirs,files in os.walk(rootdir, topdown=False): 166 for name in files: 167 os.remove(os.path.join(rootdir,name)) 168 for name in dirs: 169 os.rmdir(os.path.join(rootdir,name)) 170 os.rmdir(rootdir) 171 172 173def printhelp(): 174 print("Need testsuite and codepattern:\n") 175 print("For example\n") 176 print("python3 .\GenerateTestCase.py apilack\n") 177 print("codepattern contains: apilack, attrlack\n") 178 179def new_report(bakdir, str): 180 files = os.listdir(bakdir) 181 lists = [] #列出目录的下所有文件和文件夹保存到lists 182 for f in files: 183 if "latest" in f: 184 continue 185 lists.append(f) 186 187 lists.sort(key=lambda fn:os.path.getmtime(bakdir + "/" + fn)) # 按时间排序 188 file_new = os.path.join(bakdir,lists[-1]) # 获取最新的文件保存到file_new 189 print("latest file:", file_new) 190 return file_new 191 192 193if __name__ == '__main__': 194 latestpath = new_report("reports", "") 195 tmpfile = "tmptestsuite.xml" 196 putfile = "/result/ActsLibuvTest.xml" 197 tasklogfile = "/log/task_log.log" 198 putdir = latestpath+putfile 199 tasklogpath = latestpath+tasklogfile 200 201 timelist = latestpath.split("/") 202 curtime = timelist[1].replace("\n", "") 203 testcaselist = [] 204 total = 0 205 passcnt = 0 206 failcnt = 0 207 suitename = "" 208 #读取最近的tasklog文件 209 with open(tasklogpath) as tasklogbuf: 210 #从tasklog文件中获取运行的testcase的信息 211 for tasklogline in tasklogbuf: 212 if "[Start test suite [" in tasklogline: 213 suitelist = tasklogline.split("[Start test suite [") 214 suiteitem = suitelist[1].split("]") 215 suitename = suiteitem[0] 216 if "[ok " in tasklogline: 217 freslist = tasklogline.split("ok") 218 numcase = freslist[1] 219 numcase = numcase.replace(" ","") 220 numcase = numcase.replace("]","") 221 caseline = numcase.split("-") 222 total +=1 223 passcnt += 1 224 testcaselist.append(caseline[1]+"-true") 225 if "[not ok " in tasklogline: 226 freslist = tasklogline.split("not ok") 227 numcase = freslist[1] 228 numcase = numcase.replace(" ","") 229 numcase = numcase.replace("]","") 230 caseline = numcase.split("-") 231 total +=1 232 failcnt += 1 233 testcaselist.append(caseline[1]+"-false") 234 #将testcase信息生成文件 235 xmlfile = open(tmpfile, mode='w+') 236 xmlfile.write("<?xml version='1.0' encoding='UTF-8'?>\n") 237 xmlfile.write("<testsuites name=\"{}\" timestamp=\"{}\" time=\"0.0\" errors=\"0\" disabled=\"0\" failures=\"{}\" tests=\"{}\" ignored=\"0\" unavailable=\"0\" productinfo=\"{}\">\n".format(suitename, curtime, failcnt, total, "{}")) 238 xmlfile.write(" <testsuite name=\"{}\" time=\"0.0\" errors=\"0\" disabled=\"0\" failures=\"{}\" ignored=\"0\" tests=\"{}\" message=\"\">\n".format(suitename, failcnt, total)) 239 for casename in testcaselist: 240 casename = casename.replace("\n","") 241 loccasename = casename.split("-") 242 recasename = loccasename[0] 243 casestate = loccasename[1] 244 xmlfile.write(" <testcase name=\"{}\" status=\"run\" time=\"0.0\" classname=\"{}\" result=\"{}\" level=\"1\" message=\"\" />\n".format(recasename, suitename, casestate)) 245 xmlfile.write(" </testsuite>\n") 246 xmlfile.write("</testsuites>\n") 247 xmlfile.close() 248 #将tmp文件替换xts框架的result 249 os.system(r"cp {} {}".format(tmpfile, putdir)) 250