mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-07 15:31:23 +08:00
Merge pull request #1306 from xucong053/unify-the-project-structure-with-QuickRunner
feat: unify the project structure with quick runner
This commit is contained in:
@@ -36,4 +36,4 @@ Copyright 2017 debugtalk
|
|||||||
* [hrp run](hrp_run.md) - run API test with go engine
|
* [hrp run](hrp_run.md) - run API test with go engine
|
||||||
* [hrp startproject](hrp_startproject.md) - create a scaffold project
|
* [hrp startproject](hrp_startproject.md) - create a scaffold project
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ hrp boom [flags]
|
|||||||
--max-rps int Max RPS that boomer can generate, disabled by default.
|
--max-rps int Max RPS that boomer can generate, disabled by default.
|
||||||
--mem-profile string Enable memory profiling.
|
--mem-profile string Enable memory profiling.
|
||||||
--mem-profile-duration duration Memory profile duration. (default 30s)
|
--mem-profile-duration duration Memory profile duration. (default 30s)
|
||||||
|
--profile string profile for load testing
|
||||||
--prometheus-gateway string Prometheus Pushgateway url.
|
--prometheus-gateway string Prometheus Pushgateway url.
|
||||||
--request-increase-rate string Request increase rate, disabled by default. (default "-1")
|
--request-increase-rate string Request increase rate, disabled by default. (default "-1")
|
||||||
--spawn-count int The number of users to spawn for load testing (default 1)
|
--spawn-count int The number of users to spawn for load testing (default 1)
|
||||||
@@ -41,4 +42,4 @@ hrp boom [flags]
|
|||||||
|
|
||||||
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -18,4 +18,4 @@ hrp convert $path... [flags]
|
|||||||
|
|
||||||
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -24,4 +24,4 @@ hrp har2case $har_path... [flags]
|
|||||||
|
|
||||||
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -16,4 +16,4 @@ hrp pytest $path ... [flags]
|
|||||||
|
|
||||||
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -35,4 +35,4 @@ hrp run $path... [flags]
|
|||||||
|
|
||||||
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ hrp startproject $project_name [flags]
|
|||||||
|
|
||||||
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
* [hrp](hrp.md) - Next-Generation API Testing Solution.
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 9-May-2022
|
###### Auto generated by spf13/cobra on 20-May-2022
|
||||||
|
|||||||
@@ -10,8 +10,14 @@
|
|||||||
},
|
},
|
||||||
"parameters_setting": {
|
"parameters_setting": {
|
||||||
"strategies": {
|
"strategies": {
|
||||||
"user_agent": "sequential",
|
"user_agent": {
|
||||||
"username-password": "random"
|
"name": "user-identity",
|
||||||
|
"pick_order": "sequential"
|
||||||
|
},
|
||||||
|
"username-password": {
|
||||||
|
"name": "user-info",
|
||||||
|
"pick_order": "random"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"limit": 6
|
"limit": 6
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,8 +5,12 @@ config:
|
|||||||
username-password: ${parameterize($file)}
|
username-password: ${parameterize($file)}
|
||||||
parameters_setting:
|
parameters_setting:
|
||||||
strategies:
|
strategies:
|
||||||
user_agent: "sequential"
|
user_agent:
|
||||||
username-password: "random"
|
name: "user-identity"
|
||||||
|
pick_order: "sequential"
|
||||||
|
username-password:
|
||||||
|
name: "user-info"
|
||||||
|
pick_order: "random"
|
||||||
limit: 6
|
limit: 6
|
||||||
variables:
|
variables:
|
||||||
app_version: v1
|
app_version: v1
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"github.com/httprunner/httprunner/v4/hrp"
|
"github.com/httprunner/httprunner/v4/hrp"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/boomer"
|
"github.com/httprunner/httprunner/v4/hrp/internal/boomer"
|
||||||
|
"github.com/httprunner/httprunner/v4/hrp/internal/builtin"
|
||||||
)
|
)
|
||||||
|
|
||||||
// boomCmd represents the boom command
|
// boomCmd represents the boom command
|
||||||
@@ -28,57 +31,70 @@ var boomCmd = &cobra.Command{
|
|||||||
path := hrp.TestCasePath(arg)
|
path := hrp.TestCasePath(arg)
|
||||||
paths = append(paths, &path)
|
paths = append(paths, &path)
|
||||||
}
|
}
|
||||||
hrpBoomer := hrp.NewBoomer(spawnCount, spawnRate)
|
// if set profile, the priority is higher than the other commands
|
||||||
hrpBoomer.SetRateLimiter(maxRPS, requestIncreaseRate)
|
if boomArgs.profile != "" {
|
||||||
if loopCount > 0 {
|
err := builtin.LoadFile(boomArgs.profile, &boomArgs)
|
||||||
hrpBoomer.SetLoopCount(loopCount)
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("failed to load profile")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !disableConsoleOutput {
|
|
||||||
|
hrpBoomer := hrp.NewBoomer(boomArgs.SpawnCount, boomArgs.SpawnRate)
|
||||||
|
hrpBoomer.SetRateLimiter(boomArgs.MaxRPS, boomArgs.RequestIncreaseRate)
|
||||||
|
if boomArgs.LoopCount > 0 {
|
||||||
|
hrpBoomer.SetLoopCount(boomArgs.LoopCount)
|
||||||
|
}
|
||||||
|
if !boomArgs.DisableConsoleOutput {
|
||||||
hrpBoomer.AddOutput(boomer.NewConsoleOutput())
|
hrpBoomer.AddOutput(boomer.NewConsoleOutput())
|
||||||
}
|
}
|
||||||
if prometheusPushgatewayURL != "" {
|
if boomArgs.PrometheusPushgatewayURL != "" {
|
||||||
hrpBoomer.AddOutput(boomer.NewPrometheusPusherOutput(prometheusPushgatewayURL, "hrp", hrpBoomer.GetMode()))
|
hrpBoomer.AddOutput(boomer.NewPrometheusPusherOutput(boomArgs.PrometheusPushgatewayURL, "hrp", hrpBoomer.GetMode()))
|
||||||
}
|
}
|
||||||
hrpBoomer.SetDisableKeepAlive(disableKeepalive)
|
hrpBoomer.SetDisableKeepAlive(boomArgs.DisableKeepalive)
|
||||||
hrpBoomer.SetDisableCompression(disableCompression)
|
hrpBoomer.SetDisableCompression(boomArgs.DisableCompression)
|
||||||
hrpBoomer.SetClientTransport()
|
hrpBoomer.SetClientTransport()
|
||||||
hrpBoomer.EnableCPUProfile(cpuProfile, cpuProfileDuration)
|
hrpBoomer.EnableCPUProfile(boomArgs.CPUProfile, boomArgs.CPUProfileDuration)
|
||||||
hrpBoomer.EnableMemoryProfile(memoryProfile, memoryProfileDuration)
|
hrpBoomer.EnableMemoryProfile(boomArgs.MemoryProfile, boomArgs.MemoryProfileDuration)
|
||||||
hrpBoomer.EnableGracefulQuit()
|
hrpBoomer.EnableGracefulQuit()
|
||||||
hrpBoomer.Run(paths...)
|
hrpBoomer.Run(paths...)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
type BoomArgs struct {
|
||||||
spawnCount int
|
SpawnCount int `json:"spawn-count,omitempty" yaml:"spawn-count,omitempty"`
|
||||||
spawnRate float64
|
SpawnRate float64 `json:"spawn-rate,omitempty" yaml:"spawn-rate,omitempty"`
|
||||||
maxRPS int64
|
MaxRPS int64 `json:"max-rps,omitempty" yaml:"max-rps,omitempty"`
|
||||||
loopCount int64
|
LoopCount int64 `json:"loop-count,omitempty" yaml:"loop-count,omitempty"`
|
||||||
requestIncreaseRate string
|
RequestIncreaseRate string `json:"request-increase-rate,omitempty" yaml:"request-increase-rate,omitempty"`
|
||||||
memoryProfile string
|
MemoryProfile string `json:"memory-profile,omitempty" yaml:"memory-profile,omitempty"`
|
||||||
memoryProfileDuration time.Duration
|
MemoryProfileDuration time.Duration `json:"memory-profile-duration" yaml:"memory-profile-duration"`
|
||||||
cpuProfile string
|
CPUProfile string `json:"cpu-profile,omitempty" yaml:"cpu-profile,omitempty"`
|
||||||
cpuProfileDuration time.Duration
|
CPUProfileDuration time.Duration `json:"cpu-profile-duration,omitempty" yaml:"cpu-profile-duration,omitempty"`
|
||||||
prometheusPushgatewayURL string
|
PrometheusPushgatewayURL string `json:"prometheus-gateway,omitempty" yaml:"prometheus-gateway,omitempty"`
|
||||||
disableConsoleOutput bool
|
DisableConsoleOutput bool `json:"disable-console-output,omitempty" yaml:"disable-console-output,omitempty"`
|
||||||
disableCompression bool
|
DisableCompression bool `json:"disable-compression,omitempty" yaml:"disable-compression,omitempty"`
|
||||||
disableKeepalive bool
|
DisableKeepalive bool `json:"disable-keepalive,omitempty" yaml:"disable-keepalive,omitempty"`
|
||||||
)
|
profile string
|
||||||
|
}
|
||||||
|
|
||||||
|
var boomArgs BoomArgs
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(boomCmd)
|
rootCmd.AddCommand(boomCmd)
|
||||||
|
|
||||||
boomCmd.Flags().Int64Var(&maxRPS, "max-rps", 0, "Max RPS that boomer can generate, disabled by default.")
|
boomCmd.Flags().Int64Var(&boomArgs.MaxRPS, "max-rps", 0, "Max RPS that boomer can generate, disabled by default.")
|
||||||
boomCmd.Flags().StringVar(&requestIncreaseRate, "request-increase-rate", "-1", "Request increase rate, disabled by default.")
|
boomCmd.Flags().StringVar(&boomArgs.RequestIncreaseRate, "request-increase-rate", "-1", "Request increase rate, disabled by default.")
|
||||||
boomCmd.Flags().IntVar(&spawnCount, "spawn-count", 1, "The number of users to spawn for load testing")
|
boomCmd.Flags().IntVar(&boomArgs.SpawnCount, "spawn-count", 1, "The number of users to spawn for load testing")
|
||||||
boomCmd.Flags().Float64Var(&spawnRate, "spawn-rate", 1, "The rate for spawning users")
|
boomCmd.Flags().Float64Var(&boomArgs.SpawnRate, "spawn-rate", 1, "The rate for spawning users")
|
||||||
boomCmd.Flags().Int64Var(&loopCount, "loop-count", -1, "The specify running cycles for load testing")
|
boomCmd.Flags().Int64Var(&boomArgs.LoopCount, "loop-count", -1, "The specify running cycles for load testing")
|
||||||
boomCmd.Flags().StringVar(&memoryProfile, "mem-profile", "", "Enable memory profiling.")
|
boomCmd.Flags().StringVar(&boomArgs.MemoryProfile, "mem-profile", "", "Enable memory profiling.")
|
||||||
boomCmd.Flags().DurationVar(&memoryProfileDuration, "mem-profile-duration", 30*time.Second, "Memory profile duration.")
|
boomCmd.Flags().DurationVar(&boomArgs.MemoryProfileDuration, "mem-profile-duration", 30*time.Second, "Memory profile duration.")
|
||||||
boomCmd.Flags().StringVar(&cpuProfile, "cpu-profile", "", "Enable CPU profiling.")
|
boomCmd.Flags().StringVar(&boomArgs.CPUProfile, "cpu-profile", "", "Enable CPU profiling.")
|
||||||
boomCmd.Flags().DurationVar(&cpuProfileDuration, "cpu-profile-duration", 30*time.Second, "CPU profile duration.")
|
boomCmd.Flags().DurationVar(&boomArgs.CPUProfileDuration, "cpu-profile-duration", 30*time.Second, "CPU profile duration.")
|
||||||
boomCmd.Flags().StringVar(&prometheusPushgatewayURL, "prometheus-gateway", "", "Prometheus Pushgateway url.")
|
boomCmd.Flags().StringVar(&boomArgs.PrometheusPushgatewayURL, "prometheus-gateway", "", "Prometheus Pushgateway url.")
|
||||||
boomCmd.Flags().BoolVar(&disableConsoleOutput, "disable-console-output", false, "Disable console output.")
|
boomCmd.Flags().BoolVar(&boomArgs.DisableConsoleOutput, "disable-console-output", false, "Disable console output.")
|
||||||
boomCmd.Flags().BoolVar(&disableCompression, "disable-compression", false, "Disable compression")
|
boomCmd.Flags().BoolVar(&boomArgs.DisableCompression, "disable-compression", false, "Disable compression")
|
||||||
boomCmd.Flags().BoolVar(&disableKeepalive, "disable-keepalive", false, "Disable keepalive")
|
boomCmd.Flags().BoolVar(&boomArgs.DisableKeepalive, "disable-keepalive", false, "Disable keepalive")
|
||||||
|
boomCmd.Flags().StringVar(&boomArgs.profile, "profile", "", "profile for load testing")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/httprunner/funplugin/shared"
|
"github.com/httprunner/funplugin/shared"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@@ -13,6 +14,7 @@ import (
|
|||||||
|
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/builtin"
|
"github.com/httprunner/httprunner/v4/hrp/internal/builtin"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/sdk"
|
"github.com/httprunner/httprunner/v4/hrp/internal/sdk"
|
||||||
|
"github.com/httprunner/httprunner/v4/hrp/internal/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PluginType string
|
type PluginType string
|
||||||
@@ -23,6 +25,13 @@ const (
|
|||||||
Go PluginType = "go"
|
Go PluginType = "go"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ProjectInfo struct {
|
||||||
|
ProjectName string `json:"project_name,omitempty" yaml:"project_name,omitempty"`
|
||||||
|
ProjectPath string `json:"project_path,omitempty" yaml:"project_path,omitempty"`
|
||||||
|
CreateTime time.Time `json:"create_time,omitempty" yaml:"create_time,omitempty"`
|
||||||
|
Version string `json:"hrp_version,omitempty" yaml:"hrp_version,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
//go:embed templates/*
|
//go:embed templates/*
|
||||||
var templatesDir embed.FS
|
var templatesDir embed.FS
|
||||||
|
|
||||||
@@ -68,6 +77,12 @@ func CreateScaffold(projectName string, pluginType PluginType, force bool) error
|
|||||||
os.RemoveAll(projectName)
|
os.RemoveAll(projectName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get project abs path
|
||||||
|
projectPath, err := filepath.Abs(projectName)
|
||||||
|
if err != nil {
|
||||||
|
projectPath = projectName
|
||||||
|
}
|
||||||
|
|
||||||
// create project folders
|
// create project folders
|
||||||
if err := builtin.CreateFolder(projectName); err != nil {
|
if err := builtin.CreateFolder(projectName); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -88,8 +103,21 @@ func CreateScaffold(projectName string, pluginType PluginType, force bool) error
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
projectInfo := &ProjectInfo{
|
||||||
|
ProjectName: projectName,
|
||||||
|
ProjectPath: projectPath,
|
||||||
|
CreateTime: time.Now(),
|
||||||
|
Version: version.VERSION,
|
||||||
|
}
|
||||||
|
|
||||||
|
// dump project information to file
|
||||||
|
err = builtin.Dump2JSON(projectInfo, filepath.Join(projectName, "proj.json"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// create .gitignore
|
// create .gitignore
|
||||||
err := CopyFile("templates/gitignore", filepath.Join(projectName, ".gitignore"))
|
err = CopyFile("templates/gitignore", filepath.Join(projectName, ".gitignore"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,17 +12,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type TParamsConfig struct {
|
type TParamsConfig struct {
|
||||||
Strategy iteratorStrategy `json:"strategy,omitempty" yaml:"strategy,omitempty"` // overall strategy
|
PickOrder iteratorPickOrder `json:"strategy,omitempty" yaml:"strategy,omitempty"` // overall pick-order strategy
|
||||||
Strategies map[string]iteratorStrategy `json:"strategies,omitempty" yaml:"strategies,omitempty"` // individual strategies for each parameters
|
Strategies map[string]iteratorStrategy `json:"strategies,omitempty" yaml:"strategies,omitempty"` // individual strategies for each parameters
|
||||||
Limit int `json:"limit,omitempty" yaml:"limit,omitempty"`
|
Limit int `json:"limit,omitempty" yaml:"limit,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type iteratorStrategy string
|
type iteratorPickOrder string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
strategySequential iteratorStrategy = "sequential"
|
pickOrderSequential iteratorPickOrder = "sequential"
|
||||||
strategyRandom iteratorStrategy = "random"
|
pickOrderRandom iteratorPickOrder = "random"
|
||||||
strategyUnique iteratorStrategy = "unique"
|
pickOrderUnique iteratorPickOrder = "unique"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -33,6 +33,11 @@ const (
|
|||||||
*/
|
*/
|
||||||
type Parameters []map[string]interface{}
|
type Parameters []map[string]interface{}
|
||||||
|
|
||||||
|
type iteratorStrategy struct {
|
||||||
|
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
||||||
|
PickOrder iteratorPickOrder `json:"pick_order,omitempty" yaml:"pick_order,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
func initParametersIterator(cfg *TConfig) (*ParametersIterator, error) {
|
func initParametersIterator(cfg *TConfig) (*ParametersIterator, error) {
|
||||||
parameters, err := loadParameters(cfg.Parameters, cfg.Variables)
|
parameters, err := loadParameters(cfg.Parameters, cfg.Variables)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -62,15 +67,15 @@ func newParametersIterator(parameters map[string]Parameters, config *TParamsConf
|
|||||||
|
|
||||||
parametersList := make([]Parameters, 0)
|
parametersList := make([]Parameters, 0)
|
||||||
for paramName := range parameters {
|
for paramName := range parameters {
|
||||||
// check parameter individual strategy
|
// check parameter individual pick order strategy
|
||||||
strategy, ok := config.Strategies[paramName]
|
strategy, ok := config.Strategies[paramName]
|
||||||
if !ok {
|
if !ok {
|
||||||
// default to overall strategy
|
// default to overall pick order strategy
|
||||||
strategy = config.Strategy
|
strategy.PickOrder = config.PickOrder
|
||||||
}
|
}
|
||||||
|
|
||||||
// group parameters by strategy
|
// group parameters by pick order strategy
|
||||||
if strategy == strategyRandom {
|
if strategy.PickOrder == pickOrderRandom {
|
||||||
iterator.randomParameterNames = append(iterator.randomParameterNames, paramName)
|
iterator.randomParameterNames = append(iterator.randomParameterNames, paramName)
|
||||||
} else {
|
} else {
|
||||||
parametersList = append(parametersList, parameters[paramName])
|
parametersList = append(parametersList, parameters[paramName])
|
||||||
|
|||||||
@@ -137,25 +137,25 @@ func TestInitParametersIteratorCount(t *testing.T) {
|
|||||||
},
|
},
|
||||||
6, // 3 * 2 * 1
|
6, // 3 * 2 * 1
|
||||||
},
|
},
|
||||||
// default equals to set overall parameters strategy to "sequential"
|
// default equals to set overall parameters pick-order to "sequential"
|
||||||
{
|
{
|
||||||
&TConfig{
|
&TConfig{
|
||||||
Parameters: configParameters,
|
Parameters: configParameters,
|
||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Strategy: "sequential",
|
PickOrder: "sequential",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
6, // 3 * 2 * 1
|
6, // 3 * 2 * 1
|
||||||
},
|
},
|
||||||
// default equals to set each individual parameters strategy to "sequential"
|
// default equals to set each individual parameters pick-order to "sequential"
|
||||||
{
|
{
|
||||||
&TConfig{
|
&TConfig{
|
||||||
Parameters: configParameters,
|
Parameters: configParameters,
|
||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Strategies: map[string]iteratorStrategy{
|
Strategies: map[string]iteratorStrategy{
|
||||||
"username-password": "sequential",
|
"username-password": {Name: "user-info", PickOrder: "sequential"},
|
||||||
"user_agent": "sequential",
|
"user_agent": {Name: "user-identity", PickOrder: "sequential"},
|
||||||
"app_version": "sequential",
|
"app_version": {Name: "app-version", PickOrder: "sequential"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -166,33 +166,33 @@ func TestInitParametersIteratorCount(t *testing.T) {
|
|||||||
Parameters: configParameters,
|
Parameters: configParameters,
|
||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Strategies: map[string]iteratorStrategy{
|
Strategies: map[string]iteratorStrategy{
|
||||||
"user_agent": "sequential",
|
"user_agent": {Name: "user-identity", PickOrder: "sequential"},
|
||||||
"app_version": "sequential",
|
"app_version": {Name: "app-version", PickOrder: "sequential"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
6, // 3 * 2 * 1
|
6, // 3 * 2 * 1
|
||||||
},
|
},
|
||||||
|
|
||||||
// set overall parameters overall strategy to "random"
|
// set overall parameters overall pick-order to "random"
|
||||||
// each random parameters only select one item
|
// each random parameters only select one item
|
||||||
{
|
{
|
||||||
&TConfig{
|
&TConfig{
|
||||||
Parameters: configParameters,
|
Parameters: configParameters,
|
||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Strategy: "random",
|
PickOrder: "random",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
1, // 1 * 1 * 1
|
1, // 1 * 1 * 1
|
||||||
},
|
},
|
||||||
// set some individual parameters strategy to "random"
|
// set some individual parameters pick-order to "random"
|
||||||
// this will override overall strategy
|
// this will override overall strategy
|
||||||
{
|
{
|
||||||
&TConfig{
|
&TConfig{
|
||||||
Parameters: configParameters,
|
Parameters: configParameters,
|
||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Strategies: map[string]iteratorStrategy{
|
Strategies: map[string]iteratorStrategy{
|
||||||
"user_agent": "random",
|
"user_agent": {Name: "user-identity", PickOrder: "random"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -203,7 +203,7 @@ func TestInitParametersIteratorCount(t *testing.T) {
|
|||||||
Parameters: configParameters,
|
Parameters: configParameters,
|
||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Strategies: map[string]iteratorStrategy{
|
Strategies: map[string]iteratorStrategy{
|
||||||
"username-password": "random",
|
"username-password": {Name: "user-info", PickOrder: "random"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -349,7 +349,7 @@ func TestInitParametersIteratorContent(t *testing.T) {
|
|||||||
ParametersSetting: &TParamsConfig{
|
ParametersSetting: &TParamsConfig{
|
||||||
Limit: 5, // limit could also be greater than total
|
Limit: 5, // limit could also be greater than total
|
||||||
Strategies: map[string]iteratorStrategy{
|
Strategies: map[string]iteratorStrategy{
|
||||||
"username-password": "random",
|
"username-password": {Name: "user-info", PickOrder: "random"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ func locateFile(startPath string, destFile string) (string, error) {
|
|||||||
return locateFile(parentDir, destFile)
|
return locateFile(parentDir, destFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getProjectRootDirPath(path string) (rootDir string, err error) {
|
func GetProjectRootDirPath(path string) (rootDir string, err error) {
|
||||||
pluginPath, err := locatePlugin(path)
|
pluginPath, err := locatePlugin(path)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
rootDir = filepath.Dir(pluginPath)
|
rootDir = filepath.Dir(pluginPath)
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ func TestLoadTestCases(t *testing.T) {
|
|||||||
if !assert.Nil(t, err) {
|
if !assert.Nil(t, err) {
|
||||||
t.Fatal()
|
t.Fatal()
|
||||||
}
|
}
|
||||||
if !assert.Equal(t, len(testCases), 4) {
|
if !assert.Equal(t, 4, len(testCases)) {
|
||||||
t.Fatal()
|
t.Fatal()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ func (path *TestCasePath) ToTestCase() (*TestCase, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// locate project root dir by plugin path
|
// locate project root dir by plugin path
|
||||||
projectRootDir, err := getProjectRootDirPath(casePath)
|
projectRootDir, err := GetProjectRootDirPath(casePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to get project root dir")
|
return nil, errors.Wrap(err, "failed to get project root dir")
|
||||||
}
|
}
|
||||||
@@ -287,8 +287,8 @@ func LoadTestCases(iTestCases ...ITestCase) ([]*TestCase, error) {
|
|||||||
testCasePath := TestCasePath(path)
|
testCasePath := TestCasePath(path)
|
||||||
tc, err := testCasePath.ToTestCase()
|
tc, err := testCasePath.ToTestCase()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Str("path", path).Msg("load testcase failed")
|
log.Warn().Err(err).Str("path", path).Msg("load testcase failed")
|
||||||
return errors.Wrap(err, "load testcase failed")
|
return nil
|
||||||
}
|
}
|
||||||
testCases = append(testCases, tc)
|
testCases = append(testCases, tc)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user