mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-04 23:16:57 +08:00
refactor: move load json/yaml functions to internal
This commit is contained in:
+3
-64
@@ -1,56 +1,15 @@
|
|||||||
package hrp
|
package hrp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
|
|
||||||
"github.com/httprunner/httprunner/hrp/internal/json"
|
"github.com/httprunner/httprunner/hrp/internal/builtin"
|
||||||
)
|
)
|
||||||
|
|
||||||
func loadFromJSON(path string, structObj interface{}) error {
|
|
||||||
path, err := filepath.Abs(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Str("path", path).Err(err).Msg("convert absolute path failed")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info().Str("path", path).Msg("load json")
|
|
||||||
|
|
||||||
file, err := os.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("load json path failed")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
decoder := json.NewDecoder(bytes.NewReader(file))
|
|
||||||
decoder.UseNumber()
|
|
||||||
err = decoder.Decode(structObj)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadFromYAML(path string, structObj interface{}) error {
|
|
||||||
path, err := filepath.Abs(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Str("path", path).Err(err).Msg("convert absolute path failed")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info().Str("path", path).Msg("load yaml")
|
|
||||||
|
|
||||||
file, err := os.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("load yaml path failed")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = yaml.Unmarshal(file, structObj)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertCompatValidator(Validators []interface{}) (err error) {
|
func convertCompatValidator(Validators []interface{}) (err error) {
|
||||||
for i, iValidator := range Validators {
|
for i, iValidator := range Validators {
|
||||||
validatorMap := iValidator.(map[string]interface{})
|
validatorMap := iValidator.(map[string]interface{})
|
||||||
@@ -192,18 +151,8 @@ func (path *APIPath) ToString() string {
|
|||||||
|
|
||||||
func (path *APIPath) ToAPI() (*API, error) {
|
func (path *APIPath) ToAPI() (*API, error) {
|
||||||
api := &API{}
|
api := &API{}
|
||||||
var err error
|
|
||||||
|
|
||||||
apiPath := path.ToString()
|
apiPath := path.ToString()
|
||||||
ext := filepath.Ext(apiPath)
|
err := builtin.LoadFile(apiPath, api)
|
||||||
switch ext {
|
|
||||||
case ".json":
|
|
||||||
err = loadFromJSON(apiPath, api)
|
|
||||||
case ".yaml", ".yml":
|
|
||||||
err = loadFromYAML(apiPath, api)
|
|
||||||
default:
|
|
||||||
err = ErrUnsupportedFileExt
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -220,18 +169,8 @@ func (path *TestCasePath) ToString() string {
|
|||||||
|
|
||||||
func (path *TestCasePath) ToTestCase() (*TestCase, error) {
|
func (path *TestCasePath) ToTestCase() (*TestCase, error) {
|
||||||
tc := &TCase{}
|
tc := &TCase{}
|
||||||
var err error
|
|
||||||
|
|
||||||
casePath := path.ToString()
|
casePath := path.ToString()
|
||||||
ext := filepath.Ext(casePath)
|
err := builtin.LoadFile(casePath, tc)
|
||||||
switch ext {
|
|
||||||
case ".json":
|
|
||||||
err = loadFromJSON(casePath, tc)
|
|
||||||
case ".yaml", ".yml":
|
|
||||||
err = loadFromYAML(casePath, tc)
|
|
||||||
default:
|
|
||||||
err = ErrUnsupportedFileExt
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -4,6 +4,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/httprunner/httprunner/hrp/internal/builtin"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -18,11 +20,11 @@ var (
|
|||||||
func TestLoadCase(t *testing.T) {
|
func TestLoadCase(t *testing.T) {
|
||||||
tcJSON := &TCase{}
|
tcJSON := &TCase{}
|
||||||
tcYAML := &TCase{}
|
tcYAML := &TCase{}
|
||||||
err := loadFromJSON(demoTestCaseJSONPath.ToString(), tcJSON)
|
err := builtin.LoadFile(demoTestCaseJSONPath.ToString(), tcJSON)
|
||||||
if !assert.NoError(t, err) {
|
if !assert.NoError(t, err) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
err = loadFromYAML(demoTestCaseYAMLPath.ToString(), tcYAML)
|
err = builtin.LoadFile(demoTestCaseYAMLPath.ToString(), tcYAML)
|
||||||
if !assert.NoError(t, err) {
|
if !assert.NoError(t, err) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,36 +62,6 @@ func MD5(str string) string {
|
|||||||
return hex.EncodeToString(hasher.Sum(nil))
|
return hex.EncodeToString(hasher.Sum(nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadFromCSV(path string) []map[string]interface{} {
|
|
||||||
path, err := filepath.Abs(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Str("path", path).Err(err).Msg("convert absolute path failed")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
log.Info().Str("path", path).Msg("load csv file")
|
|
||||||
|
|
||||||
file, err := os.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("load csv file failed")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
r := csv.NewReader(strings.NewReader(string(file)))
|
|
||||||
content, err := r.ReadAll()
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("parse csv file failed")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
var result []map[string]interface{}
|
|
||||||
for i := 1; i < len(content); i++ {
|
|
||||||
row := make(map[string]interface{})
|
|
||||||
for j := 0; j < len(content[i]); j++ {
|
|
||||||
row[content[0][j]] = content[i][j]
|
|
||||||
}
|
|
||||||
result = append(result, row)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func Dump2JSON(data interface{}, path string) error {
|
func Dump2JSON(data interface{}, path string) error {
|
||||||
path, err := filepath.Abs(path)
|
path, err := filepath.Abs(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -258,3 +228,68 @@ func Interface2Float64(i interface{}) (float64, error) {
|
|||||||
}
|
}
|
||||||
return 0, errors.New("failed to convert interface to float64")
|
return 0, errors.New("failed to convert interface to float64")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrUnsupportedFileExt = fmt.Errorf("unsupported file extension")
|
||||||
|
|
||||||
|
func LoadFile(path string, structObj interface{}) (err error) {
|
||||||
|
log.Info().Str("path", path).Msg("load file")
|
||||||
|
file, err := readFile(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("read file failed")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ext := filepath.Ext(path)
|
||||||
|
switch ext {
|
||||||
|
case ".json":
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(file))
|
||||||
|
decoder.UseNumber()
|
||||||
|
err = decoder.Decode(structObj)
|
||||||
|
case ".yaml", ".yml":
|
||||||
|
err = yaml.Unmarshal(file, structObj)
|
||||||
|
default:
|
||||||
|
err = ErrUnsupportedFileExt
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadFromCSV(path string) []map[string]interface{} {
|
||||||
|
log.Info().Str("path", path).Msg("load csv file")
|
||||||
|
file, err := readFile(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("read csv file failed")
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
r := csv.NewReader(strings.NewReader(string(file)))
|
||||||
|
content, err := r.ReadAll()
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("parse csv file failed")
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
var result []map[string]interface{}
|
||||||
|
for i := 1; i < len(content); i++ {
|
||||||
|
row := make(map[string]interface{})
|
||||||
|
for j := 0; j < len(content[i]); j++ {
|
||||||
|
row[content[0][j]] = content[i][j]
|
||||||
|
}
|
||||||
|
result = append(result, row)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func readFile(path string) ([]byte, error) {
|
||||||
|
var err error
|
||||||
|
path, err = filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Str("path", path).Msg("convert absolute path failed")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("read file failed")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return file, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user