mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-08 07:51:25 +08:00
feat: run tsetcase by path
This commit is contained in:
@@ -15,7 +15,7 @@ HttpBoomer is a golang implementation of [HttpRunner]. Ideally, HttpBoomer will
|
|||||||

|

|
||||||
|
|
||||||
- [x] Full support for HTTP(S) requests, more protocols are also in the plan.
|
- [x] 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.
|
- [x] Testcases can be described in multiple formats, `YAML`/`JSON`/`Golang`, and they are interchangeable.
|
||||||
- [ ] With [`HAR`][HAR] support, you can use Charles/Fiddler/Chrome/etc as a script recording generator.
|
- [ ] With [`HAR`][HAR] support, you can use Charles/Fiddler/Chrome/etc as a script recording generator.
|
||||||
- [x] Supports `variables`/`extract`/`validate`/`hooks` mechanisms to create extremely complex test scenarios.
|
- [x] 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`][plugin] to create and call custom functions.
|
- [ ] Built-in integration of rich functions, and you can also use [`go plugin`][plugin] to create and call custom functions.
|
||||||
|
|||||||
27
convert.go
27
convert.go
@@ -3,6 +3,7 @@ package httpboomer
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -124,3 +125,29 @@ func convertTestCase(tc *TCase) (*TestCase, error) {
|
|||||||
}
|
}
|
||||||
return testCase, nil
|
return testCase, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrUnsupportedFileExt = fmt.Errorf("unsupported testcase file extension")
|
||||||
|
|
||||||
|
func loadTestFile(path *TestCasePath) (*TestCase, error) {
|
||||||
|
var tc *TCase
|
||||||
|
var err error
|
||||||
|
|
||||||
|
casePath := path.string
|
||||||
|
ext := filepath.Ext(casePath)
|
||||||
|
switch ext {
|
||||||
|
case ".json":
|
||||||
|
tc, err = loadFromJSON(casePath)
|
||||||
|
case ".yaml", ".yml":
|
||||||
|
tc, err = loadFromYAML(casePath)
|
||||||
|
default:
|
||||||
|
err = ErrUnsupportedFileExt
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
testcase, err := convertTestCase(tc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return testcase, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ var demoTestCase = &TestCase{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDumpAndLoadJSON(t *testing.T) {
|
func TestDumpAndLoadJSON(t *testing.T) {
|
||||||
jsonPath := "demo.json"
|
jsonPath := demoTestCaseJSONPath
|
||||||
err := demoTestCase.dump2JSON(jsonPath)
|
err := demoTestCase.dump2JSON(jsonPath)
|
||||||
if !assert.NoError(t, err) {
|
if !assert.NoError(t, err) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
@@ -94,13 +94,11 @@ func TestDumpAndLoadYAML(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var demoTestCaseJSONPath = "demo.json"
|
||||||
|
|
||||||
func TestLoadJSONAndRun(t *testing.T) {
|
func TestLoadJSONAndRun(t *testing.T) {
|
||||||
jsonPath := "demo.json"
|
jsonPath := &TestCasePath{demoTestCaseJSONPath}
|
||||||
tc, err := loadFromJSON(jsonPath)
|
testcase, err := loadTestFile(jsonPath)
|
||||||
if !assert.NoError(t, err) {
|
|
||||||
t.Fail()
|
|
||||||
}
|
|
||||||
testcase, err := convertTestCase(tc)
|
|
||||||
if !assert.NoError(t, err) {
|
if !assert.NoError(t, err) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
|
|||||||
20
models.go
20
models.go
@@ -67,12 +67,32 @@ type IStep interface {
|
|||||||
ToStruct() *TStep
|
ToStruct() *TStep
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ITestCase interface {
|
||||||
|
ToStruct() (*TestCase, error)
|
||||||
|
}
|
||||||
|
|
||||||
// used for testcase runner
|
// used for testcase runner
|
||||||
type TestCase struct {
|
type TestCase struct {
|
||||||
Config TConfig
|
Config TConfig
|
||||||
TestSteps []IStep
|
TestSteps []IStep
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tc *TestCase) ToStruct() (*TestCase, error) {
|
||||||
|
return tc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestCasePath struct {
|
||||||
|
string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (path *TestCasePath) ToStruct() (*TestCase, error) {
|
||||||
|
testcase, err := loadTestFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return testcase, nil
|
||||||
|
}
|
||||||
|
|
||||||
type TestCaseSummary struct{}
|
type TestCaseSummary struct{}
|
||||||
|
|
||||||
type StepData struct {
|
type StepData struct {
|
||||||
|
|||||||
12
runner.go
12
runner.go
@@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/imroc/req"
|
"github.com/imroc/req"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test(t *testing.T, testcases ...*TestCase) error {
|
func Test(t *testing.T, testcases ...ITestCase) error {
|
||||||
return NewRunner().WithTestingT(t).SetDebug(true).Run(testcases...)
|
return NewRunner().WithTestingT(t).SetDebug(true).Run(testcases...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,9 +36,15 @@ func (r *Runner) SetDebug(debug bool) *Runner {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Runner) Run(testcases ...*TestCase) error {
|
func (r *Runner) Run(testcases ...ITestCase) error {
|
||||||
for _, testcase := range testcases {
|
for _, testcase := range testcases {
|
||||||
if err := r.runCase(testcase); err != nil {
|
tcStruct, err := testcase.ToStruct()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("[Run] testcase.ToStruct() error: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := r.runCase(tcStruct); err != nil {
|
||||||
|
log.Printf("[Run] runCase error: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package httpboomer
|
package httpboomer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,9 +31,29 @@ func TestHttpRunner(t *testing.T) {
|
|||||||
Weight: 3,
|
Weight: 3,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
testcase3 := &TestCasePath{demoTestCaseJSONPath}
|
||||||
|
|
||||||
err := Test(t, testcase1, testcase2)
|
err := Test(t, testcase1, testcase2, testcase3)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("run testcase error: %v", err)
|
t.Fatalf("run testcase error: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
// setup, prepare demo json testcase file path
|
||||||
|
jsonPath := demoTestCaseJSONPath
|
||||||
|
err := demoTestCase.dump2JSON(jsonPath)
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// run all tests
|
||||||
|
code := m.Run()
|
||||||
|
defer os.Exit(code)
|
||||||
|
|
||||||
|
// teardown
|
||||||
|
err = os.Remove(jsonPath)
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user