123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- 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("解析一行的sql 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 = ""
- //sql语句
- case strings.Contains(partLine, ";"):
- //fmt.Println("带有;key")
- fmt.Printf("是sql: %s\n", partLine)
- if strings.Contains(partLine, "<#") {
- texts += partLine
- texts += "\n"
- sql = ""
- sqlPart, files := fileInsert(db, partLine)
- retStr := dbBase.ExecFiles(db, sqlPart, files, partLine)
- var im produce.ImageInfo
- imageRet, err := im.Runimage(retStr)
- 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"), sqlPart[:15], now.Format("2006-01-02 15.04.05.00000")))
- break
- }
- if strings.Contains(partLine, "<%") {
- fmt.Println("带有<%key")
- texts += partLine
- texts += "\n"
- sql = ""
- sqlPart, files := fileInsert(db, partLine)
- retStr := dbBase.ExecClob(db, sqlPart, files, partLine)
- fmt.Println("CLOB:", retStr)
- var im produce.ImageInfo
- imageRet, err := im.Runimage(retStr)
- 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"), sqlPart[:15], now.Format("2006-01-02 15.04.05.00000")))
- break
- }
- if strings.Contains(partLine, "drop") {
- sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
- //fmt.Printf("sql TrimSpace: %s\n", sql)
- texts += sql
- texts += "\n"
- isQueryOrInsert(db, sql, &tableUpperPartTemp)
- sql = ""
- break
- }
- if strings.Contains(partLine, "procedure ") {
- endStr := "end;"
- sql += strings.TrimSpace(partLine[:strings.Index(partLine, endStr)+len(endStr)])
- fmt.Println("带有procedure key :", sql)
- texts += sql
- texts += "\n"
- isQueryOrInsert(db, sql, &tableUpperPartTemp)
- sql = ""
- break
- }
- 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)
- }
- //删除当前用户的所有表
- // tableNames := dbBase.QueryUserTableName(db, "select table_name from user_tables ")
- // dbBase.ExecDorpTable(db, tableNames)
- }
- // 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.Runimage(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 strings.Contains(sql, "<#"):
- // {
- // fmt.Printf("\nsql is 大对象插入: %s\n", sql)
- // sqlPart, files := isBlob(db, sql)
- // fmt.Println("大对象:", sqlPart)
- // retStr := dbBase.ExecFiles(db, sqlPart, files)
- // fmt.Println("大对象:", retStr)
- // var im produce.ImageInfo
- // imageRet, err := im.Runimage(retStr)
- // 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")))
- // }
- //其他语句调用exec函数
- default:
- {
- //不是大对象插入语句的处理
- //fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql)
- if strings.Contains(sql, "set session") {
- fmt.Println("执行set session")
- }
- ret := dbBase.ExecString(db, sql)
- var im produce.ImageInfo
- imageRet, err := im.Runimage(ret)
- if err != nil {
- global.Logs.Error(err)
- return
- }
- imagesList = append(imagesList, imageRet)
- tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
- now := time.Now()
- if len(sql) < 15 {
- 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")))
- break
- }
- 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 fileInsert(db *sql.DB, sql string) (string, []string) {
- questionMarksCount := utils.IsInsertBlob(sql)
- fmt.Println("questionMarksCount", questionMarksCount)
- sqlPart, filePart, err := splitBlobAndClobString(sql)
- if err != nil {
- global.Logs.Error("切分Blob语句错误", err)
- return "", nil
- }
- fmt.Printf("part1: %s\n", sqlPart)
- fmt.Printf("part2: %s\n", filePart)
- files := deleteSymbol(filePart)
- fmt.Println("isBlob")
- return sqlPart, files
- }
- func splitBlobAndClobString(input string) (string, string, error) {
- fmt.Println("splitBlobString: ", input)
- splitIndex := strings.Index(input, "<#")
- if splitIndex == -1 {
- splitIndex = strings.Index(input, "<%")
- if splitIndex == -1 {
- return "", "", fmt.Errorf("delimiter '<#' not found in the input string")
- }
- }
- part1 := strings.TrimSpace(input[:splitIndex])
- part2 := strings.TrimSpace(input[splitIndex:]) // +2 to exclude '<#'
- return part1, part2, nil
- }
- func deleteSymbol(input string) []string {
- // 去掉 <# 符号
- cleanedInput := strings.ReplaceAll(input, "<#", "")
- fmt.Println("cleanedInput: ", cleanedInput)
- cleanedInput2 := strings.ReplaceAll(cleanedInput, "<%", "")
- fmt.Println("cleanedInput2: ", cleanedInput2)
- // 按空格切割
- parts := strings.Fields(cleanedInput2)
- // 打印结果
- for _, part := range parts {
- fmt.Println(part)
- }
- return parts
- }
- // 生成word
- func generateWord(tableUpperParts1 []produce.TableUpperPart) {
- fmt.Println("调用generateWord()")
- wd := produce.Newword()
- for _, tableUpperPart := range tableUpperParts1 {
- //fmt.Printf("text: %v\n", text)
- //fmt.Println("tableUpperPart.ImagesList: ", tableUpperPart.ImagesList)
- if tableUpperPart.ImagesList == nil || len(tableUpperPart.ImagesList) == 0 {
- global.Logs.Error("图片缓存为空,退出程序")
- return
- }
- mergedImage, err := produce.MergeImages(tableUpperPart.ImagesList)
- if err != nil {
- panic(err)
- }
- wd.WriterTable(global.FileLocal, 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)
- }
|