提取器用于从执行结果中提取想要的数据。
标准写法
标准写法支持所有的提取器实现类。
yml
name: extract 标准写法
steps:
- name: 标准写法
noop: 1
extract:
- jsonpath:
refName: "id"
expression: '$.id'
target: '{"id": "abc"}'
validate:
- equalTo: ['${id}', "abc"]
name: extract 标准写法
steps:
- name: 标准写法
noop: 1
extract:
- jsonpath:
refName: "id"
expression: '$.id'
target: '{"id": "abc"}'
validate:
- equalTo: ['${id}', "abc"]
java
@Test
public void testJava_1() {
noopWith("提取器写法", noop -> noop
.extract(extract -> extract
.jsonpath("id", "$.id", params -> params.target("{\"id\": \"abc\"}")))
.validate(validate -> validate
.equalTo("${id}", "abc")));
}
@Test
public void testJava_1() {
noopWith("提取器写法", noop -> noop
.extract(extract -> extract
.jsonpath("id", "$.id", params -> params.target("{\"id\": \"abc\"}")))
.validate(validate -> validate
.equalTo("${id}", "abc")));
}
groovy
@Test
void testGroovy() {
noopWith("提取器写法") {
extract {
jsonpath 'id', '$.id', { target '{"id": "abc"}' }
}
validate {
equalTo '${id}', 'abc'
}
}
}
@Test
void testGroovy() {
noopWith("提取器写法") {
extract {
jsonpath 'id', '$.id', { target '{"id": "abc"}' }
}
validate {
equalTo '${id}', 'abc'
}
}
}
位置参数写法
位置参数写法仅适用于标准处理器(StandardExtractor),三个位置参数依次为:变量名、表达式、提取参数(即其他属性)。
yml
name: extract 位置参数写法
steps:
- name: 位置参数写法
noop: 1
extract:
- jsonpath: ["id", '$.id', {target: '{"id": "abc"}'} ]
validate:
- equalTo: ['${id}', "abc"]
name: extract 位置参数写法
steps:
- name: 位置参数写法
noop: 1
extract:
- jsonpath: ["id", '$.id', {target: '{"id": "abc"}'} ]
validate:
- equalTo: ['${id}', "abc"]
Java 和 Groovy 用例写法同上面的例子,代码风格用例的写法由 Builder 提供的方法决定。
提取变量、默认值和作用域
代码风格用例支持两种提取变量,配置风格用例仅支持第一种(refName)。
refName
属性用于 Groot 变量机制,默认作用域为ALL
。ref
属性用于编程语言的变量机制(不需要提取作用域)。Ref 的使用不是线程安全的,不要共用 Ref 对象。
java
@Test
public void testJava_1() {
noopWith("refName 写法", noop -> noop
.extract(extract -> extract
.jsonpath("id", "$.id", params -> params.target("{\"id\": \"abc\"}")))
.validate(validate -> validate
.equalTo("${id}", "abc")));
}
@Test
public void testJava_2() {
Ref<String> id = ref();
noopWith("ref 写法", noop -> noop
.extract(extract -> extract
.jsonpath(id, "$.id", params -> params.target("{\"id\": \"abc\"}")))
.validate(validate -> validate
.equalTo(id.value, "abc")));
assert Objects.equals(id.value, "abc");
}
@Test
public void testJava_1() {
noopWith("refName 写法", noop -> noop
.extract(extract -> extract
.jsonpath("id", "$.id", params -> params.target("{\"id\": \"abc\"}")))
.validate(validate -> validate
.equalTo("${id}", "abc")));
}
@Test
public void testJava_2() {
Ref<String> id = ref();
noopWith("ref 写法", noop -> noop
.extract(extract -> extract
.jsonpath(id, "$.id", params -> params.target("{\"id\": \"abc\"}")))
.validate(validate -> validate
.equalTo(id.value, "abc")));
assert Objects.equals(id.value, "abc");
}
groovy
@Test
void testGroovy_1() {
noopWith("refName 写法") {
extract {
jsonpath 'id', '$.id', { target '{"id": "abc"}' }
}
validate {
equalTo '${id}', 'abc'
}
}
}
@Test
void testGroovy_2() {
Ref<String> id = ref("")
noopWith("ref 写法") {
extract {
jsonpath id, '$.id', { target '{"id": "abc"}' }
}
validate {
equalTo id.value, 'abc'
}
}
assert Objects.equals(id.value, "abc")
}
@Test
void testGroovy_1() {
noopWith("refName 写法") {
extract {
jsonpath 'id', '$.id', { target '{"id": "abc"}' }
}
validate {
equalTo '${id}', 'abc'
}
}
}
@Test
void testGroovy_2() {
Ref<String> id = ref("")
noopWith("ref 写法") {
extract {
jsonpath id, '$.id', { target '{"id": "abc"}' }
}
validate {
equalTo id.value, 'abc'
}
}
assert Objects.equals(id.value, "abc")
}
refName 写法支持提取作用域(ExtractScope),可用的作用域为:
java
GLOBAL("global"), // 提取变量为全局变量
ENVIRONMENT("environment"), // 提取变量为环境变量
TEST("test"), // 提取变量为用例组变量
SESSION("session"), // 提取变量为用例变量
LOCAL("local"), // 提取变量为局部变量(当前元件所在层级)
ALL("all"); // 默认作用域,如果向上找到已存在变量,则赋值给该变量,否则退化为 LOCAL 变量
GLOBAL("global"), // 提取变量为全局变量
ENVIRONMENT("environment"), // 提取变量为环境变量
TEST("test"), // 提取变量为用例组变量
SESSION("session"), // 提取变量为用例变量
LOCAL("local"), // 提取变量为局部变量(当前元件所在层级)
ALL("all"); // 默认作用域,如果向上找到已存在变量,则赋值给该变量,否则退化为 LOCAL 变量
refName 写法提取作用域示例。
yml
name: refName 写法提取作用域测试
steps:
- name: 提取作用域测试
noop: 1
extract:
- jsonpath: ["id", '$.id', {target: '{"id": "abc"}', scope: "session"} ]
validate:
- equalTo: ['${sVars.id}', "abc"]
name: refName 写法提取作用域测试
steps:
- name: 提取作用域测试
noop: 1
extract:
- jsonpath: ["id", '$.id', {target: '{"id": "abc"}', scope: "session"} ]
validate:
- equalTo: ['${sVars.id}', "abc"]
java
@Test
public void testJava_1_1() {
noopWith("refName 写法", noop -> noop
.extract(extract -> extract
.jsonpath("id", "$.id", params -> params.target("{\"id\": \"abc\"}").scope(ExtractScope.SESSION)))
.validate(validate -> validate
.equalTo("${id}", "abc")));
assert Objects.equals(sv("id"), "abc");
}
@Test
public void testJava_1_1() {
noopWith("refName 写法", noop -> noop
.extract(extract -> extract
.jsonpath("id", "$.id", params -> params.target("{\"id\": \"abc\"}").scope(ExtractScope.SESSION)))
.validate(validate -> validate
.equalTo("${id}", "abc")));
assert Objects.equals(sv("id"), "abc");
}
groovy
@Test
void testGroovy_1_1() {
noopWith("refName 写法") {
extract {
jsonpath 'id', '$.id', { target '{"id": "abc"}' scope ExtractScope.SESSION }
}
validate {
equalTo '${id}', 'abc'
}
}
assert Objects.equals(sv("id"), "abc")
}
@Test
void testGroovy_1_1() {
noopWith("refName 写法") {
extract {
jsonpath 'id', '$.id', { target '{"id": "abc"}' scope ExtractScope.SESSION }
}
validate {
equalTo '${id}', 'abc'
}
}
assert Objects.equals(sv("id"), "abc")
}
refName 和 ref 写法都支持默认值,和 scope 类似,通过提取参数设置默认值。