From 5c2be8d5482e1b09f39fa6369d59e033e8b286eb Mon Sep 17 00:00:00 2001 From: xucong053 Date: Fri, 27 May 2022 11:20:21 +0800 Subject: [PATCH] feat: support v3 format debugtalk.py when executing hrp run/boom --- docs/cmd/hrp.md | 1 + .../demo-with-go-plugin/plugin/debugtalk.go | 14 +- .../demo-with-go-plugin/testcases/demo.json | 8 +- .../testcases/ref_testcase.yml | 2 +- .../testcases/requests.json | 8 +- .../testcases/requests.yml | 8 +- examples/demo-with-no-fungo/.gitignore | 15 ++ examples/demo-with-no-fungo/har/.keep | 0 .../demo-with-no-fungo/plugin/debugtalk.go | 10 +- .../demo-with-no-fungo/testcases/demo.json | 176 ++++++++++++++++++ .../testcases/ref_testcase.yml | 33 ++++ .../testcases/requests.json | 138 ++++++++++++++ .../demo-with-no-fungo/testcases/requests.yml | 65 +++++++ examples/demo-with-no-funppy/.gitignore | 15 ++ .../demo-with-no-funppy/debugtalk.py | 4 + examples/demo-with-no-funppy/har/.keep | 0 .../demo-with-no-funppy/testcases/demo.json | 176 ++++++++++++++++++ .../testcases/ref_testcase.yml | 33 ++++ .../testcases/requests.json | 138 ++++++++++++++ .../testcases/requests.yml | 65 +++++++ hrp/boomer_test.go | 2 +- hrp/internal/build/main.go | 4 +- hrp/internal/build/main_test.go | 30 ++- hrp/internal/builtin/utils.go | 8 +- .../scaffold/templates/plugin/debugtalk.go | 14 +- .../testcases/demo_go_ref_testcase.yml | 33 ++++ .../templates/testcases/demo_go_requests.json | 138 ++++++++++++++ .../templates/testcases/demo_go_requests.yml | 65 +++++++ .../testcases/demo_go_with_funplugin.json | 176 ++++++++++++++++++ hrp/plugin.go | 23 ++- hrp/runner_test.go | 50 +++-- hrp/testcase_test.go | 1 + 32 files changed, 1386 insertions(+), 67 deletions(-) create mode 100644 examples/demo-with-no-fungo/.gitignore create mode 100644 examples/demo-with-no-fungo/har/.keep rename hrp/internal/build/examples/debugtalk_no_fungo.go => examples/demo-with-no-fungo/plugin/debugtalk.go (93%) create mode 100644 examples/demo-with-no-fungo/testcases/demo.json create mode 100644 examples/demo-with-no-fungo/testcases/ref_testcase.yml create mode 100644 examples/demo-with-no-fungo/testcases/requests.json create mode 100644 examples/demo-with-no-fungo/testcases/requests.yml create mode 100644 examples/demo-with-no-funppy/.gitignore rename hrp/internal/build/examples/debugtalk_no_funppy.py => examples/demo-with-no-funppy/debugtalk.py (94%) create mode 100644 examples/demo-with-no-funppy/har/.keep create mode 100644 examples/demo-with-no-funppy/testcases/demo.json create mode 100644 examples/demo-with-no-funppy/testcases/ref_testcase.yml create mode 100644 examples/demo-with-no-funppy/testcases/requests.json create mode 100644 examples/demo-with-no-funppy/testcases/requests.yml create mode 100644 hrp/internal/scaffold/templates/testcases/demo_go_ref_testcase.yml create mode 100644 hrp/internal/scaffold/templates/testcases/demo_go_requests.json create mode 100644 hrp/internal/scaffold/templates/testcases/demo_go_requests.yml create mode 100644 hrp/internal/scaffold/templates/testcases/demo_go_with_funplugin.json diff --git a/docs/cmd/hrp.md b/docs/cmd/hrp.md index c9499319..ce9ba71c 100644 --- a/docs/cmd/hrp.md +++ b/docs/cmd/hrp.md @@ -31,6 +31,7 @@ Copyright 2017 debugtalk * [hrp boom](hrp_boom.md) - run load test with boomer * [hrp convert](hrp_convert.md) - convert to JSON/YAML/gotest/pytest testcases +* [hrp build](hrp_build.md) - build plugin for testing * [hrp har2case](hrp_har2case.md) - convert HAR to json/yaml testcase files * [hrp pytest](hrp_pytest.md) - run API test with pytest * [hrp run](hrp_run.md) - run API test with go engine diff --git a/examples/demo-with-go-plugin/plugin/debugtalk.go b/examples/demo-with-go-plugin/plugin/debugtalk.go index b3b39400..3995ea24 100644 --- a/examples/demo-with-go-plugin/plugin/debugtalk.go +++ b/examples/demo-with-go-plugin/plugin/debugtalk.go @@ -46,12 +46,12 @@ func GetVersion() string { } func main() { - fungo.Register("get_version", GetVersion) - fungo.Register("sum_ints", SumInts) - fungo.Register("sum_two_int", SumTwoInt) - fungo.Register("sum_two", SumTwoInt) - fungo.Register("sum", Sum) - fungo.Register("setup_hook_example", SetupHookExample) - fungo.Register("teardown_hook_example", TeardownHookExample) + fungo.Register("GetVersion", GetVersion) + fungo.Register("SumInts", SumInts) + fungo.Register("SumTwoInt", SumTwoInt) + fungo.Register("SumTwoInt", SumTwoInt) + fungo.Register("Sum", Sum) + fungo.Register("SetupHookExample", SetupHookExample) + fungo.Register("TeardownHookExample", TeardownHookExample) fungo.Serve() } diff --git a/examples/demo-with-go-plugin/testcases/demo.json b/examples/demo-with-go-plugin/testcases/demo.json index 1bb63ed8..0af40519 100644 --- a/examples/demo-with-go-plugin/testcases/demo.json +++ b/examples/demo-with-go-plugin/testcases/demo.json @@ -3,9 +3,9 @@ "name": "demo with complex mechanisms", "base_url": "https://postman-echo.com", "variables": { - "a": "${sum(10, 2.3)}", + "a": "${Sum(10, 2.3)}", "b": 3.45, - "n": "${sum_ints(1, 2, 2)}", + "n": "${SumInts(1, 2, 2)}", "varFoo1": "${gen_random_string($n)}", "varFoo2": "${max($a, $b)}" } @@ -38,10 +38,10 @@ "varFoo2": "${max($a, $b)}" }, "setup_hooks": [ - "${setup_hook_example($name)}" + "${SetupHookExample($name)}" ], "teardown_hooks": [ - "${teardown_hook_example($name)}" + "${TeardownHookExample($name)}" ], "extract": { "varFoo1": "body.args.foo1" diff --git a/examples/demo-with-go-plugin/testcases/ref_testcase.yml b/examples/demo-with-go-plugin/testcases/ref_testcase.yml index 0816481c..010133cf 100644 --- a/examples/demo-with-go-plugin/testcases/ref_testcase.yml +++ b/examples/demo-with-go-plugin/testcases/ref_testcase.yml @@ -24,7 +24,7 @@ teststeps: method: POST url: /post headers: - User-Agent: funplugin/${get_version()} + User-Agent: funplugin/${GetVersion()} Content-Type: "application/x-www-form-urlencoded" body: "foo1=$foo1&foo2=$foo3" validate: diff --git a/examples/demo-with-go-plugin/testcases/requests.json b/examples/demo-with-go-plugin/testcases/requests.json index 162632b4..d4dcb276 100644 --- a/examples/demo-with-go-plugin/testcases/requests.json +++ b/examples/demo-with-go-plugin/testcases/requests.json @@ -19,7 +19,7 @@ "variables": { "foo1": "${ENV(USERNAME)}", "foo2": "bar21", - "sum_v": "${sum_two_int(1, 2)}" + "sum_v": "${SumTwoInt(1, 2)}" }, "request": { "method": "GET", @@ -30,7 +30,7 @@ "sum_v": "$sum_v" }, "headers": { - "User-Agent": "funplugin/${get_version()}" + "User-Agent": "funplugin/${GetVersion()}" } }, "extract": { @@ -73,7 +73,7 @@ "method": "POST", "url": "/post", "headers": { - "User-Agent": "funplugin/${get_version()}", + "User-Agent": "funplugin/${GetVersion()}", "Content-Type": "text/plain" }, "body": "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." @@ -102,7 +102,7 @@ "method": "POST", "url": "/post", "headers": { - "User-Agent": "funplugin/${get_version()}", + "User-Agent": "funplugin/${GetVersion()}", "Content-Type": "application/x-www-form-urlencoded" }, "body": "foo1=$foo1&foo2=$foo2&foo3=$foo3" diff --git a/examples/demo-with-go-plugin/testcases/requests.yml b/examples/demo-with-go-plugin/testcases/requests.yml index 034dbefb..add3a28d 100644 --- a/examples/demo-with-go-plugin/testcases/requests.yml +++ b/examples/demo-with-go-plugin/testcases/requests.yml @@ -14,7 +14,7 @@ teststeps: variables: foo1: ${ENV(USERNAME)} foo2: bar21 - sum_v: "${sum_two_int(1, 2)}" + sum_v: "${SumTwoInt(1, 2)}" request: method: GET url: $base_url/get @@ -23,7 +23,7 @@ teststeps: foo2: $foo2 sum_v: $sum_v headers: - User-Agent: funplugin/${get_version()} + User-Agent: funplugin/${GetVersion()} extract: foo3: "body.args.foo2" validate: @@ -40,7 +40,7 @@ teststeps: method: POST url: $base_url/post headers: - User-Agent: funplugin/${get_version()} + User-Agent: funplugin/${GetVersion()} Content-Type: "text/plain" body: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." validate: @@ -54,7 +54,7 @@ teststeps: method: POST url: $base_url/post headers: - User-Agent: funplugin/${get_version()} + User-Agent: funplugin/${GetVersion()} Content-Type: "application/x-www-form-urlencoded" body: "foo1=$foo1&foo2=$foo2&foo3=$foo3" validate: diff --git a/examples/demo-with-no-fungo/.gitignore b/examples/demo-with-no-fungo/.gitignore new file mode 100644 index 00000000..33401380 --- /dev/null +++ b/examples/demo-with-no-fungo/.gitignore @@ -0,0 +1,15 @@ +.env +reports/ +*.so +.vscode/ +.idea/ +.DS_Store +output/ +__pycache__/ +*.pyc +.python-version +logs/ + +# plugin +debugtalk.bin +debugtalk.so diff --git a/examples/demo-with-no-fungo/har/.keep b/examples/demo-with-no-fungo/har/.keep new file mode 100644 index 00000000..e69de29b diff --git a/hrp/internal/build/examples/debugtalk_no_fungo.go b/examples/demo-with-no-fungo/plugin/debugtalk.go similarity index 93% rename from hrp/internal/build/examples/debugtalk_no_fungo.go rename to examples/demo-with-no-fungo/plugin/debugtalk.go index 12d5ce57..5810e0e4 100644 --- a/hrp/internal/build/examples/debugtalk_no_fungo.go +++ b/examples/demo-with-no-fungo/plugin/debugtalk.go @@ -1,10 +1,12 @@ -package examples +package main import ( "fmt" ) -import "os" +func init() { + fmt.Println("init") +} func SumTwoInt(a, b int) int { return a + b @@ -40,7 +42,3 @@ func SetupHookExample(args string) string { func TeardownHookExample(args string) string { return fmt.Sprintf("step name: %v, teardown...", args) } - -func init() { - _, _ = os.Getwd() -} diff --git a/examples/demo-with-no-fungo/testcases/demo.json b/examples/demo-with-no-fungo/testcases/demo.json new file mode 100644 index 00000000..a127d26d --- /dev/null +++ b/examples/demo-with-no-fungo/testcases/demo.json @@ -0,0 +1,176 @@ +{ + "config": { + "name": "demo with complex mechanisms", + "base_url": "https://postman-echo.com", + "variables": { + "a": "${Sum(10, 2.3)}", + "b": 3.45, + "n": "${SumInts(1, 2, 2)}", + "varFoo1": "${GenRandomString($n)}", + "varFoo2": "${Max($a, $b)}" + } + }, + "teststeps": [ + { + "name": "transaction 1 start", + "transaction": { + "name": "tran1", + "type": "start" + } + }, + { + "name": "get with params", + "request": { + "method": "GET", + "url": "/get", + "params": { + "foo1": "$varFoo1", + "foo2": "$varFoo2" + }, + "headers": { + "User-Agent": "HttpRunnerPlus" + } + }, + "variables": { + "b": 34.5, + "n": 3, + "name": "get with params", + "varFoo2": "${Max($a, $b)}" + }, + "setup_hooks": [ + "${SetupHookExample($name)}" + ], + "teardown_hooks": [ + "${TeardownHookExample($name)}" + ], + "extract": { + "varFoo1": "body.args.foo1" + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check response status code" + }, + { + "check": "headers.\"Content-Type\"", + "assert": "startswith", + "expect": "application/json" + }, + { + "check": "body.args.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "$varFoo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.args.foo2", + "assert": "equals", + "expect": "34.5", + "msg": "check args foo2" + } + ] + }, + { + "name": "transaction 1 end", + "transaction": { + "name": "tran1", + "type": "end" + } + }, + { + "name": "post json data", + "request": { + "method": "POST", + "url": "/post", + "body": { + "foo1": "$varFoo1", + "foo2": "${Max($a, $b)}" + } + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check status code" + }, + { + "check": "body.json.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.json.foo2", + "assert": "equals", + "expect": 12.3, + "msg": "check args foo2" + } + ] + }, + { + "name": "post form data", + "request": { + "method": "POST", + "url": "/post", + "headers": { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + }, + "body": { + "foo1": "$varFoo1", + "foo2": "${Max($a, $b)}", + "time": "${GetTimestamp()}" + } + }, + "extract": { + "varTime": "body.form.time" + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check status code" + }, + { + "check": "body.form.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.form.foo2", + "assert": "equals", + "expect": "12.3", + "msg": "check args foo2" + } + ] + }, + { + "name": "get with timestamp", + "request": { + "method": "GET", + "url": "/get", + "params": { + "time": "$varTime" + } + }, + "validate": [ + { + "check": "body.args.time", + "assert": "length_equals", + "expect": 13, + "msg": "check extracted var timestamp" + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/demo-with-no-fungo/testcases/ref_testcase.yml b/examples/demo-with-no-fungo/testcases/ref_testcase.yml new file mode 100644 index 00000000..957dbdd4 --- /dev/null +++ b/examples/demo-with-no-fungo/testcases/ref_testcase.yml @@ -0,0 +1,33 @@ +config: + name: "request methods testcase: reference testcase" + variables: + foo1: testsuite_config_bar1 + expect_foo1: testsuite_config_bar1 + expect_foo2: config_bar2 + base_url: "https://postman-echo.com" + verify: False + +teststeps: +- + name: request with functions + variables: + foo1: testcase_ref_bar1 + expect_foo1: testcase_ref_bar1 + testcase: testcases/requests.yml + export: + - foo3 +- + name: post form data + variables: + foo1: bar1 + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${GetVersion()} + Content-Type: "application/x-www-form-urlencoded" + data: "foo1=$foo1&foo2=$foo3" + validate: + - eq: ["status_code", 200] + - eq: ["body.form.foo1", "bar1"] + - eq: ["body.form.foo2", "bar21"] diff --git a/examples/demo-with-no-fungo/testcases/requests.json b/examples/demo-with-no-fungo/testcases/requests.json new file mode 100644 index 00000000..f54e6340 --- /dev/null +++ b/examples/demo-with-no-fungo/testcases/requests.json @@ -0,0 +1,138 @@ +{ + "config": { + "name": "request methods testcase with functions", + "variables": { + "foo1": "config_bar1", + "foo2": "config_bar2", + "expect_foo1": "config_bar1", + "expect_foo2": "config_bar2" + }, + "base_url": "https://postman-echo.com", + "verify": false, + "export": [ + "foo3" + ] + }, + "teststeps": [ + { + "name": "get with params", + "variables": { + "foo1": "bar11", + "foo2": "bar21", + "sum_v": "${SumTwoInt(1, 2)}" + }, + "request": { + "method": "GET", + "url": "/get", + "params": { + "foo1": "$foo1", + "foo2": "$foo2", + "sum_v": "$sum_v" + }, + "headers": { + "User-Agent": "funplugin/${GetVersion()}" + } + }, + "extract": { + "foo3": "body.args.foo2" + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.args.foo1", + "bar11" + ] + }, + { + "eq": [ + "body.args.sum_v", + "3" + ] + }, + { + "eq": [ + "body.args.foo2", + "bar21" + ] + } + ] + }, + { + "name": "post raw text", + "variables": { + "foo1": "bar12", + "foo3": "bar32" + }, + "request": { + "method": "POST", + "url": "/post", + "headers": { + "User-Agent": "funplugin/${GetVersion()}", + "Content-Type": "text/plain" + }, + "data": "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.data", + "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32." + ] + } + ] + }, + { + "name": "post form data", + "variables": { + "foo2": "bar23" + }, + "request": { + "method": "POST", + "url": "/post", + "headers": { + "User-Agent": "funplugin/${GetVersion()}", + "Content-Type": "application/x-www-form-urlencoded" + }, + "data": "foo1=$foo1&foo2=$foo2&foo3=$foo3" + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.form.foo1", + "$expect_foo1" + ] + }, + { + "eq": [ + "body.form.foo2", + "bar23" + ] + }, + { + "eq": [ + "body.form.foo3", + "bar21" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/demo-with-no-fungo/testcases/requests.yml b/examples/demo-with-no-fungo/testcases/requests.yml new file mode 100644 index 00000000..7884588f --- /dev/null +++ b/examples/demo-with-no-fungo/testcases/requests.yml @@ -0,0 +1,65 @@ +config: + name: "request methods testcase with functions" + variables: + foo1: config_bar1 + foo2: config_bar2 + expect_foo1: config_bar1 + expect_foo2: config_bar2 + base_url: "https://postman-echo.com" + verify: False + export: ["foo3"] + +teststeps: +- + name: get with params + variables: + foo1: bar11 + foo2: bar21 + sum_v: "${SumTwoInt(1, 2)}" + request: + method: GET + url: /get + params: + foo1: $foo1 + foo2: $foo2 + sum_v: $sum_v + headers: + User-Agent: funplugin/${GetVersion()} + extract: + foo3: "body.args.foo2" + validate: + - eq: ["status_code", 200] + - eq: ["body.args.foo1", "bar11"] + - eq: ["body.args.sum_v", "3"] + - eq: ["body.args.foo2", "bar21"] +- + name: post raw text + variables: + foo1: "bar12" + foo3: "bar32" + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${GetVersion()} + Content-Type: "text/plain" + data: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." + validate: + - eq: ["status_code", 200] + - eq: ["body.data", "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32."] +- + name: post form data + variables: + foo2: bar23 + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${GetVersion()} + Content-Type: "application/x-www-form-urlencoded" + data: "foo1=$foo1&foo2=$foo2&foo3=$foo3" + validate: + - eq: ["status_code", 200] + - eq: ["body.form.foo1", "$expect_foo1"] + - eq: ["body.form.foo2", "bar23"] + - eq: ["body.form.foo3", "bar21"] diff --git a/examples/demo-with-no-funppy/.gitignore b/examples/demo-with-no-funppy/.gitignore new file mode 100644 index 00000000..33401380 --- /dev/null +++ b/examples/demo-with-no-funppy/.gitignore @@ -0,0 +1,15 @@ +.env +reports/ +*.so +.vscode/ +.idea/ +.DS_Store +output/ +__pycache__/ +*.pyc +.python-version +logs/ + +# plugin +debugtalk.bin +debugtalk.so diff --git a/hrp/internal/build/examples/debugtalk_no_funppy.py b/examples/demo-with-no-funppy/debugtalk.py similarity index 94% rename from hrp/internal/build/examples/debugtalk_no_funppy.py rename to examples/demo-with-no-funppy/debugtalk.py index 370206d6..8d93ae1f 100644 --- a/hrp/internal/build/examples/debugtalk_no_funppy.py +++ b/examples/demo-with-no-funppy/debugtalk.py @@ -3,6 +3,10 @@ import time from typing import List +def get_version(): + return "httprunner v4.0" + + def sleep(n_secs): time.sleep(n_secs) diff --git a/examples/demo-with-no-funppy/har/.keep b/examples/demo-with-no-funppy/har/.keep new file mode 100644 index 00000000..e69de29b diff --git a/examples/demo-with-no-funppy/testcases/demo.json b/examples/demo-with-no-funppy/testcases/demo.json new file mode 100644 index 00000000..1bb63ed8 --- /dev/null +++ b/examples/demo-with-no-funppy/testcases/demo.json @@ -0,0 +1,176 @@ +{ + "config": { + "name": "demo with complex mechanisms", + "base_url": "https://postman-echo.com", + "variables": { + "a": "${sum(10, 2.3)}", + "b": 3.45, + "n": "${sum_ints(1, 2, 2)}", + "varFoo1": "${gen_random_string($n)}", + "varFoo2": "${max($a, $b)}" + } + }, + "teststeps": [ + { + "name": "transaction 1 start", + "transaction": { + "name": "tran1", + "type": "start" + } + }, + { + "name": "get with params", + "request": { + "method": "GET", + "url": "/get", + "params": { + "foo1": "$varFoo1", + "foo2": "$varFoo2" + }, + "headers": { + "User-Agent": "HttpRunnerPlus" + } + }, + "variables": { + "b": 34.5, + "n": 3, + "name": "get with params", + "varFoo2": "${max($a, $b)}" + }, + "setup_hooks": [ + "${setup_hook_example($name)}" + ], + "teardown_hooks": [ + "${teardown_hook_example($name)}" + ], + "extract": { + "varFoo1": "body.args.foo1" + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check response status code" + }, + { + "check": "headers.\"Content-Type\"", + "assert": "startswith", + "expect": "application/json" + }, + { + "check": "body.args.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "$varFoo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.args.foo2", + "assert": "equals", + "expect": "34.5", + "msg": "check args foo2" + } + ] + }, + { + "name": "transaction 1 end", + "transaction": { + "name": "tran1", + "type": "end" + } + }, + { + "name": "post json data", + "request": { + "method": "POST", + "url": "/post", + "body": { + "foo1": "$varFoo1", + "foo2": "${max($a, $b)}" + } + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check status code" + }, + { + "check": "body.json.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.json.foo2", + "assert": "equals", + "expect": 12.3, + "msg": "check args foo2" + } + ] + }, + { + "name": "post form data", + "request": { + "method": "POST", + "url": "/post", + "headers": { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + }, + "body": { + "foo1": "$varFoo1", + "foo2": "${max($a, $b)}", + "time": "${get_timestamp()}" + } + }, + "extract": { + "varTime": "body.form.time" + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check status code" + }, + { + "check": "body.form.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.form.foo2", + "assert": "equals", + "expect": "12.3", + "msg": "check args foo2" + } + ] + }, + { + "name": "get with timestamp", + "request": { + "method": "GET", + "url": "/get", + "params": { + "time": "$varTime" + } + }, + "validate": [ + { + "check": "body.args.time", + "assert": "length_equals", + "expect": 13, + "msg": "check extracted var timestamp" + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/demo-with-no-funppy/testcases/ref_testcase.yml b/examples/demo-with-no-funppy/testcases/ref_testcase.yml new file mode 100644 index 00000000..6cf32323 --- /dev/null +++ b/examples/demo-with-no-funppy/testcases/ref_testcase.yml @@ -0,0 +1,33 @@ +config: + name: "request methods testcase: reference testcase" + variables: + foo1: testsuite_config_bar1 + expect_foo1: testsuite_config_bar1 + expect_foo2: config_bar2 + base_url: "https://postman-echo.com" + verify: False + +teststeps: +- + name: request with functions + variables: + foo1: testcase_ref_bar1 + expect_foo1: testcase_ref_bar1 + testcase: testcases/requests.yml + export: + - foo3 +- + name: post form data + variables: + foo1: bar1 + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${get_version()} + Content-Type: "application/x-www-form-urlencoded" + data: "foo1=$foo1&foo2=$foo3" + validate: + - eq: ["status_code", 200] + - eq: ["body.form.foo1", "bar1"] + - eq: ["body.form.foo2", "bar21"] diff --git a/examples/demo-with-no-funppy/testcases/requests.json b/examples/demo-with-no-funppy/testcases/requests.json new file mode 100644 index 00000000..b13f3837 --- /dev/null +++ b/examples/demo-with-no-funppy/testcases/requests.json @@ -0,0 +1,138 @@ +{ + "config": { + "name": "request methods testcase with functions", + "variables": { + "foo1": "config_bar1", + "foo2": "config_bar2", + "expect_foo1": "config_bar1", + "expect_foo2": "config_bar2" + }, + "base_url": "https://postman-echo.com", + "verify": false, + "export": [ + "foo3" + ] + }, + "teststeps": [ + { + "name": "get with params", + "variables": { + "foo1": "bar11", + "foo2": "bar21", + "sum_v": "${sum_two_int(1, 2)}" + }, + "request": { + "method": "GET", + "url": "/get", + "params": { + "foo1": "$foo1", + "foo2": "$foo2", + "sum_v": "$sum_v" + }, + "headers": { + "User-Agent": "funplugin/${get_version()}" + } + }, + "extract": { + "foo3": "body.args.foo2" + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.args.foo1", + "bar11" + ] + }, + { + "eq": [ + "body.args.sum_v", + "3" + ] + }, + { + "eq": [ + "body.args.foo2", + "bar21" + ] + } + ] + }, + { + "name": "post raw text", + "variables": { + "foo1": "bar12", + "foo3": "bar32" + }, + "request": { + "method": "POST", + "url": "/post", + "headers": { + "User-Agent": "funplugin/${get_version()}", + "Content-Type": "text/plain" + }, + "data": "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.data", + "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32." + ] + } + ] + }, + { + "name": "post form data", + "variables": { + "foo2": "bar23" + }, + "request": { + "method": "POST", + "url": "/post", + "headers": { + "User-Agent": "funplugin/${get_version()}", + "Content-Type": "application/x-www-form-urlencoded" + }, + "data": "foo1=$foo1&foo2=$foo2&foo3=$foo3" + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.form.foo1", + "$expect_foo1" + ] + }, + { + "eq": [ + "body.form.foo2", + "bar23" + ] + }, + { + "eq": [ + "body.form.foo3", + "bar21" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/demo-with-no-funppy/testcases/requests.yml b/examples/demo-with-no-funppy/testcases/requests.yml new file mode 100644 index 00000000..86d1b9cc --- /dev/null +++ b/examples/demo-with-no-funppy/testcases/requests.yml @@ -0,0 +1,65 @@ +config: + name: "request methods testcase with functions" + variables: + foo1: config_bar1 + foo2: config_bar2 + expect_foo1: config_bar1 + expect_foo2: config_bar2 + base_url: "https://postman-echo.com" + verify: False + export: ["foo3"] + +teststeps: +- + name: get with params + variables: + foo1: bar11 + foo2: bar21 + sum_v: "${sum_two_int(1, 2)}" + request: + method: GET + url: /get + params: + foo1: $foo1 + foo2: $foo2 + sum_v: $sum_v + headers: + User-Agent: funplugin/${get_version()} + extract: + foo3: "body.args.foo2" + validate: + - eq: ["status_code", 200] + - eq: ["body.args.foo1", "bar11"] + - eq: ["body.args.sum_v", "3"] + - eq: ["body.args.foo2", "bar21"] +- + name: post raw text + variables: + foo1: "bar12" + foo3: "bar32" + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${get_version()} + Content-Type: "text/plain" + data: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." + validate: + - eq: ["status_code", 200] + - eq: ["body.data", "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32."] +- + name: post form data + variables: + foo2: bar23 + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${get_version()} + Content-Type: "application/x-www-form-urlencoded" + data: "foo1=$foo1&foo2=$foo2&foo3=$foo3" + validate: + - eq: ["status_code", 200] + - eq: ["body.form.foo1", "$expect_foo1"] + - eq: ["body.form.foo2", "bar23"] + - eq: ["body.form.foo3", "bar21"] diff --git a/hrp/boomer_test.go b/hrp/boomer_test.go index 4edefa38..b70fc832 100644 --- a/hrp/boomer_test.go +++ b/hrp/boomer_test.go @@ -25,7 +25,7 @@ func TestBoomerStandaloneRun(t *testing.T) { NewStep("TestCase3").CallRefCase(&TestCase{Config: NewConfig("TestCase3")}), }, } - testcase2 := &demoTestCaseWithPluginJSONPath + testcase2 := &demoTestCaseWithGoPluginJSONPath b := NewBoomer(2, 1) go b.Run(testcase1, testcase2) diff --git a/hrp/internal/build/main.go b/hrp/internal/build/main.go index 811801ab..39c2e92a 100644 --- a/hrp/internal/build/main.go +++ b/hrp/internal/build/main.go @@ -62,7 +62,7 @@ func (t *TemplateContent) parseGoContent(path string) error { originalContent := string(content) // parse imports - importSlice := t.Regexps.Import.FindAllStringSubmatch(originalContent, -1) + importSlice := t.Regexps.Imports.FindAllStringSubmatch(originalContent, -1) if len(importSlice) != 0 { imports := strings.Replace(importSlice[0][1], "\t", "", -1) for _, elem := range strings.Split(imports, "\n") { @@ -70,7 +70,7 @@ func (t *TemplateContent) parseGoContent(path string) error { } } // parse import - importSlice = t.Regexps.Imports.FindAllStringSubmatch(originalContent, -1) + importSlice = t.Regexps.Import.FindAllStringSubmatch(originalContent, -1) if len(importSlice) != 0 { for _, elem := range importSlice { t.Imports = append(t.Imports, strings.TrimSpace(elem[1])) diff --git a/hrp/internal/build/main_test.go b/hrp/internal/build/main_test.go index a169c77a..b26109a2 100644 --- a/hrp/internal/build/main_test.go +++ b/hrp/internal/build/main_test.go @@ -1,29 +1,51 @@ package build import ( + "github.com/httprunner/httprunner/v4/hrp/internal/builtin" + "regexp" "testing" "github.com/stretchr/testify/assert" ) func TestRun(t *testing.T) { - err := Run("examples/debugtalk_no_funppy.py", "") + err := Run("../../../examples/demo-with-no-fungo/plugin/debugtalk.go", "") if !assert.Nil(t, err) { t.Fatal() } - err = Run("examples/debugtalk_no_fungo.go", "") + err = Run("../../../examples/demo-with-no-funppy/debugtalk.py", "") if !assert.Nil(t, err) { t.Fatal() } - err = Run("examples/debugtalk_no_funppy.py", "./debugtalk.py") + err = Run("../../../examples/demo-with-no-fungo/plugin/debugtalk.go", "./debugtalk_gen.bin") if !assert.Nil(t, err) { t.Fatal() } - err = Run("examples/debugtalk_no_fungo.go", "./debugtalk_gen.bin") + err = Run("../../../examples/demo-with-no-funppy/debugtalk.py", "./debugtalk_gen.py") if !assert.Nil(t, err) { t.Fatal() } + + contentBytes, err := builtin.ReadFile("./debugtalk_gen.py") + if !assert.Nil(t, err) { + t.Fatal() + } + + content := string(contentBytes) + if !assert.Contains(t, content, "import funppy") { + t.Fatal() + } + + if !assert.Contains(t, content, "funppy.register") { + t.Fatal() + } + + reg, _ := regexp.Compile(`funppy\.register`) + matchedSlice := reg.FindAllStringSubmatch(content, -1) + if !assert.Len(t, matchedSlice, 10) { + t.Fatal() + } } diff --git a/hrp/internal/builtin/utils.go b/hrp/internal/builtin/utils.go index d4920084..09176168 100644 --- a/hrp/internal/builtin/utils.go +++ b/hrp/internal/builtin/utils.go @@ -281,7 +281,7 @@ var ErrUnsupportedFileExt = fmt.Errorf("unsupported file extension") // LoadFile loads file content with file extension and assigns to structObj func LoadFile(path string, structObj interface{}) (err error) { log.Info().Str("path", path).Msg("load file") - file, err := readFile(path) + file, err := ReadFile(path) if err != nil { return errors.Wrap(err, "read file failed") } @@ -335,7 +335,7 @@ func parseEnvContent(file []byte, obj interface{}) error { func loadFromCSV(path string) []map[string]interface{} { log.Info().Str("path", path).Msg("load csv file") - file, err := readFile(path) + file, err := ReadFile(path) if err != nil { log.Error().Err(err).Msg("read csv file failed") os.Exit(1) @@ -361,7 +361,7 @@ func loadFromCSV(path string) []map[string]interface{} { func loadMessage(path string) []byte { log.Info().Str("path", path).Msg("load message file") - file, err := readFile(path) + file, err := ReadFile(path) if err != nil { log.Error().Err(err).Msg("read message file failed") os.Exit(1) @@ -369,7 +369,7 @@ func loadMessage(path string) []byte { return file } -func readFile(path string) ([]byte, error) { +func ReadFile(path string) ([]byte, error) { var err error path, err = filepath.Abs(path) if err != nil { diff --git a/hrp/internal/scaffold/templates/plugin/debugtalk.go b/hrp/internal/scaffold/templates/plugin/debugtalk.go index b3b39400..3995ea24 100644 --- a/hrp/internal/scaffold/templates/plugin/debugtalk.go +++ b/hrp/internal/scaffold/templates/plugin/debugtalk.go @@ -46,12 +46,12 @@ func GetVersion() string { } func main() { - fungo.Register("get_version", GetVersion) - fungo.Register("sum_ints", SumInts) - fungo.Register("sum_two_int", SumTwoInt) - fungo.Register("sum_two", SumTwoInt) - fungo.Register("sum", Sum) - fungo.Register("setup_hook_example", SetupHookExample) - fungo.Register("teardown_hook_example", TeardownHookExample) + fungo.Register("GetVersion", GetVersion) + fungo.Register("SumInts", SumInts) + fungo.Register("SumTwoInt", SumTwoInt) + fungo.Register("SumTwoInt", SumTwoInt) + fungo.Register("Sum", Sum) + fungo.Register("SetupHookExample", SetupHookExample) + fungo.Register("TeardownHookExample", TeardownHookExample) fungo.Serve() } diff --git a/hrp/internal/scaffold/templates/testcases/demo_go_ref_testcase.yml b/hrp/internal/scaffold/templates/testcases/demo_go_ref_testcase.yml new file mode 100644 index 00000000..957dbdd4 --- /dev/null +++ b/hrp/internal/scaffold/templates/testcases/demo_go_ref_testcase.yml @@ -0,0 +1,33 @@ +config: + name: "request methods testcase: reference testcase" + variables: + foo1: testsuite_config_bar1 + expect_foo1: testsuite_config_bar1 + expect_foo2: config_bar2 + base_url: "https://postman-echo.com" + verify: False + +teststeps: +- + name: request with functions + variables: + foo1: testcase_ref_bar1 + expect_foo1: testcase_ref_bar1 + testcase: testcases/requests.yml + export: + - foo3 +- + name: post form data + variables: + foo1: bar1 + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${GetVersion()} + Content-Type: "application/x-www-form-urlencoded" + data: "foo1=$foo1&foo2=$foo3" + validate: + - eq: ["status_code", 200] + - eq: ["body.form.foo1", "bar1"] + - eq: ["body.form.foo2", "bar21"] diff --git a/hrp/internal/scaffold/templates/testcases/demo_go_requests.json b/hrp/internal/scaffold/templates/testcases/demo_go_requests.json new file mode 100644 index 00000000..f54e6340 --- /dev/null +++ b/hrp/internal/scaffold/templates/testcases/demo_go_requests.json @@ -0,0 +1,138 @@ +{ + "config": { + "name": "request methods testcase with functions", + "variables": { + "foo1": "config_bar1", + "foo2": "config_bar2", + "expect_foo1": "config_bar1", + "expect_foo2": "config_bar2" + }, + "base_url": "https://postman-echo.com", + "verify": false, + "export": [ + "foo3" + ] + }, + "teststeps": [ + { + "name": "get with params", + "variables": { + "foo1": "bar11", + "foo2": "bar21", + "sum_v": "${SumTwoInt(1, 2)}" + }, + "request": { + "method": "GET", + "url": "/get", + "params": { + "foo1": "$foo1", + "foo2": "$foo2", + "sum_v": "$sum_v" + }, + "headers": { + "User-Agent": "funplugin/${GetVersion()}" + } + }, + "extract": { + "foo3": "body.args.foo2" + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.args.foo1", + "bar11" + ] + }, + { + "eq": [ + "body.args.sum_v", + "3" + ] + }, + { + "eq": [ + "body.args.foo2", + "bar21" + ] + } + ] + }, + { + "name": "post raw text", + "variables": { + "foo1": "bar12", + "foo3": "bar32" + }, + "request": { + "method": "POST", + "url": "/post", + "headers": { + "User-Agent": "funplugin/${GetVersion()}", + "Content-Type": "text/plain" + }, + "data": "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.data", + "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32." + ] + } + ] + }, + { + "name": "post form data", + "variables": { + "foo2": "bar23" + }, + "request": { + "method": "POST", + "url": "/post", + "headers": { + "User-Agent": "funplugin/${GetVersion()}", + "Content-Type": "application/x-www-form-urlencoded" + }, + "data": "foo1=$foo1&foo2=$foo2&foo3=$foo3" + }, + "validate": [ + { + "eq": [ + "status_code", + 200 + ] + }, + { + "eq": [ + "body.form.foo1", + "$expect_foo1" + ] + }, + { + "eq": [ + "body.form.foo2", + "bar23" + ] + }, + { + "eq": [ + "body.form.foo3", + "bar21" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/hrp/internal/scaffold/templates/testcases/demo_go_requests.yml b/hrp/internal/scaffold/templates/testcases/demo_go_requests.yml new file mode 100644 index 00000000..7884588f --- /dev/null +++ b/hrp/internal/scaffold/templates/testcases/demo_go_requests.yml @@ -0,0 +1,65 @@ +config: + name: "request methods testcase with functions" + variables: + foo1: config_bar1 + foo2: config_bar2 + expect_foo1: config_bar1 + expect_foo2: config_bar2 + base_url: "https://postman-echo.com" + verify: False + export: ["foo3"] + +teststeps: +- + name: get with params + variables: + foo1: bar11 + foo2: bar21 + sum_v: "${SumTwoInt(1, 2)}" + request: + method: GET + url: /get + params: + foo1: $foo1 + foo2: $foo2 + sum_v: $sum_v + headers: + User-Agent: funplugin/${GetVersion()} + extract: + foo3: "body.args.foo2" + validate: + - eq: ["status_code", 200] + - eq: ["body.args.foo1", "bar11"] + - eq: ["body.args.sum_v", "3"] + - eq: ["body.args.foo2", "bar21"] +- + name: post raw text + variables: + foo1: "bar12" + foo3: "bar32" + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${GetVersion()} + Content-Type: "text/plain" + data: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3." + validate: + - eq: ["status_code", 200] + - eq: ["body.data", "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32."] +- + name: post form data + variables: + foo2: bar23 + request: + method: POST + url: /post + headers: + User-Agent: funplugin/${GetVersion()} + Content-Type: "application/x-www-form-urlencoded" + data: "foo1=$foo1&foo2=$foo2&foo3=$foo3" + validate: + - eq: ["status_code", 200] + - eq: ["body.form.foo1", "$expect_foo1"] + - eq: ["body.form.foo2", "bar23"] + - eq: ["body.form.foo3", "bar21"] diff --git a/hrp/internal/scaffold/templates/testcases/demo_go_with_funplugin.json b/hrp/internal/scaffold/templates/testcases/demo_go_with_funplugin.json new file mode 100644 index 00000000..0af40519 --- /dev/null +++ b/hrp/internal/scaffold/templates/testcases/demo_go_with_funplugin.json @@ -0,0 +1,176 @@ +{ + "config": { + "name": "demo with complex mechanisms", + "base_url": "https://postman-echo.com", + "variables": { + "a": "${Sum(10, 2.3)}", + "b": 3.45, + "n": "${SumInts(1, 2, 2)}", + "varFoo1": "${gen_random_string($n)}", + "varFoo2": "${max($a, $b)}" + } + }, + "teststeps": [ + { + "name": "transaction 1 start", + "transaction": { + "name": "tran1", + "type": "start" + } + }, + { + "name": "get with params", + "request": { + "method": "GET", + "url": "/get", + "params": { + "foo1": "$varFoo1", + "foo2": "$varFoo2" + }, + "headers": { + "User-Agent": "HttpRunnerPlus" + } + }, + "variables": { + "b": 34.5, + "n": 3, + "name": "get with params", + "varFoo2": "${max($a, $b)}" + }, + "setup_hooks": [ + "${SetupHookExample($name)}" + ], + "teardown_hooks": [ + "${TeardownHookExample($name)}" + ], + "extract": { + "varFoo1": "body.args.foo1" + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check response status code" + }, + { + "check": "headers.\"Content-Type\"", + "assert": "startswith", + "expect": "application/json" + }, + { + "check": "body.args.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "$varFoo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.args.foo2", + "assert": "equals", + "expect": "34.5", + "msg": "check args foo2" + } + ] + }, + { + "name": "transaction 1 end", + "transaction": { + "name": "tran1", + "type": "end" + } + }, + { + "name": "post json data", + "request": { + "method": "POST", + "url": "/post", + "body": { + "foo1": "$varFoo1", + "foo2": "${max($a, $b)}" + } + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check status code" + }, + { + "check": "body.json.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.json.foo2", + "assert": "equals", + "expect": 12.3, + "msg": "check args foo2" + } + ] + }, + { + "name": "post form data", + "request": { + "method": "POST", + "url": "/post", + "headers": { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" + }, + "body": { + "foo1": "$varFoo1", + "foo2": "${max($a, $b)}", + "time": "${get_timestamp()}" + } + }, + "extract": { + "varTime": "body.form.time" + }, + "validate": [ + { + "check": "status_code", + "assert": "equals", + "expect": 200, + "msg": "check status code" + }, + { + "check": "body.form.foo1", + "assert": "length_equals", + "expect": 5, + "msg": "check args foo1" + }, + { + "check": "body.form.foo2", + "assert": "equals", + "expect": "12.3", + "msg": "check args foo2" + } + ] + }, + { + "name": "get with timestamp", + "request": { + "method": "GET", + "url": "/get", + "params": { + "time": "$varTime" + } + }, + "validate": [ + { + "check": "body.args.time", + "assert": "length_equals", + "expect": 13, + "msg": "check extracted var timestamp" + } + ] + } + ] +} \ No newline at end of file diff --git a/hrp/plugin.go b/hrp/plugin.go index 004fc1cb..72d6767d 100644 --- a/hrp/plugin.go +++ b/hrp/plugin.go @@ -2,9 +2,11 @@ package hrp import ( "fmt" + "github.com/httprunner/httprunner/v4/hrp/internal/build" "os" "os/signal" "path/filepath" + "strings" "syscall" "github.com/httprunner/funplugin" @@ -32,6 +34,21 @@ func initPlugin(path string, logOn bool) (plugin funplugin.IPlugin, pluginDir st // TODO: move pluginDir to funplugin pluginDir = filepath.Dir(pluginPath) + // compatible the format of debugtalk.py with v2/v3 + ext := filepath.Ext(pluginPath) + if ext == ".py" { + // skip if only debugtalk_gen.py exists + if !strings.HasSuffix(pluginPath, "debugtalk_gen.py") { + genPyPluginPath := filepath.Join(pluginDir, "debugtalk_gen.py") + err = build.Run(pluginPath, genPyPluginPath) + if err != nil { + log.Error().Err(err).Msgf(fmt.Sprintf("failed to build %s", pluginPath)) + return + } + pluginPath = genPyPluginPath + } + } + // found plugin file plugin, err = funplugin.Init(pluginPath, funplugin.WithLogOn(logOn)) if err != nil { @@ -62,19 +79,19 @@ func initPlugin(path string, logOn bool) (plugin funplugin.IPlugin, pluginDir st } func locatePlugin(path string) (pluginPath string, err error) { - // priority: hashicorp plugin (debugtalk.bin > debugtalk_gen.py > debugtalk.py) > go plugin (debugtalk.so) + // priority: hashicorp plugin (debugtalk.bin > debugtalk.py > debugtalk_gen.py) > go plugin (debugtalk.so) pluginPath, err = locateFile(path, hashicorpGoPluginFile) if err == nil { return } - pluginPath, err = locateFile(path, hashicorpPyPluginFile) + pluginPath, err = locateFile(path, debugtalkPyFile) if err == nil { return } - pluginPath, err = locateFile(path, debugtalkPyFile) + pluginPath, err = locateFile(path, hashicorpPyPluginFile) if err == nil { return } diff --git a/hrp/runner_test.go b/hrp/runner_test.go index d03f8d75..4c043090 100644 --- a/hrp/runner_test.go +++ b/hrp/runner_test.go @@ -8,14 +8,22 @@ import ( "github.com/rs/zerolog/log" "github.com/stretchr/testify/assert" - "github.com/httprunner/httprunner/v4/hrp/internal/builtin" + "github.com/httprunner/httprunner/v4/hrp/internal/build" "github.com/httprunner/httprunner/v4/hrp/internal/scaffold" ) +func buildHashicorpGoPluginWithNoFungo() { + log.Info().Msg("[init] build hashicorp go plugin") + err := build.Run(templatesDir+"noplugin/debugtalk.go", templatesDir+"debugtalk.bin") + if err != nil { + log.Error().Err(err).Msg("build hashicorp go plugin failed") + os.Exit(1) + } +} + func buildHashicorpGoPlugin() { log.Info().Msg("[init] build hashicorp go plugin") - err := builtin.ExecCommand("go", "build", - "-o", templatesDir+"debugtalk.bin", templatesDir+"plugin/debugtalk.go") + err := build.Run(templatesDir+"noplugin/debugtalk.go", templatesDir+"debugtalk.bin") if err != nil { log.Error().Err(err).Msg("build hashicorp go plugin failed") os.Exit(1) @@ -30,7 +38,7 @@ func removeHashicorpGoPlugin() { func buildHashicorpPyPlugin() { log.Info().Msg("[init] prepare hashicorp python plugin") pluginFile := templatesDir + "debugtalk.py" - err := scaffold.CopyFile("templates/plugin/debugtalk.py", pluginFile) + err := scaffold.CopyFile("templates/noplugin/debugtalk.py", pluginFile) if err != nil { log.Error().Err(err).Msg("build hashicorp python plugin failed") os.Exit(1) @@ -39,24 +47,14 @@ func buildHashicorpPyPlugin() { func removeHashicorpPyPlugin() { log.Info().Msg("[teardown] remove hashicorp python plugin") - os.Remove(templatesDir + "debugtalk.py") + // on v4.1^, running case will generate debugtalk_gen.py used by python plugin + os.Remove(templatesDir + "debugtalk_gen.py") } func TestRunCaseWithGoPlugin(t *testing.T) { buildHashicorpGoPlugin() defer removeHashicorpGoPlugin() - assertRunTestCases(t) -} - -func TestRunCaseWithPythonPlugin(t *testing.T) { - buildHashicorpPyPlugin() - defer removeHashicorpPyPlugin() - - assertRunTestCases(t) -} - -func assertRunTestCases(t *testing.T) { testcase1 := &TestCase{ Config: NewConfig("TestCase1"). SetBaseURL("http://httpbin.org"), @@ -83,7 +81,7 @@ func assertRunTestCases(t *testing.T) { }, }, ), - NewStep("testcase1-step4").CallRefCase(&demoTestCaseWithPluginJSONPath), + NewStep("testcase1-step4").CallRefCase(&demoTestCaseWithGoPluginJSONPath), }, } testcase2 := &TestCase{ @@ -98,6 +96,18 @@ func assertRunTestCases(t *testing.T) { } } +func TestRunCaseWithPythonPlugin(t *testing.T) { + buildHashicorpPyPlugin() + defer removeHashicorpPyPlugin() + + r := NewRunner(t) + r.SetPluginLogOn() + err := r.Run(&demoTestCaseWithPluginJSONPath) + if err != nil { + t.Fatalf("run testcase error: %v", err) + } +} + func TestRunCaseWithThinkTime(t *testing.T) { buildHashicorpGoPlugin() defer removeHashicorpGoPlugin() @@ -160,15 +170,15 @@ func TestRunCaseWithPluginJSON(t *testing.T) { buildHashicorpGoPlugin() defer removeHashicorpGoPlugin() - err := NewRunner(nil).Run(&demoTestCaseWithPluginJSONPath) // hrp.Run(testCase) + err := NewRunner(nil).Run(&demoTestCaseWithGoPluginJSONPath) // hrp.Run(testCase) if err != nil { t.Fatal() } } func TestRunCaseWithPluginYAML(t *testing.T) { - buildHashicorpGoPlugin() - defer removeHashicorpGoPlugin() + buildHashicorpPyPlugin() + defer removeHashicorpPyPlugin() err := NewRunner(nil).Run(&demoTestCaseWithPluginYAMLPath) // hrp.Run(testCase) if err != nil { diff --git a/hrp/testcase_test.go b/hrp/testcase_test.go index eb6a69ae..6564612e 100644 --- a/hrp/testcase_test.go +++ b/hrp/testcase_test.go @@ -15,6 +15,7 @@ const ( var ( demoTestCaseWithPluginJSONPath TestCasePath = templatesDir + "testcases/demo_with_funplugin.json" + demoTestCaseWithGoPluginJSONPath TestCasePath = templatesDir + "testcases/demo_go_with_funplugin.json" demoTestCaseWithPluginYAMLPath TestCasePath = templatesDir + "testcases/demo_with_funplugin.yaml" demoTestCaseWithoutPluginJSONPath TestCasePath = templatesDir + "testcases/demo_without_funplugin.json" demoTestCaseWithoutPluginYAMLPath TestCasePath = templatesDir + "testcases/demo_without_funplugin.yaml"