auto.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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("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. //fmt.Printf("带有--key: %s\n", key)
  84. //sql语句
  85. case strings.Contains(partLine, ";"):
  86. fmt.Println("带有;key")
  87. //fmt.Printf("不带有--sql: %s\n", partLine)
  88. sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
  89. //fmt.Printf("sql TrimSpace: %s\n", sql)
  90. texts += sql
  91. texts += "\n"
  92. isQueryOrInsert(db, sql, &tableUpperPartTemp)
  93. sql = ""
  94. default:
  95. fmt.Println("继续读取key")
  96. sql += strings.TrimSpace(partLine)
  97. texts += sql
  98. texts += "\n"
  99. sql += "\n"
  100. }
  101. }
  102. //将文本组添加到textsList
  103. //textsList = append(textsList, texts)
  104. tableUpperPartTemp.SqlToTextsList = append(tableUpperPartTemp.SqlToTextsList, texts)
  105. tableUpperParts1 = append(tableUpperParts1, tableUpperPartTemp)
  106. //检查[sql]下的片段读入是否错误
  107. if err := partTestStepScanner.Err(); err != nil {
  108. fmt.Println("partTestStepScanner.Error reading input:", err)
  109. }
  110. }
  111. for i := range tableUpperParts1 {
  112. fmt.Printf("tableUpperParts1内有 %v 条数据\n", i+1)
  113. }
  114. //生成word
  115. generateWord(tableUpperParts1)
  116. }
  117. func executeSQL(partLine string, db *sql.DB, tableUpperPartTemp *produce.TableUpperPart) {
  118. var texts string
  119. switch {
  120. //sql注释--
  121. case strings.HasPrefix(partLine, "--"):
  122. sql := strings.TrimSpace(strings.TrimPrefix(partLine, "--"))
  123. texts += sql
  124. texts += "\n"
  125. texts += "\n"
  126. //fmt.Printf("带有--key: %s\n", key)
  127. //sql语句
  128. case strings.Contains(partLine, ";"):
  129. //fmt.Printf("不带有--sql: %s\n", partLine)
  130. sql := strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
  131. //fmt.Printf("sql TrimSpace: %s\n", sql)
  132. texts += sql
  133. texts += "\n"
  134. isQueryOrInsert(db, sql, tableUpperPartTemp)
  135. }
  136. }
  137. func isQueryOrInsert(db *sql.DB, sql string, tableUpperPartTemp *produce.TableUpperPart) {
  138. switch {
  139. //执行查询语句
  140. case strings.HasPrefix(sql, "select"):
  141. {
  142. ret := dbBase.QueryString(db, sql)
  143. var im produce.ImageInfo
  144. imageRet, err := im.Runimage2(ret)
  145. if err != nil {
  146. global.Logs.Error(err)
  147. return
  148. }
  149. imagesList = append(imagesList, imageRet)
  150. tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  151. now := time.Now()
  152. 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")))
  153. }
  154. //执行大对象插入语句
  155. case isBlob(sql):
  156. {
  157. //fmt.Printf("\nsql is 大对象插入: %s\n", sql)
  158. }
  159. //其他语句调用exec函数
  160. default:
  161. {
  162. //不是大对象插入语句的处理
  163. //fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql)
  164. ret := dbBase.ExecString(db, sql)
  165. var im produce.ImageInfo
  166. imageRet, err := im.Runimage2(ret)
  167. if err != nil {
  168. global.Logs.Error(err)
  169. return
  170. }
  171. imagesList = append(imagesList, imageRet)
  172. tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
  173. now := time.Now()
  174. 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")))
  175. }
  176. }
  177. }
  178. // 是否是大对象语句
  179. func isBlob(sql string) bool {
  180. utils.ContainsKeyword(sql, "values")
  181. questionMarksCount := utils.IsInsertBlob(sql)
  182. switch {
  183. case questionMarksCount > 0:
  184. {
  185. return true
  186. }
  187. default:
  188. return false
  189. }
  190. }
  191. // 生成word
  192. func generateWord(tableUpperParts1 []produce.TableUpperPart) {
  193. fmt.Println("调用generateWord()")
  194. wd := produce.Newword()
  195. for _, tableUpperPart := range tableUpperParts1 {
  196. //fmt.Printf("text: %v\n", text)
  197. mergedImage, err := produce.MergeImages(tableUpperPart.ImagesList)
  198. if err != nil {
  199. panic(err)
  200. }
  201. wd.WriterTable(global.FileLocal, "sad", tableUpperPart, mergedImage)
  202. //保存图片
  203. timeNow := time.Now().Format("2006-01-02 15:04:05.00000")
  204. // 生成随机整数
  205. randomInt := rand.Intn(100) // 生成0到99之间的随机整数
  206. err = os.WriteFile(fmt.Sprintf("%s/merged_image_%s_%d.png", fmt.Sprintf(global.FileLocal+"/images/merged"), timeNow, randomInt), mergedImage, 0644)
  207. if err != nil {
  208. panic(err)
  209. }
  210. fmt.Println("生成合成图片-------------")
  211. //imagesList = nil
  212. }
  213. //保存word为文件
  214. wd.SaveWord(global.FileLocal)
  215. }