package auto import ( "bufio" "database/sql" "fmt" "math/rand" "os" "strings" "time" "xgAutoTest/internal/config" "xgAutoTest/internal/dbBase" "xgAutoTest/internal/global" "xgAutoTest/internal/produce" "xgAutoTest/internal/utils" ) // var textsList []string var imagesList [][]byte // var global.FileLocal string var tableUpperParts1 []produce.TableUpperPart func createLogFile() { // nowTime := time.Now() // global.FileLocal = fmt.Sprintf("./file/OK_%s/images", nowTime.Format("2006-01-02 15:04:05.00000")) err := utils.CreateFolder(global.FileLocal) if err != nil { global.Logs.Error("创建结果images文件夹失败: ", err) } else { global.Logs.Printf("创建结果images文件夹成功: %s\n", global.FileLocal) } err = utils.CreateFolder(fmt.Sprintf(global.FileLocal + "/images/single")) if err != nil { global.Logs.Error("创建结果single文件夹失败: ", err) } else { global.Logs.Printf("创建结果single文件夹成功: %s\n", global.FileLocal) } err = utils.CreateFolder(fmt.Sprintf(global.FileLocal + "/images/merged")) if err != nil { global.Logs.Error("创建结果merged文件夹失败: ", err) } else { global.Logs.Printf("创建结果merged文件夹成功: %s\n", global.FileLocal) } } func AutoRun(config config.ConfigInfo) { //生成本次执行结果的文件夹 createLogFile() //获取数据库连接 db := dbBase.GetDb() //循环取出[sql]组下的片段,一个用例名称到下一个用列名称前为一个片段 for _, Part := range config.CommandSql.Part { var tableUpperPartTemp produce.TableUpperPart tableUpperPartTemp.Left = make([]string, 0) tableUpperPartTemp.Right = make([]string, 0) tableUpperPartTemp.ImagesList = make([][]byte, 0) tableUpperPartTemp.SqlToTextsList = make([]string, 0) //文本 var texts string //[].part 将片段转换为键值 partMap := config.ParseGroupCase(Part) //将片段添加到tableUpperPartTemp tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "用例名称") tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["用例名称"]) tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试要求") tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试要求"]) tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试步骤") tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试步骤"]) tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试程序") tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试程序"]) //[].partMap[测试步骤],sql运行 global.Logs.Printf("测试步骤: %s\n", partMap["测试步骤"]) partTestStepScanner := bufio.NewScanner(strings.NewReader(partMap["测试步骤"])) var sql string for partTestStepScanner.Scan() { partLine := strings.ToLower(strings.TrimSpace(partTestStepScanner.Text())) fmt.Printf("partLine: %s\n", partLine) switch { //sql注释-- case strings.HasPrefix(partLine, "--"): fmt.Println("带有--key") sql = strings.TrimSpace(strings.TrimPrefix(partLine, "--")) texts += sql texts += "\n" texts += "\n" sql = "" //fmt.Printf("带有--key: %s\n", key) //sql语句 case strings.Contains(partLine, ";"): fmt.Println("带有;key") //fmt.Printf("不带有--sql: %s\n", partLine) sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1]) //fmt.Printf("sql TrimSpace: %s\n", sql) texts += sql texts += "\n" isQueryOrInsert(db, sql, &tableUpperPartTemp) sql = "" default: fmt.Println("继续读取key") sql += strings.TrimSpace(partLine) texts += sql texts += "\n" sql += "\n" } } //将文本组添加到textsList //textsList = append(textsList, texts) tableUpperPartTemp.SqlToTextsList = append(tableUpperPartTemp.SqlToTextsList, texts) tableUpperParts1 = append(tableUpperParts1, tableUpperPartTemp) //检查[sql]下的片段读入是否错误 if err := partTestStepScanner.Err(); err != nil { fmt.Println("partTestStepScanner.Error reading input:", err) } } for i := range tableUpperParts1 { fmt.Printf("tableUpperParts1内有 %v 条数据\n", i+1) } //生成word generateWord(tableUpperParts1) } func executeSQL(partLine string, db *sql.DB, tableUpperPartTemp *produce.TableUpperPart) { var texts string switch { //sql注释-- case strings.HasPrefix(partLine, "--"): sql := strings.TrimSpace(strings.TrimPrefix(partLine, "--")) texts += sql texts += "\n" texts += "\n" //fmt.Printf("带有--key: %s\n", key) //sql语句 case strings.Contains(partLine, ";"): //fmt.Printf("不带有--sql: %s\n", partLine) sql := strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1]) //fmt.Printf("sql TrimSpace: %s\n", sql) texts += sql texts += "\n" isQueryOrInsert(db, sql, tableUpperPartTemp) } } func isQueryOrInsert(db *sql.DB, sql string, tableUpperPartTemp *produce.TableUpperPart) { switch { //执行查询语句 case strings.HasPrefix(sql, "select"): { ret := dbBase.QueryString(db, sql) var im produce.ImageInfo imageRet, err := im.Runimage2(ret) if err != nil { global.Logs.Error(err) return } imagesList = append(imagesList, imageRet) tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet) now := time.Now() 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"))) } //执行大对象插入语句 case isBlob(sql): { //fmt.Printf("\nsql is 大对象插入: %s\n", sql) } //其他语句调用exec函数 default: { //不是大对象插入语句的处理 //fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql) ret := dbBase.ExecString(db, sql) var im produce.ImageInfo imageRet, err := im.Runimage2(ret) if err != nil { global.Logs.Error(err) return } imagesList = append(imagesList, imageRet) tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet) now := time.Now() 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"))) } } } // 是否是大对象语句 func isBlob(sql string) bool { utils.ContainsKeyword(sql, "values") questionMarksCount := utils.IsInsertBlob(sql) switch { case questionMarksCount > 0: { return true } default: return false } } // 生成word func generateWord(tableUpperParts1 []produce.TableUpperPart) { fmt.Println("调用generateWord()") wd := produce.Newword() for _, tableUpperPart := range tableUpperParts1 { //fmt.Printf("text: %v\n", text) mergedImage, err := produce.MergeImages(tableUpperPart.ImagesList) if err != nil { panic(err) } wd.WriterTable(global.FileLocal, "sad", tableUpperPart, mergedImage) //保存图片 timeNow := time.Now().Format("2006-01-02 15:04:05.00000") // 生成随机整数 randomInt := rand.Intn(100) // 生成0到99之间的随机整数 err = os.WriteFile(fmt.Sprintf("%s/merged_image_%s_%d.png", fmt.Sprintf(global.FileLocal+"/images/merged"), timeNow, randomInt), mergedImage, 0644) if err != nil { panic(err) } fmt.Println("生成合成图片-------------") //imagesList = nil } //保存word为文件 wd.SaveWord(global.FileLocal) }