mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-12 16:01:27 +08:00
feat: use startTime to correct sleep duration caused by process time
This commit is contained in:
@@ -1 +1 @@
|
|||||||
v4.3.4-beta-2306071815
|
v4.3.4-beta-2306212029
|
||||||
@@ -3,6 +3,7 @@ package uixt
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -499,7 +500,7 @@ func (dExt *DriverExt) DoAction(action MobileAction) error {
|
|||||||
return fmt.Errorf("invalid sleep params: %v(%T)", action.Params, action.Params)
|
return fmt.Errorf("invalid sleep params: %v(%T)", action.Params, action.Params)
|
||||||
case ACTION_SleepRandom:
|
case ACTION_SleepRandom:
|
||||||
if params, ok := action.Params.([]interface{}); ok {
|
if params, ok := action.Params.([]interface{}); ok {
|
||||||
return sleepRandom(params)
|
return sleepRandom(time.Now(), params)
|
||||||
}
|
}
|
||||||
return fmt.Errorf("invalid sleep random params: %v(%T)", action.Params, action.Params)
|
return fmt.Errorf("invalid sleep random params: %v(%T)", action.Params, action.Params)
|
||||||
case ACTION_ScreenShot:
|
case ACTION_ScreenShot:
|
||||||
@@ -541,7 +542,9 @@ func convertToFloat64(val interface{}) (float64, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sleepRandom(params []interface{}) error {
|
// sleepRandom sleeps random time with given params
|
||||||
|
// startTime is used to correct sleep duration caused by process time
|
||||||
|
func sleepRandom(startTime time.Time, params []interface{}) error {
|
||||||
if len(params) == 1 {
|
if len(params) == 1 {
|
||||||
// constant sleep time
|
// constant sleep time
|
||||||
params = append(params, params[0], 1.0)
|
params = append(params, params[0], 1.0)
|
||||||
@@ -583,10 +586,20 @@ func sleepRandom(params []interface{}) error {
|
|||||||
for _, s := range sections {
|
for _, s := range sections {
|
||||||
accProb += s.weight / totalProb
|
accProb += s.weight / totalProb
|
||||||
if r < accProb {
|
if r < accProb {
|
||||||
n := s.min + rand.Float64()*(s.max-s.min)
|
elapsed := time.Since(startTime).Seconds()
|
||||||
log.Info().Float64("duration", n).
|
randomSeconds := s.min + rand.Float64()*(s.max-s.min)
|
||||||
Interface("strategy_params", params).Msg("sleep random seconds")
|
dur := randomSeconds - elapsed
|
||||||
time.Sleep(time.Duration(n*1000) * time.Millisecond)
|
|
||||||
|
// if elapsed time is greater than random seconds, skip sleep to reduce deviation caused by process time
|
||||||
|
if dur <= 0 {
|
||||||
|
log.Info().Float64("elapsed", elapsed).Float64("randomSeconds", randomSeconds).
|
||||||
|
Interface("strategy_params", params).Msg("elapsed duration >= random seconds, skip sleep")
|
||||||
|
} else {
|
||||||
|
log.Info().Float64("sleepDuration", dur).Float64("elapsed", elapsed).Float64("randomSeconds", randomSeconds).
|
||||||
|
Interface("strategy_params", params).Msg("sleep remaining random seconds")
|
||||||
|
time.Sleep(time.Duration(math.Ceil(dur*1000)) * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,20 +16,31 @@ func checkErr(t *testing.T, err error, msg ...string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSleepRandom(t *testing.T) {
|
func TestSleepRandom(t *testing.T) {
|
||||||
startTime := time.Now()
|
startTime1 := time.Now()
|
||||||
params := []interface{}{1}
|
params := []interface{}{1}
|
||||||
err := sleepRandom(params)
|
err := sleepRandom(startTime1, params)
|
||||||
checkErr(t, err)
|
checkErr(t, err)
|
||||||
dur := time.Since(startTime).Seconds()
|
dur := time.Since(startTime1).Seconds()
|
||||||
if dur < 0.9 || dur > 1.1 {
|
t.Log(dur)
|
||||||
|
if dur < 1 || dur > 1.1 {
|
||||||
t.Fatal("sleepRandom failed")
|
t.Fatal("sleepRandom failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
startTime = time.Now()
|
params = []interface{}{0, 2}
|
||||||
params = []interface{}{1, 2}
|
err = sleepRandom(startTime1, params)
|
||||||
err = sleepRandom(params)
|
|
||||||
checkErr(t, err)
|
checkErr(t, err)
|
||||||
dur = time.Since(startTime).Seconds()
|
dur = time.Since(startTime1).Seconds()
|
||||||
|
t.Log(dur)
|
||||||
|
if dur < 1 || dur > 2 {
|
||||||
|
t.Fatal("sleepRandom failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
startTime2 := time.Now()
|
||||||
|
params = []interface{}{1, 2}
|
||||||
|
err = sleepRandom(startTime2, params)
|
||||||
|
checkErr(t, err)
|
||||||
|
dur = time.Since(startTime2).Seconds()
|
||||||
|
t.Log(dur)
|
||||||
if dur < 1 || dur > 2 {
|
if dur < 1 || dur > 2 {
|
||||||
t.Fatal("sleepRandom failed")
|
t.Fatal("sleepRandom failed")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ func (l *LiveCrawler) Run(driver *DriverExt, enterPoint PointF) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sleep custom random time
|
// sleep custom random time
|
||||||
if err := sleepRandom(l.configs.Live.SleepRandom); err != nil {
|
if err := sleepRandom(time.Now(), l.configs.Live.SleepRandom); err != nil {
|
||||||
log.Error().Err(err).Msg("sleep random failed")
|
log.Error().Err(err).Msg("sleep random failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,6 +352,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
// loop until target count achieved or timeout
|
// loop until target count achieved or timeout
|
||||||
// the main loop is feed crawler
|
// the main loop is feed crawler
|
||||||
currVideoStat.timer = time.NewTimer(time.Duration(configs.Timeout) * time.Second)
|
currVideoStat.timer = time.NewTimer(time.Duration(configs.Timeout) * time.Second)
|
||||||
|
lastSwipeTime := time.Now()
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-currVideoStat.timer.C:
|
case <-currVideoStat.timer.C:
|
||||||
@@ -400,7 +401,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sleep custom random time
|
// sleep custom random time
|
||||||
if err := sleepRandom(configs.Feed.SleepRandom); err != nil {
|
if err := sleepRandom(lastSwipeTime, configs.Feed.SleepRandom); err != nil {
|
||||||
log.Error().Err(err).Msg("sleep random failed")
|
log.Error().Err(err).Msg("sleep random failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,7 +417,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
log.Error().Err(err).Msg("swipe up failed")
|
log.Error().Err(err).Msg("swipe up failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
time.Sleep(1 * time.Second)
|
lastSwipeTime = time.Now()
|
||||||
|
|
||||||
// check if feed page
|
// check if feed page
|
||||||
if err := dExt.Driver.AssertForegroundApp(configs.AppPackageName, "feed"); err != nil {
|
if err := dExt.Driver.AssertForegroundApp(configs.AppPackageName, "feed"); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user