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