fix: extract data using jmespath

Change-Id: Icea3b8fa7e71dd610c19c91e21a259104ab2fe30
This commit is contained in:
buyuxiang
2022-02-20 13:43:28 +08:00
parent 320e9601a7
commit c0ebe2ee53
5 changed files with 63 additions and 4 deletions

View File

@@ -1,5 +1,9 @@
# Release History
## v0.6.2 (2022-02-20)
- change: json unmarshal to json.Number when parsing data
- fix: incorrect data type when extracting data using jmespath
## v0.6.1 (2022-02-17)
- fix: set request Content-Type for posting json only when not specified

View File

@@ -119,9 +119,13 @@
},
"body": {
"foo1": "$varFoo1",
"foo2": "${max($a, $b)}"
"foo2": "${max($a, $b)}",
"time": "${get_timestamp()}"
}
},
"extract": {
"varTime": "body.form.time"
},
"validate": [
{
"check": "status_code",
@@ -142,6 +146,24 @@
"msg": "check args foo2"
}
]
},
{
"name": "final check",
"request": {
"method": "GET",
"url": "/get",
"params": {
"time": "$varTime"
}
},
"validate": [
{
"check": "body.args.time",
"assert": "length_equals",
"expect": 13,
"msg": "check extracted var timestamp"
}
]
}
]
}

View File

@@ -80,6 +80,9 @@ teststeps:
body:
foo1: $varFoo1
foo2: ${max($a, $b)}
time: ${get_timestamp()}
extract:
varTime: body.form.time
validate:
- check: status_code
assert: equals
@@ -93,3 +96,14 @@ teststeps:
assert: equals
expect: "12.3"
msg: check args foo2
- name: final check
request:
method: GET
url: /get
params:
time: $varTime
validate:
- check: body.args.time
assert: length_equals
expect: 13
msg: check extracted var timestamp

View File

@@ -69,8 +69,7 @@ func (p *parser) parseData(raw interface{}, variablesMapping map[string]interfac
case reflect.String:
// json.Number
if rawValue, ok := raw.(json.Number); ok {
// use the same rule as json.Unmarshal (float64, for JSON numbers)
return rawValue.Float64()
return parseJSONNumber(rawValue)
}
// other string
value := rawValue.String()
@@ -109,6 +108,16 @@ func (p *parser) parseData(raw interface{}, variablesMapping map[string]interfac
}
}
func parseJSONNumber(raw json.Number) (interface{}, error) {
if strings.Contains(raw.String(), ".") {
// float64
return raw.Float64()
} else {
// int64
return raw.Int64()
}
}
const (
regexVariable = `[a-zA-Z_]\w*` // variable name should start with a letter or underscore
regexFunctionName = `[a-zA-Z_]\w*` // function name should start with a letter or underscore

View File

@@ -1,6 +1,7 @@
package hrp
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
@@ -53,7 +54,9 @@ func newResponseObject(t *testing.T, parser *parser, resp *http.Response) (*resp
// convert respObjMeta to interface{}
respObjMetaBytes, _ := json.Marshal(respObjMeta)
var data interface{}
if err := json.Unmarshal(respObjMetaBytes, &data); err != nil {
decoder := json.NewDecoder(bytes.NewReader(respObjMetaBytes))
decoder.UseNumber()
if err := decoder.Decode(&data); err != nil {
log.Error().
Str("respObjMeta", string(respObjMetaBytes)).
Err(err).
@@ -167,5 +170,12 @@ func (v *responseObject) searchJmespath(expr string) interface{} {
log.Error().Str("expr", expr).Err(err).Msg("search jmespath failed")
return expr // jmespath not found, return the expression
}
if number, ok := checkValue.(json.Number); ok {
checkNumber, err := parseJSONNumber(number)
if err != nil {
log.Error().Interface("json number", number).Err(err).Msg("convert json number failed")
}
return checkNumber
}
return checkValue
}