auto.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. package auto
  2. import (
  3. "bufio"
  4. "database/sql"
  5. "fmt"
  6. "math/rand"
  7. "os"
  8. "strings"
  9. "time"
  10. "xgAutoTest/internal/config"
  11. "xgAutoTest/internal/dbBase"
  12. "xgAutoTest/internal/global"
  13. "xgAutoTest/internal/produce"
  14. "xgAutoTest/internal/utils"
  15. )
  16. // var textsList []string
  17. var imagesList [][]byte
  18. // var global.FileLocal string
  19. var tableUpperParts1 []produce.TableUpperPart
  20. func createLogFile() {
  21. // nowTime := time.Now()
  22. // global.FileLocal = fmt.Sprintf("./file/OK_%s/images", nowTime.Format("2006-01-02 15:04:05.00000"))
  23. err := utils.CreateFolder(global.FileLocal)
  24. if err != nil {
  25. global.Logs.Error("创建结果images文件夹失败: ", err)
  26. } else {
  27. global.Logs.Printf("创建结果images文件夹成功: %s\n", global.FileLocal)
  28. }
  29. err = utils.CreateFolder(fmt.Sprintf(global.FileLocal + "/images/single"))
  30. if err != nil {
  31. global.Logs.Error("创建结果single文件夹失败: ", err)
  32. } else {
  33. global.Logs.Printf("创建结果single文件夹成功: %s\n", global.FileLocal)
  34. }
  35. err = utils.CreateFolder(fmt.Sprintf(global.FileLocal + "/images/merged"))
  36. if err != nil {
  37. global.Logs.Error("创建结果merged文件夹失败: ", err)
  38. } else {
  39. global.Logs.Printf("创建结果merged文件夹成功: %s\n", global.FileLocal)
  40. }
  41. }
  42. func AutoRun(config config.ConfigInfo) {
  43. //生成本次执行结果的文件夹
  44. createLogFile()
  45. //获取数据库连接
  46. db := dbBase.GetDb()
  47. //循环取出[sql]组下的片段,一个用例名称到下一个用列名称前为一个片段
  48. for _, Part := range config.CommandSql.Part {
  49. var tableUpperPartTemp produce.TableUpperPart
  50. tableUpperPartTemp.Left = make([]string, 0)
  51. tableUpperPartTemp.Right = make([]string, 0)
  52. tableUpperPartTemp.ImagesList = make([][]byte, 0)
  53. tableUpperPartTemp.SqlToTextsList = make([]string, 0)
  54. //文本
  55. var texts string
  56. //[].part 将片段转换为键值
  57. partMap := config.ParseGroupCase(Part)
  58. //将片段添加到tableUpperPartTemp
  59. tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "用例名称")
  60. tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["用例名称"])
  61. tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试要求")
  62. tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试要求"])
  63. tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试步骤")
  64. tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试步骤"])
  65. tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试程序")
  66. tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试程序"])
  67. //[].partMap[测试步骤],sql运行
  68. global.Logs.Printf("测试步骤: %s\n", partMap["测试步骤"])
  69. partTestStepScanner := bufio.NewScanner(strings.NewReader(partMap["测试步骤"]))
  70. var sql string
  71. for partTestStepScanner.Scan() {
  72. partLine := strings.ToLower(strings.TrimSpace(partTestStepScanner.Text()))
  73. fmt.Printf("解析一行的sql partLine: %s\n", partLine)
  74. switch {
  75. //sql注释--
  76. case strings.HasPrefix(partLine, "--"):
  77. //fmt.Println("带有--key")
  78. sql = strings.TrimSpace(strings.TrimPrefix(partLine, "--"))
  79. texts += sql
  80. texts += "\n"
  81. texts += "\n"
  82. sql = ""
  83. //sql语句
  84. case strings.Contains(partLine, ";"):
  85. //fmt.Println("带有;key")
  86. fmt.Printf("是sql: %s\n", partLine)
  87. if strings.Contains(partLine, "<#") {
  88. texts += partLine
  89. texts += "\n"
  90. sql = ""
  91. sqlPart, files := fileInsert(db, partLine)
  92. retStr := dbBase.ExecFiles(db, sqlPart, files, partLine)
  93. var im produce.ImageInfo
  94. imageRet, err := im.Runimage(retStr)
  95. if err != nil {
  96. global.Logs.Error(err)
  97. return
  98. }
  99. imagesList = append(imagesList, imageRet)
  100. tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  101. now := time.Now()
  102. im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sqlPart[:15], now.Format("2006-01-02 15.04.05.00000")))
  103. break
  104. }
  105. if strings.Contains(partLine, "<%") {
  106. fmt.Println("带有<%key")
  107. texts += partLine
  108. texts += "\n"
  109. sql = ""
  110. sqlPart, files := fileInsert(db, partLine)
  111. retStr := dbBase.ExecClob(db, sqlPart, files, partLine)
  112. fmt.Println("CLOB:", retStr)
  113. var im produce.ImageInfo
  114. imageRet, err := im.Runimage(retStr)
  115. if err != nil {
  116. global.Logs.Error(err)
  117. return
  118. }
  119. imagesList = append(imagesList, imageRet)
  120. tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  121. now := time.Now()
  122. im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sqlPart[:15], now.Format("2006-01-02 15.04.05.00000")))
  123. break
  124. }
  125. if strings.Contains(partLine, "drop") {
  126. sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
  127. //fmt.Printf("sql TrimSpace: %s\n", sql)
  128. texts += sql
  129. texts += "\n"
  130. isQueryOrInsert(db, sql, &tableUpperPartTemp)
  131. sql = ""
  132. break
  133. }
  134. if strings.Contains(partLine, "procedure ") {
  135. endStr := "end;"
  136. sql += strings.TrimSpace(partLine[:strings.Index(partLine, endStr)+len(endStr)])
  137. fmt.Println("带有procedure key :", sql)
  138. texts += sql
  139. texts += "\n"
  140. isQueryOrInsert(db, sql, &tableUpperPartTemp)
  141. sql = ""
  142. break
  143. }
  144. sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
  145. //fmt.Printf("sql TrimSpace: %s\n", sql)
  146. texts += sql
  147. texts += "\n"
  148. isQueryOrInsert(db, sql, &tableUpperPartTemp)
  149. sql = ""
  150. default:
  151. // fmt.Println("继续读取key")
  152. sql += strings.TrimSpace(partLine)
  153. texts += sql
  154. texts += "\n"
  155. sql += "\n"
  156. }
  157. }
  158. //将文本组添加到textsList
  159. //textsList = append(textsList, texts)
  160. tableUpperPartTemp.SqlToTextsList = append(tableUpperPartTemp.SqlToTextsList, texts)
  161. tableUpperParts1 = append(tableUpperParts1, tableUpperPartTemp)
  162. //检查[sql]下的片段读入是否错误
  163. if err := partTestStepScanner.Err(); err != nil {
  164. fmt.Println("partTestStepScanner.Error reading input:", err)
  165. }
  166. //删除当前用户的所有表
  167. // tableNames := dbBase.QueryUserTableName(db, "select table_name from user_tables ")
  168. // dbBase.ExecDorpTable(db, tableNames)
  169. }
  170. // for i := range tableUpperParts1 {
  171. // fmt.Printf("tableUpperParts1内有 %v 条数据\n", i+1)
  172. // }
  173. //生成word
  174. generateWord(tableUpperParts1)
  175. }
  176. func executeSQL(partLine string, db *sql.DB, tableUpperPartTemp *produce.TableUpperPart) {
  177. var texts string
  178. switch {
  179. //sql注释--
  180. case strings.HasPrefix(partLine, "--"):
  181. sql := strings.TrimSpace(strings.TrimPrefix(partLine, "--"))
  182. texts += sql
  183. texts += "\n"
  184. texts += "\n"
  185. //fmt.Printf("带有--key: %s\n", key)
  186. //sql语句
  187. case strings.Contains(partLine, ";"):
  188. //fmt.Printf("不带有--sql: %s\n", partLine)
  189. sql := strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
  190. //fmt.Printf("sql TrimSpace: %s\n", sql)
  191. texts += sql
  192. texts += "\n"
  193. isQueryOrInsert(db, sql, tableUpperPartTemp)
  194. }
  195. }
  196. func isQueryOrInsert(db *sql.DB, sql string, tableUpperPartTemp *produce.TableUpperPart) {
  197. switch {
  198. //执行查询语句
  199. case strings.HasPrefix(sql, "select"):
  200. {
  201. ret := dbBase.QueryString(db, sql)
  202. var im produce.ImageInfo
  203. imageRet, err := im.Runimage(ret)
  204. if err != nil {
  205. global.Logs.Error(err)
  206. return
  207. }
  208. imagesList = append(imagesList, imageRet)
  209. tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  210. now := time.Now()
  211. im.SaveImage(fmt.Sprintf("%s/select %s_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[len(sql)-5:], now.Format("2006-01-02 15.04.05.00000")))
  212. }
  213. //执行大对象插入语句
  214. // case strings.Contains(sql, "<#"):
  215. // {
  216. // fmt.Printf("\nsql is 大对象插入: %s\n", sql)
  217. // sqlPart, files := isBlob(db, sql)
  218. // fmt.Println("大对象:", sqlPart)
  219. // retStr := dbBase.ExecFiles(db, sqlPart, files)
  220. // fmt.Println("大对象:", retStr)
  221. // var im produce.ImageInfo
  222. // imageRet, err := im.Runimage(retStr)
  223. // if err != nil {
  224. // global.Logs.Error(err)
  225. // return
  226. // }
  227. // imagesList = append(imagesList, imageRet)
  228. // tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  229. // now := time.Now()
  230. // im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[:15], now.Format("2006-01-02 15.04.05.00000")))
  231. // }
  232. //其他语句调用exec函数
  233. default:
  234. {
  235. //不是大对象插入语句的处理
  236. //fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql)
  237. if strings.Contains(sql, "set session") {
  238. fmt.Println("执行set session")
  239. }
  240. ret := dbBase.ExecString(db, sql)
  241. var im produce.ImageInfo
  242. imageRet, err := im.Runimage(ret)
  243. if err != nil {
  244. global.Logs.Error(err)
  245. return
  246. }
  247. imagesList = append(imagesList, imageRet)
  248. tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  249. now := time.Now()
  250. if len(sql) < 15 {
  251. im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[5:], now.Format("2006-01-02 15.04.05.00000")))
  252. break
  253. }
  254. im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[:15], now.Format("2006-01-02 15.04.05.00000")))
  255. }
  256. }
  257. }
  258. // 是否是大对象语句
  259. func fileInsert(db *sql.DB, sql string) (string, []string) {
  260. questionMarksCount := utils.IsInsertBlob(sql)
  261. fmt.Println("questionMarksCount", questionMarksCount)
  262. sqlPart, filePart, err := splitBlobAndClobString(sql)
  263. if err != nil {
  264. global.Logs.Error("切分Blob语句错误", err)
  265. return "", nil
  266. }
  267. fmt.Printf("part1: %s\n", sqlPart)
  268. fmt.Printf("part2: %s\n", filePart)
  269. files := deleteSymbol(filePart)
  270. fmt.Println("isBlob")
  271. return sqlPart, files
  272. }
  273. func splitBlobAndClobString(input string) (string, string, error) {
  274. fmt.Println("splitBlobString: ", input)
  275. splitIndex := strings.Index(input, "<#")
  276. if splitIndex == -1 {
  277. splitIndex = strings.Index(input, "<%")
  278. if splitIndex == -1 {
  279. return "", "", fmt.Errorf("delimiter '<#' not found in the input string")
  280. }
  281. }
  282. part1 := strings.TrimSpace(input[:splitIndex])
  283. part2 := strings.TrimSpace(input[splitIndex:]) // +2 to exclude '<#'
  284. return part1, part2, nil
  285. }
  286. func deleteSymbol(input string) []string {
  287. // 去掉 <# 符号
  288. cleanedInput := strings.ReplaceAll(input, "<#", "")
  289. fmt.Println("cleanedInput: ", cleanedInput)
  290. cleanedInput2 := strings.ReplaceAll(cleanedInput, "<%", "")
  291. fmt.Println("cleanedInput2: ", cleanedInput2)
  292. // 按空格切割
  293. parts := strings.Fields(cleanedInput2)
  294. // 打印结果
  295. for _, part := range parts {
  296. fmt.Println(part)
  297. }
  298. return parts
  299. }
  300. // 生成word
  301. func generateWord(tableUpperParts1 []produce.TableUpperPart) {
  302. fmt.Println("调用generateWord()")
  303. wd := produce.Newword()
  304. for _, tableUpperPart := range tableUpperParts1 {
  305. //fmt.Printf("text: %v\n", text)
  306. //fmt.Println("tableUpperPart.ImagesList: ", tableUpperPart.ImagesList)
  307. if tableUpperPart.ImagesList == nil || len(tableUpperPart.ImagesList) == 0 {
  308. global.Logs.Error("图片缓存为空,退出程序")
  309. return
  310. }
  311. mergedImage, err := produce.MergeImages(tableUpperPart.ImagesList)
  312. if err != nil {
  313. panic(err)
  314. }
  315. wd.WriterTable(global.FileLocal, tableUpperPart, mergedImage)
  316. //保存图片
  317. timeNow := time.Now().Format("2006-01-02 15.04.05.00000")
  318. // 生成随机整数
  319. randomInt := rand.Intn(100) // 生成0到99之间的随机整数
  320. err = os.WriteFile(fmt.Sprintf("%s/merged_image_%s_%d.png", fmt.Sprintf(global.FileLocal+"/images/merged"), timeNow, randomInt), mergedImage, 0644)
  321. if err != nil {
  322. panic(err)
  323. }
  324. fmt.Println("生成合成图片-------------")
  325. //imagesList = nil
  326. }
  327. //保存word为文件
  328. wd.SaveWord(global.FileLocal)
  329. }