HttpRunner+ is the next generation of HttpRunner, written in golang

Overview

hrp (HttpRunner+)

Go Reference Github Actions codecov Go Report Card FOSSA Status

hrp is a golang implementation of HttpRunner. Ideally, hrp will be fully compatible with HttpRunner, including testcase format and usage. What's more, hrp will integrate Boomer natively to be a better load generator for locust.

Key Features

flow chart

  • Full support for HTTP(S) requests, more protocols are also in the plan.
  • Testcases can be described in multiple formats, YAML/JSON/Golang, and they are interchangeable.
  • With HAR support, you can use Charles/Fiddler/Chrome/etc as a script recording generator.
  • Supports variables/extract/validate/hooks mechanisms to create extremely complex test scenarios.
  • Built-in integration of rich functions, and you can also use go plugin to create and call custom functions.
  • Inherit all powerful features of Boomer and locust, you can run load test without extra work.
  • Use it as a CLI tool or as a library are both supported.

Quick Start

Install

$ go get -u github.com/httprunner/hrp

Examples

This is an example of HttpRunner+ testcase. You can find more in the examples directory.

import (
    "testing"

    "github.com/httprunner/hrp"
)

func TestCaseDemo(t *testing.T) {
    testcase := &hrp.TestCase{
        Config: hrp.TConfig{
            Name:    "demo with complex mechanisms",
            BaseURL: "https://postman-echo.com",
            Variables: map[string]interface{}{ // global level variables
                "n":       5,
                "a":       12.3,
                "b":       3.45,
                "varFoo1": "${gen_random_string($n)}",
                "varFoo2": "${max($a, $b)}", // 12.3; eval with built-in function
            },
        },
        TestSteps: []hrp.IStep{
            hrp.Step("get with params").
                WithVariables(map[string]interface{}{ // step level variables
                    "n":       3,                // inherit config level variables if not set in step level, a/varFoo1
                    "b":       34.5,             // override config level variable if existed, n/b/varFoo2
                    "varFoo2": "${max($a, $b)}", // 34.5; override variable b and eval again
                }).
                GET("/get").
                WithParams(map[string]interface{}{"foo1": "$varFoo1", "foo2": "$varFoo2"}). // request with params
                WithHeaders(map[string]string{"User-Agent": "HttpRunnerPlus"}).             // request with headers
                Extract().
                WithJmesPath("body.args.foo1", "varFoo1"). // extract variable with jmespath
                Validate().
                AssertEqual("status_code", 200, "check response status code").        // validate response status code
                AssertStartsWith("headers.\"Content-Type\"", "application/json", ""). // validate response header
                AssertLengthEqual("body.args.foo1", 5, "check args foo1").            // validate response body with jmespath
                AssertLengthEqual("$varFoo1", 5, "check args foo1").                  // assert with extracted variable from current step
                AssertEqual("body.args.foo2", "34.5", "check args foo2"),             // notice: request params value will be converted to string
            hrp.Step("post json data").
                POST("/post").
                WithBody(map[string]interface{}{
                    "foo1": "$varFoo1",       // reference former extracted variable
                    "foo2": "${max($a, $b)}", // 12.3; step level variables are independent, variable b is 3.45 here
                }).
                Validate().
                AssertEqual("status_code", 200, "check status code").
                AssertLengthEqual("body.json.foo1", 5, "check args foo1").
                AssertEqual("body.json.foo2", 12.3, "check args foo2"),
            hrp.Step("post form data").
                POST("/post").
                WithParams(map[string]interface{}{
                    "foo1": "$varFoo1",       // reference former extracted variable
                    "foo2": "${max($a, $b)}", // 12.3; step level variables are independent, variable b is 3.45 here
                }).
                Validate().
                AssertEqual("status_code", 200, "check status code").
                AssertLengthEqual("body.form.foo1", 5, "check args foo1").
                AssertEqual("body.form.foo2", "12.3", "check args foo2"), // form data will be converted to string
        },
    }

    err := hrp.Run(t, testcase)
    if err != nil {
        t.Fatalf("run testcase error: %v", err)
    }
}
Issues
  • feat: support think time for load testing #120

    feat: support think time for load testing #120

    支持思考时间,思考时间可选策略:

    1. 忽略用例中的思考时间
    2. 保持用例中的思考时间
    3. 在所设置的思考时间前后百分比的区间内随机取值作为该步的思考时间[min, max]
    4. 可设置思考时间的系数,对用例中的思考时间进行放缩

    注:如果设置limit参数,且值>0,则将限制以上策略最大思考时间为limit所设置值

    用例新增改变:

    1. 在用例config中新增字段:
    "think_time": {
                "strategy": "random_random_percentage",
                "setting": {
                    "min_percentage": 1,
                    "max_percentage": 1.5
                },  //根据策略限制类型,”random“策略时值为一个长度为2的slice,其余为整形、浮点型、数字字符串皆可,在解析配置时做类型校验转换
                "limit": 4
    },
    
    1. 测试步中新增步:
    {
              "name": "",
              "think_time": {
                  "name": "think time 1",
                  "time": 3
              }
    },
    

    说明:以上配置将限制思考时间在3-4秒之间

    opened by xucong053 1
  • feat: support api layer and global headers for testcase #94 #95

    feat: support api layer and global headers for testcase #94 #95

    feat: support global headers for testcase #95 feat: support API layer for testcase #94 feat: support referenced testcase by using specify testcase path in testcase script and override testcase config fix: decode failed when content-encoding is deflate fix: unstable RPS when high concurrency load testing

    opened by xucong053 1
  • feat: support customized setup/teardown hooks

    feat: support customized setup/teardown hooks

    Main Changes

    • support customized setup/teardown hooks (variable assignment not supported)
    • add setup_hook and teardown_hook demo function to the scaffold project go-plugin
    opened by bbx-winner 1
  • Update har2case.go

    Update har2case.go

    1、Fix har2caseCmd.Flags().BoolVarP(&genYAMLFlag, "to-yaml", "y", false, "convert to YAML format") -> JSON -> YAML 2、Change json flag detault to true 3、Fix Special circumstances

    opened by ZhouYixun 1
  • fix: incorrect assertion func and json number parse rule

    fix: incorrect assertion func and json number parse rule

    Main Changes

    1. fix incorrect assertion functions: greater_than, less_than, greater_or_equals, less_or_equals, adjust the sequence of parameters (actual and expected) of assertion function proto.
    2. fix incorrect json number parse rule.

    Ref: json.Unmarshal

    To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value: bool, for JSON booleans float64, for JSON numbers string, for JSON strings []interface{}, for JSON arrays map[string]interface{}, for JSON objects nil for JSON null

    1. fix panic when Assertions map key not found.
    2. fix unittest bad cases.
    opened by bbx-winner 1
  • feat: generate html reports for API testing #74

    feat: generate html reports for API testing #74

    for example: ./hrp run examples/parameters_test.json --gen-html-report --continue-on-failure report效果示例: image 点击log按钮获取详情:

    • request and response image
    • validators and statistics image 点击traceback按钮获取详情: image
    opened by xucong053 1
  • feat: record execution data for report #25

    feat: record execution data for report #25

    1. 新增记录执行数据-->summary.json
    2. 附加修复request中的url部分通过$符引用参数无效问题

    summary examples: python:

    {
        "success": true,
        "stat": {
            "testcases": {
                "total": 6,
                "success": 6,
                "fail": 0
            },
            "teststeps": {
                "total": 6,
                "failures": 0,
                "successes": 6
            }
        },
        "time": {
            "start_at": 1643105559.030703,
            "duration": 8.333352088928223
        },
        "platform": {
            "httprunner_version": "3.1.6",
            "python_version": "CPython 3.9.5",
            "platform": "macOS-11.6-x86_64-i386-64bit"
        },
        "details": [
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "case_id": "fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6",
                "time": {
                    "start_at": 1643105566.044075,
                    "start_at_iso_format": "2022-01-25T10:12:46.044075",
                    "duration": 1.3189170360565186
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "user_agent": "iOS/10.2",
                        "username": "test3",
                        "password": "333333"
                    },
                    "export_vars": {}
                },
                "log": "/Users/bytedance/Projects/python/github.com/httprunner/httprunner/logs/fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6.run.log",
                "records": [
                    {
                        "success": true,
                        "name": "get with params",
                        "data": {
                            "success": true,
                            "req_resps": [
                                {
                                    "request": {
                                        "method": "GET",
                                        "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1",
                                        "headers": {
                                            "User-Agent": "iOS/10.1,v1",
                                            "Accept-Encoding": "gzip, deflate, br",
                                            "Accept": "*/*",
                                            "Connection": "keep-alive",
                                            "HRUN-Request-ID": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                        },
                                        "cookies": {},
                                        "body": null
                                    },
                                    "response": {
                                        "status_code": 200,
                                        "headers": {
                                            "Date": "Tue, 25 Jan 2022 10:12:47 GMT",
                                            "Content-Type": "application/json; charset=utf-8",
                                            "Content-Length": "436",
                                            "Connection": "keep-alive",
                                            "ETag": "W/\"1b4-hR+MeFpY/lK7wXAoWxTXQbfON4I\"",
                                            "Vary": "Accept-Encoding",
                                            "set-cookie": "sails.sid=s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY; Path=/; HttpOnly"
                                        },
                                        "cookies": {
                                            "sails.sid": "s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY"
                                        },
                                        "encoding": "utf-8",
                                        "content_type": "application/json; charset=utf-8",
                                        "body": {
                                            "args": {
                                                "foo1": "test1",
                                                "foo2": "111111",
                                                "foo3": "iOS/10.1"
                                            },
                                            "headers": {
                                                "x-forwarded-proto": "https",
                                                "x-forwarded-port": "443",
                                                "host": "postman-echo.com",
                                                "x-amzn-trace-id": "Root=1-61efcd1f-0b55665f66c5397777997971",
                                                "user-agent": "iOS/10.1,v1",
                                                "accept-encoding": "gzip, deflate, br",
                                                "accept": "*/*",
                                                "hrun-request-id": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                            },
                                            "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1"
                                        }
                                    }
                                }
                            ],
                            "stat": {
                                "content_size": 0,
                                "response_time_ms": 1314.67,
                                "elapsed_ms": 310.38
                            },
                            "address": {
                                "client_ip": "10.90.206.241",
                                "client_port": 62270,
                                "server_ip": "52.6.12.176",
                                "server_port": 443
                            },
                            "validators": {
                                "validate_extractor": [
                                    {
                                        "comparator": "equal",
                                        "check": "status_code",
                                        "check_value": 200,
                                        "expect": 200,
                                        "expect_value": 200,
                                        "message": "",
                                        "check_result": "pass"
                                    }
                                ]
                            }
                        },
                        "export_vars": {}
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "case_id": "fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6",
                "time": {
                    "start_at": 1643105566.044075,
                    "start_at_iso_format": "2022-01-25T10:12:46.044075",
                    "duration": 1.3189170360565186
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "user_agent": "iOS/10.2",
                        "username": "test3",
                        "password": "333333"
                    },
                    "export_vars": {}
                },
                "log": "/Users/bytedance/Projects/python/github.com/httprunner/httprunner/logs/fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6.run.log",
                "records": [
                    {
                        "success": true,
                        "name": "get with params",
                        "data": {
                            "success": true,
                            "req_resps": [
                                {
                                    "request": {
                                        "method": "GET",
                                        "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1",
                                        "headers": {
                                            "User-Agent": "iOS/10.1,v1",
                                            "Accept-Encoding": "gzip, deflate, br",
                                            "Accept": "*/*",
                                            "Connection": "keep-alive",
                                            "HRUN-Request-ID": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                        },
                                        "cookies": {},
                                        "body": null
                                    },
                                    "response": {
                                        "status_code": 200,
                                        "headers": {
                                            "Date": "Tue, 25 Jan 2022 10:12:47 GMT",
                                            "Content-Type": "application/json; charset=utf-8",
                                            "Content-Length": "436",
                                            "Connection": "keep-alive",
                                            "ETag": "W/\"1b4-hR+MeFpY/lK7wXAoWxTXQbfON4I\"",
                                            "Vary": "Accept-Encoding",
                                            "set-cookie": "sails.sid=s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY; Path=/; HttpOnly"
                                        },
                                        "cookies": {
                                            "sails.sid": "s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY"
                                        },
                                        "encoding": "utf-8",
                                        "content_type": "application/json; charset=utf-8",
                                        "body": {
                                            "args": {
                                                "foo1": "test1",
                                                "foo2": "111111",
                                                "foo3": "iOS/10.1"
                                            },
                                            "headers": {
                                                "x-forwarded-proto": "https",
                                                "x-forwarded-port": "443",
                                                "host": "postman-echo.com",
                                                "x-amzn-trace-id": "Root=1-61efcd1f-0b55665f66c5397777997971",
                                                "user-agent": "iOS/10.1,v1",
                                                "accept-encoding": "gzip, deflate, br",
                                                "accept": "*/*",
                                                "hrun-request-id": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                            },
                                            "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1"
                                        }
                                    }
                                }
                            ],
                            "stat": {
                                "content_size": 0,
                                "response_time_ms": 1314.67,
                                "elapsed_ms": 310.38
                            },
                            "address": {
                                "client_ip": "10.90.206.241",
                                "client_port": 62270,
                                "server_ip": "52.6.12.176",
                                "server_port": 443
                            },
                            "validators": {
                                "validate_extractor": [
                                    {
                                        "comparator": "equal",
                                        "check": "status_code",
                                        "check_value": 200,
                                        "expect": 200,
                                        "expect_value": 200,
                                        "message": "",
                                        "check_result": "pass"
                                    }
                                ]
                            }
                        },
                        "export_vars": {}
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "case_id": "fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6",
                "time": {
                    "start_at": 1643105566.044075,
                    "start_at_iso_format": "2022-01-25T10:12:46.044075",
                    "duration": 1.3189170360565186
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "user_agent": "iOS/10.2",
                        "username": "test3",
                        "password": "333333"
                    },
                    "export_vars": {}
                },
                "log": "/Users/bytedance/Projects/python/github.com/httprunner/httprunner/logs/fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6.run.log",
                "records": [
                    {
                        "success": true,
                        "name": "get with params",
                        "data": {
                            "success": true,
                            "req_resps": [
                                {
                                    "request": {
                                        "method": "GET",
                                        "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1",
                                        "headers": {
                                            "User-Agent": "iOS/10.1,v1",
                                            "Accept-Encoding": "gzip, deflate, br",
                                            "Accept": "*/*",
                                            "Connection": "keep-alive",
                                            "HRUN-Request-ID": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                        },
                                        "cookies": {},
                                        "body": null
                                    },
                                    "response": {
                                        "status_code": 200,
                                        "headers": {
                                            "Date": "Tue, 25 Jan 2022 10:12:47 GMT",
                                            "Content-Type": "application/json; charset=utf-8",
                                            "Content-Length": "436",
                                            "Connection": "keep-alive",
                                            "ETag": "W/\"1b4-hR+MeFpY/lK7wXAoWxTXQbfON4I\"",
                                            "Vary": "Accept-Encoding",
                                            "set-cookie": "sails.sid=s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY; Path=/; HttpOnly"
                                        },
                                        "cookies": {
                                            "sails.sid": "s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY"
                                        },
                                        "encoding": "utf-8",
                                        "content_type": "application/json; charset=utf-8",
                                        "body": {
                                            "args": {
                                                "foo1": "test1",
                                                "foo2": "111111",
                                                "foo3": "iOS/10.1"
                                            },
                                            "headers": {
                                                "x-forwarded-proto": "https",
                                                "x-forwarded-port": "443",
                                                "host": "postman-echo.com",
                                                "x-amzn-trace-id": "Root=1-61efcd1f-0b55665f66c5397777997971",
                                                "user-agent": "iOS/10.1,v1",
                                                "accept-encoding": "gzip, deflate, br",
                                                "accept": "*/*",
                                                "hrun-request-id": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                            },
                                            "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1"
                                        }
                                    }
                                }
                            ],
                            "stat": {
                                "content_size": 0,
                                "response_time_ms": 1314.67,
                                "elapsed_ms": 310.38
                            },
                            "address": {
                                "client_ip": "10.90.206.241",
                                "client_port": 62270,
                                "server_ip": "52.6.12.176",
                                "server_port": 443
                            },
                            "validators": {
                                "validate_extractor": [
                                    {
                                        "comparator": "equal",
                                        "check": "status_code",
                                        "check_value": 200,
                                        "expect": 200,
                                        "expect_value": 200,
                                        "message": "",
                                        "check_result": "pass"
                                    }
                                ]
                            }
                        },
                        "export_vars": {}
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "case_id": "fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6",
                "time": {
                    "start_at": 1643105566.044075,
                    "start_at_iso_format": "2022-01-25T10:12:46.044075",
                    "duration": 1.3189170360565186
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "user_agent": "iOS/10.2",
                        "username": "test3",
                        "password": "333333"
                    },
                    "export_vars": {}
                },
                "log": "/Users/bytedance/Projects/python/github.com/httprunner/httprunner/logs/fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6.run.log",
                "records": [
                    {
                        "success": true,
                        "name": "get with params",
                        "data": {
                            "success": true,
                            "req_resps": [
                                {
                                    "request": {
                                        "method": "GET",
                                        "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1",
                                        "headers": {
                                            "User-Agent": "iOS/10.1,v1",
                                            "Accept-Encoding": "gzip, deflate, br",
                                            "Accept": "*/*",
                                            "Connection": "keep-alive",
                                            "HRUN-Request-ID": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                        },
                                        "cookies": {},
                                        "body": null
                                    },
                                    "response": {
                                        "status_code": 200,
                                        "headers": {
                                            "Date": "Tue, 25 Jan 2022 10:12:47 GMT",
                                            "Content-Type": "application/json; charset=utf-8",
                                            "Content-Length": "436",
                                            "Connection": "keep-alive",
                                            "ETag": "W/\"1b4-hR+MeFpY/lK7wXAoWxTXQbfON4I\"",
                                            "Vary": "Accept-Encoding",
                                            "set-cookie": "sails.sid=s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY; Path=/; HttpOnly"
                                        },
                                        "cookies": {
                                            "sails.sid": "s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY"
                                        },
                                        "encoding": "utf-8",
                                        "content_type": "application/json; charset=utf-8",
                                        "body": {
                                            "args": {
                                                "foo1": "test1",
                                                "foo2": "111111",
                                                "foo3": "iOS/10.1"
                                            },
                                            "headers": {
                                                "x-forwarded-proto": "https",
                                                "x-forwarded-port": "443",
                                                "host": "postman-echo.com",
                                                "x-amzn-trace-id": "Root=1-61efcd1f-0b55665f66c5397777997971",
                                                "user-agent": "iOS/10.1,v1",
                                                "accept-encoding": "gzip, deflate, br",
                                                "accept": "*/*",
                                                "hrun-request-id": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                            },
                                            "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1"
                                        }
                                    }
                                }
                            ],
                            "stat": {
                                "content_size": 0,
                                "response_time_ms": 1314.67,
                                "elapsed_ms": 310.38
                            },
                            "address": {
                                "client_ip": "10.90.206.241",
                                "client_port": 62270,
                                "server_ip": "52.6.12.176",
                                "server_port": 443
                            },
                            "validators": {
                                "validate_extractor": [
                                    {
                                        "comparator": "equal",
                                        "check": "status_code",
                                        "check_value": 200,
                                        "expect": 200,
                                        "expect_value": 200,
                                        "message": "",
                                        "check_result": "pass"
                                    }
                                ]
                            }
                        },
                        "export_vars": {}
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "case_id": "fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6",
                "time": {
                    "start_at": 1643105566.044075,
                    "start_at_iso_format": "2022-01-25T10:12:46.044075",
                    "duration": 1.3189170360565186
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "user_agent": "iOS/10.2",
                        "username": "test3",
                        "password": "333333"
                    },
                    "export_vars": {}
                },
                "log": "/Users/bytedance/Projects/python/github.com/httprunner/httprunner/logs/fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6.run.log",
                "records": [
                    {
                        "success": true,
                        "name": "get with params",
                        "data": {
                            "success": true,
                            "req_resps": [
                                {
                                    "request": {
                                        "method": "GET",
                                        "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1",
                                        "headers": {
                                            "User-Agent": "iOS/10.1,v1",
                                            "Accept-Encoding": "gzip, deflate, br",
                                            "Accept": "*/*",
                                            "Connection": "keep-alive",
                                            "HRUN-Request-ID": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                        },
                                        "cookies": {},
                                        "body": null
                                    },
                                    "response": {
                                        "status_code": 200,
                                        "headers": {
                                            "Date": "Tue, 25 Jan 2022 10:12:47 GMT",
                                            "Content-Type": "application/json; charset=utf-8",
                                            "Content-Length": "436",
                                            "Connection": "keep-alive",
                                            "ETag": "W/\"1b4-hR+MeFpY/lK7wXAoWxTXQbfON4I\"",
                                            "Vary": "Accept-Encoding",
                                            "set-cookie": "sails.sid=s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY; Path=/; HttpOnly"
                                        },
                                        "cookies": {
                                            "sails.sid": "s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY"
                                        },
                                        "encoding": "utf-8",
                                        "content_type": "application/json; charset=utf-8",
                                        "body": {
                                            "args": {
                                                "foo1": "test1",
                                                "foo2": "111111",
                                                "foo3": "iOS/10.1"
                                            },
                                            "headers": {
                                                "x-forwarded-proto": "https",
                                                "x-forwarded-port": "443",
                                                "host": "postman-echo.com",
                                                "x-amzn-trace-id": "Root=1-61efcd1f-0b55665f66c5397777997971",
                                                "user-agent": "iOS/10.1,v1",
                                                "accept-encoding": "gzip, deflate, br",
                                                "accept": "*/*",
                                                "hrun-request-id": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                            },
                                            "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1"
                                        }
                                    }
                                }
                            ],
                            "stat": {
                                "content_size": 0,
                                "response_time_ms": 1314.67,
                                "elapsed_ms": 310.38
                            },
                            "address": {
                                "client_ip": "10.90.206.241",
                                "client_port": 62270,
                                "server_ip": "52.6.12.176",
                                "server_port": 443
                            },
                            "validators": {
                                "validate_extractor": [
                                    {
                                        "comparator": "equal",
                                        "check": "status_code",
                                        "check_value": 200,
                                        "expect": 200,
                                        "expect_value": 200,
                                        "message": "",
                                        "check_result": "pass"
                                    }
                                ]
                            }
                        },
                        "export_vars": {}
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "case_id": "fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6",
                "time": {
                    "start_at": 1643105566.044075,
                    "start_at_iso_format": "2022-01-25T10:12:46.044075",
                    "duration": 1.3189170360565186
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "user_agent": "iOS/10.2",
                        "username": "test3",
                        "password": "333333"
                    },
                    "export_vars": {}
                },
                "log": "/Users/bytedance/Projects/python/github.com/httprunner/httprunner/logs/fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6.run.log",
                "records": [
                    {
                        "success": true,
                        "name": "get with params",
                        "data": {
                            "success": true,
                            "req_resps": [
                                {
                                    "request": {
                                        "method": "GET",
                                        "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1",
                                        "headers": {
                                            "User-Agent": "iOS/10.1,v1",
                                            "Accept-Encoding": "gzip, deflate, br",
                                            "Accept": "*/*",
                                            "Connection": "keep-alive",
                                            "HRUN-Request-ID": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                        },
                                        "cookies": {},
                                        "body": null
                                    },
                                    "response": {
                                        "status_code": 200,
                                        "headers": {
                                            "Date": "Tue, 25 Jan 2022 10:12:47 GMT",
                                            "Content-Type": "application/json; charset=utf-8",
                                            "Content-Length": "436",
                                            "Connection": "keep-alive",
                                            "ETag": "W/\"1b4-hR+MeFpY/lK7wXAoWxTXQbfON4I\"",
                                            "Vary": "Accept-Encoding",
                                            "set-cookie": "sails.sid=s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY; Path=/; HttpOnly"
                                        },
                                        "cookies": {
                                            "sails.sid": "s%3AoaXWmC-NCeSZbvEYQgMd1Pfvyale98zN.t5ViXj0LpOqJ%2BhDcpPtFsn14m4lOUXE3dfpIHOGLSBY"
                                        },
                                        "encoding": "utf-8",
                                        "content_type": "application/json; charset=utf-8",
                                        "body": {
                                            "args": {
                                                "foo1": "test1",
                                                "foo2": "111111",
                                                "foo3": "iOS/10.1"
                                            },
                                            "headers": {
                                                "x-forwarded-proto": "https",
                                                "x-forwarded-port": "443",
                                                "host": "postman-echo.com",
                                                "x-amzn-trace-id": "Root=1-61efcd1f-0b55665f66c5397777997971",
                                                "user-agent": "iOS/10.1,v1",
                                                "accept-encoding": "gzip, deflate, br",
                                                "accept": "*/*",
                                                "hrun-request-id": "HRUN-fa51f1e9-966a-4591-a46f-a2f1b8c3c6c6-566044"
                                            },
                                            "url": "https://postman-echo.com/get?foo1=test1&foo2=111111&foo3=iOS%2F10.1"
                                        }
                                    }
                                }
                            ],
                            "stat": {
                                "content_size": 0,
                                "response_time_ms": 1314.67,
                                "elapsed_ms": 310.38
                            },
                            "address": {
                                "client_ip": "10.90.206.241",
                                "client_port": 62270,
                                "server_ip": "52.6.12.176",
                                "server_port": 443
                            },
                            "validators": {
                                "validate_extractor": [
                                    {
                                        "comparator": "equal",
                                        "check": "status_code",
                                        "check_value": 200,
                                        "expect": 200,
                                        "expect_value": 200,
                                        "message": "",
                                        "check_result": "pass"
                                    }
                                ]
                            }
                        },
                        "export_vars": {}
                    }
                ]
            }
        ]
    }
    

    golang:

    {
        "success": true,
        "stat": {
            "testcases": {
                "total": 6,
                "success": 6
            },
            "teststeps": {
                "total": 6,
                "successes": 6
            }
        },
        "time": {
            "start_at": "2022-01-25T21:16:46.372972+08:00",
            "duration": 3.081289221
        },
        "platform": {
            "hrp_version": "v0.5.2",
            "go_version": "go1.16.11",
            "platform": "darwin-amd64"
        },
        "details": [
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "time": {
                    "start_at": "2022-01-25T21:16:46.373128+08:00",
                    "duration": 1.256897586
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "password": "222222",
                        "user_agent": "iOS/10.1",
                        "username": "test2"
                    },
                    "export_vars": {
                        "app_version": "v1"
                    }
                },
                "records": [
                    {
                        "name": "get with params",
                        "step_type": "request",
                        "success": true,
                        "elapsed_ms": 1256,
                        "data": {
                            "success": true,
                            "req_resps": {
                                "request": {
                                    "method": "GET",
                                    "url": "https://postman-echo.com/get",
                                    "params": {
                                        "foo1": "test2",
                                        "foo2": "222222",
                                        "foo3": "iOS/10.1"
                                    },
                                    "headers": {
                                        "User-Agent": "iOS/10.1,v1"
                                    }
                                },
                                "response": {
                                    "body": {
                                        "args": {
                                            "foo1": "test2",
                                            "foo2": "222222",
                                            "foo3": "iOS/10.1"
                                        },
                                        "headers": {
                                            "accept-encoding": "gzip",
                                            "host": "postman-echo.com",
                                            "user-agent": "iOS/10.1,v1",
                                            "x-amzn-trace-id": "Root=1-61eff83f-153326e07e826dfc184f744a",
                                            "x-forwarded-port": "443",
                                            "x-forwarded-proto": "https"
                                        },
                                        "url": "https://postman-echo.com/get?foo1=test2\u0026foo2=222222\u0026foo3=iOS%2F10.1"
                                    },
                                    "cookies": {
                                        "sails.sid": "s%3AvyCE4K8E0Pc6clzMeDHCijIkHBT3bHQk.50RiQzAUExoH6fZ9PN8%2Futbge8ivO9anacFgqyx3eGg"
                                    },
                                    "headers": {
                                        "Connection": "keep-alive",
                                        "Content-Length": "339",
                                        "Content-Type": "application/json; charset=utf-8",
                                        "Date": "Tue, 25 Jan 2022 13:16:47 GMT",
                                        "Etag": "W/\"153-IiMiM7CEs916LbYKJZV4RDJ1kzs\"",
                                        "Set-Cookie": "sails.sid=s%3AvyCE4K8E0Pc6clzMeDHCijIkHBT3bHQk.50RiQzAUExoH6fZ9PN8%2Futbge8ivO9anacFgqyx3eGg; Path=/; HttpOnly",
                                        "Vary": "Accept-Encoding"
                                    },
                                    "status_code": 200
                                }
                            },
                            "validators": [
                                {
                                    "check": 200,
                                    "expect": 200,
                                    "comparator": "equals",
                                    "check_result": "pass",
                                    "message": "check status code"
                                },
                                {
                                    "check": "iOS/10.1",
                                    "expect": "iOS/10.3",
                                    "comparator": "not_equal",
                                    "check_result": "pass",
                                    "message": "check app version"
                                }
                            ]
                        },
                        "content_size": 339,
                        "export_vars": {
                            "varFoo1": "test2"
                        }
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "time": {
                    "start_at": "2022-01-25T21:16:47.630216+08:00",
                    "duration": 0.279427926
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "password": "333333",
                        "user_agent": "iOS/10.2",
                        "username": "test3"
                    },
                    "export_vars": {
                        "app_version": "v1"
                    }
                },
                "records": [
                    {
                        "name": "get with params",
                        "step_type": "request",
                        "success": true,
                        "elapsed_ms": 278,
                        "data": {
                            "success": true,
                            "req_resps": {
                                "request": {
                                    "method": "GET",
                                    "url": "https://postman-echo.com/get",
                                    "params": {
                                        "foo1": "test3",
                                        "foo2": "333333",
                                        "foo3": "iOS/10.2"
                                    },
                                    "headers": {
                                        "User-Agent": "iOS/10.1,v1"
                                    }
                                },
                                "response": {
                                    "body": {
                                        "args": {
                                            "foo1": "test3",
                                            "foo2": "333333",
                                            "foo3": "iOS/10.2"
                                        },
                                        "headers": {
                                            "accept-encoding": "gzip",
                                            "host": "postman-echo.com",
                                            "user-agent": "iOS/10.1,v1",
                                            "x-amzn-trace-id": "Root=1-61eff83f-570465043297b14f535ac0b1",
                                            "x-forwarded-port": "443",
                                            "x-forwarded-proto": "https"
                                        },
                                        "url": "https://postman-echo.com/get?foo1=test3\u0026foo2=333333\u0026foo3=iOS%2F10.2"
                                    },
                                    "cookies": {
                                        "sails.sid": "s%3AEz9zpr6QZ1mIvx3j93vjbLdg-m7BqCBO.grdHQpmTPHLHubN5CkrMhCrRfPnO70PEixmo%2FufkojA"
                                    },
                                    "headers": {
                                        "Connection": "keep-alive",
                                        "Content-Length": "339",
                                        "Content-Type": "application/json; charset=utf-8",
                                        "Date": "Tue, 25 Jan 2022 13:16:47 GMT",
                                        "Etag": "W/\"153-jXjjQ5loclGBYP2Rddzd4GV3ZEk\"",
                                        "Set-Cookie": "sails.sid=s%3AEz9zpr6QZ1mIvx3j93vjbLdg-m7BqCBO.grdHQpmTPHLHubN5CkrMhCrRfPnO70PEixmo%2FufkojA; Path=/; HttpOnly",
                                        "Vary": "Accept-Encoding"
                                    },
                                    "status_code": 200
                                }
                            },
                            "validators": [
                                {
                                    "check": 200,
                                    "expect": 200,
                                    "comparator": "equals",
                                    "check_result": "pass",
                                    "message": "check status code"
                                },
                                {
                                    "check": "iOS/10.2",
                                    "expect": "iOS/10.3",
                                    "comparator": "not_equal",
                                    "check_result": "pass",
                                    "message": "check app version"
                                }
                            ]
                        },
                        "content_size": 339,
                        "export_vars": {
                            "varFoo1": "test3"
                        }
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "time": {
                    "start_at": "2022-01-25T21:16:47.909924+08:00",
                    "duration": 0.48813689
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "password": "333333",
                        "user_agent": "iOS/10.1",
                        "username": "test3"
                    },
                    "export_vars": {
                        "app_version": "v1"
                    }
                },
                "records": [
                    {
                        "name": "get with params",
                        "step_type": "request",
                        "success": true,
                        "elapsed_ms": 487,
                        "data": {
                            "success": true,
                            "req_resps": {
                                "request": {
                                    "method": "GET",
                                    "url": "https://postman-echo.com/get",
                                    "params": {
                                        "foo1": "test3",
                                        "foo2": "333333",
                                        "foo3": "iOS/10.1"
                                    },
                                    "headers": {
                                        "User-Agent": "iOS/10.1,v1"
                                    }
                                },
                                "response": {
                                    "body": {
                                        "args": {
                                            "foo1": "test3",
                                            "foo2": "333333",
                                            "foo3": "iOS/10.1"
                                        },
                                        "headers": {
                                            "accept-encoding": "gzip",
                                            "host": "postman-echo.com",
                                            "user-agent": "iOS/10.1,v1",
                                            "x-amzn-trace-id": "Root=1-61eff840-7732e5e20fed93947f7ac80d",
                                            "x-forwarded-port": "443",
                                            "x-forwarded-proto": "https"
                                        },
                                        "url": "https://postman-echo.com/get?foo1=test3\u0026foo2=333333\u0026foo3=iOS%2F10.1"
                                    },
                                    "cookies": {
                                        "sails.sid": "s%3AzffCiV7eUvBid80txdee4ji5tnZHEX--.UDYoht89T4zFrnvkajrRBAnqrGmYK3UPEZc6en7JbdU"
                                    },
                                    "headers": {
                                        "Connection": "keep-alive",
                                        "Content-Length": "339",
                                        "Content-Type": "application/json; charset=utf-8",
                                        "Date": "Tue, 25 Jan 2022 13:16:48 GMT",
                                        "Etag": "W/\"153-F8kBKJScNuffLxfItueNpJDwhOU\"",
                                        "Set-Cookie": "sails.sid=s%3AzffCiV7eUvBid80txdee4ji5tnZHEX--.UDYoht89T4zFrnvkajrRBAnqrGmYK3UPEZc6en7JbdU; Path=/; HttpOnly",
                                        "Vary": "Accept-Encoding"
                                    },
                                    "status_code": 200
                                }
                            },
                            "validators": [
                                {
                                    "check": 200,
                                    "expect": 200,
                                    "comparator": "equals",
                                    "check_result": "pass",
                                    "message": "check status code"
                                },
                                {
                                    "check": "iOS/10.1",
                                    "expect": "iOS/10.3",
                                    "comparator": "not_equal",
                                    "check_result": "pass",
                                    "message": "check app version"
                                }
                            ]
                        },
                        "content_size": 339,
                        "export_vars": {
                            "varFoo1": "test3"
                        }
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "time": {
                    "start_at": "2022-01-25T21:16:48.398358+08:00",
                    "duration": 0.28169601
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "password": "222222",
                        "user_agent": "iOS/10.2",
                        "username": "test2"
                    },
                    "export_vars": {
                        "app_version": "v1"
                    }
                },
                "records": [
                    {
                        "name": "get with params",
                        "step_type": "request",
                        "success": true,
                        "elapsed_ms": 280,
                        "data": {
                            "success": true,
                            "req_resps": {
                                "request": {
                                    "method": "GET",
                                    "url": "https://postman-echo.com/get",
                                    "params": {
                                        "foo1": "test2",
                                        "foo2": "222222",
                                        "foo3": "iOS/10.2"
                                    },
                                    "headers": {
                                        "User-Agent": "iOS/10.1,v1"
                                    }
                                },
                                "response": {
                                    "body": {
                                        "args": {
                                            "foo1": "test2",
                                            "foo2": "222222",
                                            "foo3": "iOS/10.2"
                                        },
                                        "headers": {
                                            "accept-encoding": "gzip",
                                            "host": "postman-echo.com",
                                            "user-agent": "iOS/10.1,v1",
                                            "x-amzn-trace-id": "Root=1-61eff840-0dcbbaf73943af991e3ace4e",
                                            "x-forwarded-port": "443",
                                            "x-forwarded-proto": "https"
                                        },
                                        "url": "https://postman-echo.com/get?foo1=test2\u0026foo2=222222\u0026foo3=iOS%2F10.2"
                                    },
                                    "cookies": {
                                        "sails.sid": "s%3AMf-L0EEnGipgYs09co9m2K2rIARdYa45.TfizCEpRqlarx%2BkBv9Q0odZsyCkabNvSm5bsrIPh%2BOg"
                                    },
                                    "headers": {
                                        "Connection": "keep-alive",
                                        "Content-Length": "339",
                                        "Content-Type": "application/json; charset=utf-8",
                                        "Date": "Tue, 25 Jan 2022 13:16:48 GMT",
                                        "Etag": "W/\"153-BCDMCsBPiCNXcZLebovcmy/yhss\"",
                                        "Set-Cookie": "sails.sid=s%3AMf-L0EEnGipgYs09co9m2K2rIARdYa45.TfizCEpRqlarx%2BkBv9Q0odZsyCkabNvSm5bsrIPh%2BOg; Path=/; HttpOnly",
                                        "Vary": "Accept-Encoding"
                                    },
                                    "status_code": 200
                                }
                            },
                            "validators": [
                                {
                                    "check": 200,
                                    "expect": 200,
                                    "comparator": "equals",
                                    "check_result": "pass",
                                    "message": "check status code"
                                },
                                {
                                    "check": "iOS/10.2",
                                    "expect": "iOS/10.3",
                                    "comparator": "not_equal",
                                    "check_result": "pass",
                                    "message": "check app version"
                                }
                            ]
                        },
                        "content_size": 339,
                        "export_vars": {
                            "varFoo1": "test2"
                        }
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "time": {
                    "start_at": "2022-01-25T21:16:48.680334+08:00",
                    "duration": 0.280148839
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "password": "222222",
                        "user_agent": "iOS/10.1",
                        "username": "test2"
                    },
                    "export_vars": {
                        "app_version": "v1"
                    }
                },
                "records": [
                    {
                        "name": "get with params",
                        "step_type": "request",
                        "success": true,
                        "elapsed_ms": 279,
                        "data": {
                            "success": true,
                            "req_resps": {
                                "request": {
                                    "method": "GET",
                                    "url": "https://postman-echo.com/get",
                                    "params": {
                                        "foo1": "test2",
                                        "foo2": "222222",
                                        "foo3": "iOS/10.1"
                                    },
                                    "headers": {
                                        "User-Agent": "iOS/10.1,v1"
                                    }
                                },
                                "response": {
                                    "body": {
                                        "args": {
                                            "foo1": "test2",
                                            "foo2": "222222",
                                            "foo3": "iOS/10.1"
                                        },
                                        "headers": {
                                            "accept-encoding": "gzip",
                                            "host": "postman-echo.com",
                                            "user-agent": "iOS/10.1,v1",
                                            "x-amzn-trace-id": "Root=1-61eff841-0e3ec9943d558a8e50536b2e",
                                            "x-forwarded-port": "443",
                                            "x-forwarded-proto": "https"
                                        },
                                        "url": "https://postman-echo.com/get?foo1=test2\u0026foo2=222222\u0026foo3=iOS%2F10.1"
                                    },
                                    "cookies": {
                                        "sails.sid": "s%3A1v_S7nb-OAFKAsOzOFRuck7jIVQDDP2K.YcZhGCYypvlPrHTLx6d9UnqmEX9%2BTxTHr6SCPPRaQWk"
                                    },
                                    "headers": {
                                        "Connection": "keep-alive",
                                        "Content-Length": "339",
                                        "Content-Type": "application/json; charset=utf-8",
                                        "Date": "Tue, 25 Jan 2022 13:16:49 GMT",
                                        "Etag": "W/\"153-1nL6mgrwl+7DcYyd2Ew5cqVEAwk\"",
                                        "Set-Cookie": "sails.sid=s%3A1v_S7nb-OAFKAsOzOFRuck7jIVQDDP2K.YcZhGCYypvlPrHTLx6d9UnqmEX9%2BTxTHr6SCPPRaQWk; Path=/; HttpOnly",
                                        "Vary": "Accept-Encoding"
                                    },
                                    "status_code": 200
                                }
                            },
                            "validators": [
                                {
                                    "check": 200,
                                    "expect": 200,
                                    "comparator": "equals",
                                    "check_result": "pass",
                                    "message": "check status code"
                                },
                                {
                                    "check": "iOS/10.1",
                                    "expect": "iOS/10.3",
                                    "comparator": "not_equal",
                                    "check_result": "pass",
                                    "message": "check app version"
                                }
                            ]
                        },
                        "content_size": 339,
                        "export_vars": {
                            "varFoo1": "test2"
                        }
                    }
                ]
            },
            {
                "name": "request methods testcase: validate with parameters",
                "success": true,
                "time": {
                    "start_at": "2022-01-25T21:16:48.960785+08:00",
                    "duration": 0.493498128
                },
                "in_out": {
                    "config_vars": {
                        "app_version": "v1",
                        "password": "222222",
                        "user_agent": "iOS/10.2",
                        "username": "test2"
                    },
                    "export_vars": {
                        "app_version": "v1"
                    }
                },
                "records": [
                    {
                        "name": "get with params",
                        "step_type": "request",
                        "success": true,
                        "elapsed_ms": 492,
                        "data": {
                            "success": true,
                            "req_resps": {
                                "request": {
                                    "method": "GET",
                                    "url": "https://postman-echo.com/get",
                                    "params": {
                                        "foo1": "test2",
                                        "foo2": "222222",
                                        "foo3": "iOS/10.2"
                                    },
                                    "headers": {
                                        "User-Agent": "iOS/10.1,v1"
                                    }
                                },
                                "response": {
                                    "body": {
                                        "args": {
                                            "foo1": "test2",
                                            "foo2": "222222",
                                            "foo3": "iOS/10.2"
                                        },
                                        "headers": {
                                            "accept-encoding": "gzip",
                                            "host": "postman-echo.com",
                                            "user-agent": "iOS/10.1,v1",
                                            "x-amzn-trace-id": "Root=1-61eff841-43592b1142a9b290639fa18f",
                                            "x-forwarded-port": "443",
                                            "x-forwarded-proto": "https"
                                        },
                                        "url": "https://postman-echo.com/get?foo1=test2\u0026foo2=222222\u0026foo3=iOS%2F10.2"
                                    },
                                    "cookies": {
                                        "sails.sid": "s%3AwmRBJDOGxYQ0XfhsrG4tEwy7BmsL-HUR.AaIhEqy7S0RPP7EelDlzq2fnki4teFaqLjSrG9VYKvo"
                                    },
                                    "headers": {
                                        "Connection": "keep-alive",
                                        "Content-Length": "339",
                                        "Content-Type": "application/json; charset=utf-8",
                                        "Date": "Tue, 25 Jan 2022 13:16:49 GMT",
                                        "Etag": "W/\"153-NTT3AqeHSqfLPhBpU10xqDCrE60\"",
                                        "Set-Cookie": "sails.sid=s%3AwmRBJDOGxYQ0XfhsrG4tEwy7BmsL-HUR.AaIhEqy7S0RPP7EelDlzq2fnki4teFaqLjSrG9VYKvo; Path=/; HttpOnly",
                                        "Vary": "Accept-Encoding"
                                    },
                                    "status_code": 200
                                }
                            },
                            "validators": [
                                {
                                    "check": 200,
                                    "expect": 200,
                                    "comparator": "equals",
                                    "check_result": "pass",
                                    "message": "check status code"
                                },
                                {
                                    "check": "iOS/10.2",
                                    "expect": "iOS/10.3",
                                    "comparator": "not_equal",
                                    "check_result": "pass",
                                    "message": "check app version"
                                }
                            ]
                        },
                        "content_size": 339,
                        "export_vars": {
                            "varFoo1": "test2"
                        }
                    }
                ]
            }
        ]
    }
    
    opened by xucong053 1
  • feat: support rendezvous after spawn done

    feat: support rendezvous after spawn done

    集合点参数: Number :触发集合点释放的虚拟用户数量,int64,范围 (0, all] Percent:触发集合点释放的虚拟用户百分比,float32,范围 (0, 1] Timeout:虚拟用户到达集合点之间的间隔时间的最大值,int64,单位毫秒

    备注: 数量和百分比参数为二选一并且范围合法,否则两个参数都会被设为默认值,默认值为全部虚拟用户 超时时间如果没有制定,默认值为 5000 ms

    opened by bbx-winner 1
  • fix: inaccurate to report stats for total; feat: add average response time in total

    fix: inaccurate to report stats for total; feat: add average response time in total

    修改前最后一次总体数据统计: Current time: 2022/01/19 20:32:09, Users: 500, State: quitting, Total RPS: 1.3, Total Fail Ratio: 0.0% Accumulated Transactions: 19956 Passed, 44 Failed 修改后最后一次总体数据统计: Current time: 2022/01/19 20:30:48, Users: 500, State: quitting, Total RPS: 377.4, Total Average Response Time: 914.5ms, Total Fail Ratio: 0.1% Accumulated Transactions: 19987 Passed, 13 Failed

    opened by xucong053 1
  • refactor go plugin

    refactor go plugin

    • feat: add github.com/httprunner/hrp/plugin sub-module
    • feat: add scaffold for plugin
    • feat: catch Interrupt and SIGTERM signals to ensure plugin quitted
    • change: report event for initializing plugin
    • doc: add plugin docs
    • refactor: plugin structure
    opened by debugtalk 1
  • feat: support rendezvous

    feat: support rendezvous

    集合点参数:

    • Number :触发集合点释放的虚拟用户数量,int64,范围 (0, all]
    • Percent:触发集合点释放的虚拟用户百分比,float32,范围 (0, 1]
    • Timeout:虚拟用户到达集合点之间的间隔时间的最大值,int64,单位毫秒

    备注:

    • 数量和百分比参数为二选一,如果同时指定,则默认值为全部虚拟用户
    • 超时时间如果没有制定,默认值为 5000 ms
    opened by bbx-winner 1
Releases(v0.8.0)
Owner
HttpRunner
HttpRunner
Core is the next-generation digital data engine.

tKeel-Core The digital engine of world ?? Core is the data centre of the tKeel IoT Open Platform, a high-performance, scalable and lightweight next-ge

null 21 Mar 28, 2022
hopefully the the next-generation backend server of bgm.tv

基于 python 的新 api server 开发环境 python 版本: 3.8 依赖管理: poetry web 框架: fastapi quick start: git clone https://github.com/bangumi/server bangumi-server cd ba

Bangumi 343 Jun 27, 2022
Next Terminal是使用Golang和React开发的一款HTML5的远程桌面网关

Next Terminal是使用Golang和React开发的一款HTML5的远程桌面网关,具有小巧、易安装、易使用、资源占用小的特点,支持RDP、SSH、VNC和Telnet协议的连接和管理。

dushixiang 498 Jun 1, 2021
gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with git and your code

gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with git and your code

frenchy77 0 Jan 24, 2022
Go driven rpc code generation tool for right now.

Go driven rpc code generation tool for right now. 100% Go Describe services with Go interfaces (with structs, methods, comments, etc.) Generate server

pace.dev 588 Jun 25, 2022
A simulation to see what's the result among normal people、rich-second generation、hard-working people

A simulation to see what's the result of competion among normal people、rich-second generation and hard-working people. 假设: 一个社会集体中有部分富二代,部分努力的人,多数是普通人

Myrainhua 0 Feb 20, 2022
Build file generation is provided as a plugin for gazelle

JS rules for Bazel Ecosia specific JS Bazel rules to be used with the NodeJS rules Setup http_archive( name = "benchsci_bazel_rules_nodejs_contrib

BenchSci 3 Jun 9, 2022
The `protoc` compiler plugin which dumps the generation request details

Progotgen DUMP The protoc compiler plugin which dumps the generation request details in "google.golang.org/protobuf/compiler/protogen format to stderr

Albenik's Golang Projects 0 Jan 23, 2022
A Minecraft scanner written in Golang (first Golang project)

__ __/ \__ Gothyc A Minecraft port scanner written in Go. ?? / \__/ \__ \__/ \__/ \ Version 0.3.0 \__/ \__/ Author @toas

toast 10 Mar 26, 2022
An SNMP library written in GoLang.

gosnmp GoSNMP is an SNMP client library fully written in Go. It provides Get, GetNext, GetBulk, Walk, BulkWalk, Set and Traps. It supports IPv4 and IP

Go SNMP 857 Jun 28, 2022
The hotwire demo chat written in Golang

Hotwire Go Example This is a recreation of the Hotwire Rails Demo Chat with a Go backend. See the Hotwire docs for more information about Hotwire. Qui

John Turner 86 May 15, 2022
High-performance PHP application server, load-balancer and process manager written in Golang

RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supports running as a serv

Spiral Scout 6.5k Jun 20, 2022
An URL shortener service written in Golang

ggz An URL shortener service written in Golang. Features Support MySQL, Postgres or SQLite Database. Support RESTful or GraphQL API. Support Auth0 or

null 184 Jun 27, 2022
Squzy - is a high-performance open-source monitoring, incident and alert system written in Golang with Bazel and love.

Squzy - opensource monitoring, incident and alerting system About Squzy - is a high-performance open-source monitoring and alerting system written in

Squzy 454 May 24, 2022
Centralized Configuration System written in Golang - Spring cloud compatible

Centralized Configuration System What is Vecosy Vecosy is a configuration service exposed through REST/GRPC. Is Spring Cloud Conf compatible and also

null 17 Jun 4, 2022
EasyTCP is a light-weight and less painful TCP server framework written in Go (Golang) based on the standard net package.

EasyTCP is a light-weight TCP framework written in Go (Golang), built with message router. EasyTCP helps you build a TCP server easily fast and less painful.

zxl 391 Jun 20, 2022
The Jenkins client was written by Golang

jenkins-client Document How to get it go.mod require github.com/jenkins-zh/jenkins-client Configuration Examples of jcli configuration - name: dev

Jenkins Chinese Community 14 Mar 29, 2022
Bell is the simplest event system written in Go (Golang) which is based on the execution of handlers independent of the main channel.

Bell Bell is the simplest event system written in Go (Golang) which is based on the execution of handlers independent of the main channel. Written in

NUT.Tech 23 Jun 22, 2022
A socks5 server(tcp/udp) written in golang.

socks5-server A socks5 server(tcp/udp) written in golang. Usage Usage of /main: -l string local address (default "127.0.0.1:1080") -p stri

null 21 Jun 1, 2022