From 8a8c075654d03420a45daad08ff18f6b93c2964a Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 27 Sep 2022 21:05:44 +0800 Subject: [PATCH] fix: check WDA summary logs --- examples/uitest/demo_douyin_live.json | 29 ++++++++++++++------------- examples/uitest/demo_douyin_live.yaml | 17 ++++++++-------- examples/uitest/demo_douyin_test.go | 20 +++++++----------- examples/uitest/demo_weixin_test.go | 10 ++------- hrp/internal/uixt/ext.go | 1 + hrp/internal/uixt/ios_device.go | 1 + hrp/runner.go | 6 +++--- hrp/session.go | 17 ++++++---------- hrp/step_ios_ui.go | 2 +- hrp/step_request_test.go | 2 +- hrp/step_testcase.go | 18 +++++++++++++---- hrp/summary.go | 2 +- 12 files changed, 61 insertions(+), 64 deletions(-) diff --git a/examples/uitest/demo_douyin_live.json b/examples/uitest/demo_douyin_live.json index c86466ad..94fe4496 100644 --- a/examples/uitest/demo_douyin_live.json +++ b/examples/uitest/demo_douyin_live.json @@ -27,6 +27,7 @@ { "method": "swipe_to_tap_app", "params": "$app_name", + "identifier": "启动抖音", "max_retry_times": 5 }, { @@ -45,20 +46,7 @@ ] }, { - "name": "在推荐页上划,直到出现「点击进入直播间」", - "ios": { - "actions": [ - { - "method": "swipe_to_tap_text", - "params": "点击进入直播间", - "identifier": "进入直播间", - "max_retry_times": 100 - } - ] - } - }, - { - "name": "向上滑动,等待 10s", + "name": "向上滑动 2 次", "ios": { "actions": [ { @@ -87,6 +75,19 @@ } ] } + }, + { + "name": "在推荐页上划,直到出现「点击进入直播间」", + "ios": { + "actions": [ + { + "method": "swipe_to_tap_text", + "params": "点击进入直播间", + "identifier": "进入直播间", + "max_retry_times": 10 + } + ] + } } ] } diff --git a/examples/uitest/demo_douyin_live.yaml b/examples/uitest/demo_douyin_live.yaml index 1b4b276b..d2463772 100644 --- a/examples/uitest/demo_douyin_live.yaml +++ b/examples/uitest/demo_douyin_live.yaml @@ -15,6 +15,7 @@ teststeps: params: com.ss.iphone.ugc.Aweme - method: swipe_to_tap_app params: $app_name + identifier: 启动抖音 max_retry_times: 5 - method: sleep params: 5 @@ -23,14 +24,7 @@ teststeps: assert: exists expect: 推荐 msg: 抖音启动失败,「推荐」不存在 - - name: 在推荐页上划,直到出现「点击进入直播间」 - ios: - actions: - - method: swipe_to_tap_text - params: 点击进入直播间 - identifier: 进入直播间 - max_retry_times: 100 - - name: 向上滑动,等待 10s + - name: 向上滑动 2 次 ios: actions: - method: swipe @@ -45,3 +39,10 @@ teststeps: - method: sleep params: 2 - method: screenshot + - name: 在推荐页上划,直到出现「点击进入直播间」 + ios: + actions: + - method: swipe_to_tap_text + params: 点击进入直播间 + identifier: 进入直播间 + max_retry_times: 10 diff --git a/examples/uitest/demo_douyin_test.go b/examples/uitest/demo_douyin_test.go index 7c9a3c59..9abc72d6 100644 --- a/examples/uitest/demo_douyin_test.go +++ b/examples/uitest/demo_douyin_test.go @@ -1,7 +1,6 @@ package uitest import ( - "fmt" "testing" "github.com/httprunner/httprunner/v4/hrp" @@ -19,19 +18,19 @@ func TestIOSDouyinLive(t *testing.T) { IOS(). Home(). AppTerminate("com.ss.iphone.ugc.Aweme"). // 关闭已运行的抖音 - SwipeToTapApp("$app_name", hrp.WithMaxRetryTimes(5)).Sleep(5). + SwipeToTapApp("$app_name", hrp.WithMaxRetryTimes(5), hrp.WithIdentifier("启动抖音")).Sleep(5). Validate(). AssertOCRExists("推荐", "抖音启动失败,「推荐」不存在"), // hrp.NewStep("处理青少年弹窗"). // IOS(). // TapByOCR("我知道了", hrp.WithIgnoreNotFoundError(true)), - hrp.NewStep("在推荐页上划,直到出现「点击进入直播间」"). - IOS(). - SwipeToTapText("点击进入直播间", hrp.WithMaxRetryTimes(100), hrp.WithIdentifier("进入直播间")), - hrp.NewStep("向上滑动,等待 10s"). + hrp.NewStep("向上滑动 2 次"). IOS(). SwipeUp(hrp.WithIdentifier("第一次上划")).Sleep(2).ScreenShot(). // 上划 1 次,等待 2s,截图保存 SwipeUp(hrp.WithIdentifier("第二次上划")).Sleep(2).ScreenShot(), // 再上划 1 次,等待 2s,截图保存 + hrp.NewStep("在推荐页上划,直到出现「点击进入直播间」"). + IOS(). + SwipeToTapText("点击进入直播间", hrp.WithMaxRetryTimes(10), hrp.WithIdentifier("进入直播间")), }, } @@ -42,14 +41,9 @@ func TestIOSDouyinLive(t *testing.T) { t.Fatal(err) } - runner := hrp.NewRunner(t) - sessionRunner, err := runner.NewSessionRunner(testCase) + runner := hrp.NewRunner(t).SetSaveTests(true) + err := runner.Run(testCase) if err != nil { t.Fatal(err) } - if err := sessionRunner.Start(nil); err != nil { - t.Fatal(err) - } - summary := sessionRunner.GetSummary() - fmt.Println(summary) } diff --git a/examples/uitest/demo_weixin_test.go b/examples/uitest/demo_weixin_test.go index dc7dfd95..112b6ffd 100644 --- a/examples/uitest/demo_weixin_test.go +++ b/examples/uitest/demo_weixin_test.go @@ -1,7 +1,6 @@ package uitest import ( - "fmt" "testing" "github.com/httprunner/httprunner/v4/hrp" @@ -43,14 +42,9 @@ func TestIOSWeixinLive(t *testing.T) { t.Fatal(err) } - runner := hrp.NewRunner(t) - sessionRunner, err := runner.NewSessionRunner(testCase) + runner := hrp.NewRunner(t).SetSaveTests(true) + err := runner.Run(testCase) if err != nil { t.Fatal(err) } - if err := sessionRunner.Start(nil); err != nil { - t.Fatal(err) - } - summary := sessionRunner.GetSummary() - fmt.Println(summary) } diff --git a/hrp/internal/uixt/ext.go b/hrp/internal/uixt/ext.go index d0bd92df..c4aaad79 100644 --- a/hrp/internal/uixt/ext.go +++ b/hrp/internal/uixt/ext.go @@ -124,6 +124,7 @@ func WithThreshold(threshold float64) CVOption { } type DriverExt struct { + Device Device Driver WebDriver windowSize Size frame *bytes.Buffer diff --git a/hrp/internal/uixt/ios_device.go b/hrp/internal/uixt/ios_device.go index 98912a26..8313aa89 100644 --- a/hrp/internal/uixt/ios_device.go +++ b/hrp/internal/uixt/ios_device.go @@ -96,6 +96,7 @@ func InitWDAClient(device *IOSDevice) (*DriverExt, error) { } } + driverExt.Device = iosDevice return driverExt, nil } diff --git a/hrp/runner.go b/hrp/runner.go index dfb02551..d7d59202 100644 --- a/hrp/runner.go +++ b/hrp/runner.go @@ -210,10 +210,10 @@ func (r *HRPRunner) Run(testcases ...ITestCase) error { } for it := sessionRunner.parametersIterator; it.HasNext(); { - err = sessionRunner.Start(it.Next()) - caseSummary := sessionRunner.GetSummary() + err1 := sessionRunner.Start(it.Next()) + caseSummary, err2 := sessionRunner.GetSummary() s.appendCaseSummary(caseSummary) - if err != nil { + if err1 != nil || err2 != nil { log.Error().Err(err).Msg("[Run] run testcase failed") runErr = err break diff --git a/hrp/session.go b/hrp/session.go index d640f2f2..10b0d76a 100644 --- a/hrp/session.go +++ b/hrp/session.go @@ -7,8 +7,6 @@ import ( "github.com/gorilla/websocket" "github.com/pkg/errors" "github.com/rs/zerolog/log" - - "github.com/httprunner/httprunner/v4/hrp/internal/json" ) // SessionRunner is used to run testcase and its steps. @@ -151,7 +149,7 @@ func (r *SessionRunner) updateSessionVariables(parameters map[string]interface{} } } -func (r *SessionRunner) GetSummary() *TestCaseSummary { +func (r *SessionRunner) GetSummary() (*TestCaseSummary, error) { caseSummary := r.summary caseSummary.Name = r.parsedConfig.Name caseSummary.Time.StartAt = r.startTime @@ -163,19 +161,16 @@ func (r *SessionRunner) GetSummary() *TestCaseSummary { caseSummary.InOut.ExportVars = exportVars caseSummary.InOut.ConfigVars = r.parsedConfig.Variables + // add WDA/UIA logs to summary logs := make(map[string]string) for udid, client := range r.hrpRunner.uiClients { log, err := client.GetLogs() if err != nil { - logs[udid] = err.Error() - } else { - logs[udid] = log + return nil, err } - + logs[udid] = log } - logsStr, _ := json.Marshal(logs) - caseSummary.Logs = string(logsStr) + caseSummary.Logs = logs - // caseSummary.Log - return caseSummary + return caseSummary, nil } diff --git a/hrp/step_ios_ui.go b/hrp/step_ios_ui.go index c53b06ca..be9a566d 100644 --- a/hrp/step_ios_ui.go +++ b/hrp/step_ios_ui.go @@ -499,7 +499,7 @@ func (r *HRPRunner) initUIClient(device uixt.Device) (client *uixt.DriverExt, er if r.uiClients == nil { r.uiClients = make(map[string]*uixt.DriverExt) } - r.uiClients[uuid] = client + r.uiClients[client.Device.UUID()] = client return client, nil } diff --git a/hrp/step_request_test.go b/hrp/step_request_test.go index 338d7e7e..d49a9253 100644 --- a/hrp/step_request_test.go +++ b/hrp/step_request_test.go @@ -103,7 +103,7 @@ func TestRunRequestStatOn(t *testing.T) { if err := sessionRunner.Start(nil); err != nil { t.Fatal() } - summary := sessionRunner.GetSummary() + summary, _ := sessionRunner.GetSummary() stat := summary.Records[0].HttpStat if !assert.GreaterOrEqual(t, stat["DNSLookup"], int64(0)) { diff --git a/hrp/step_testcase.go b/hrp/step_testcase.go index 0bcc1ae3..72f2c340 100644 --- a/hrp/step_testcase.go +++ b/hrp/step_testcase.go @@ -5,6 +5,7 @@ import ( "time" "github.com/jinzhu/copier" + "github.com/pkg/errors" "github.com/rs/zerolog/log" ) @@ -89,11 +90,17 @@ func (s *StepTestCaseWithOptionalArgs) Run(r *SessionRunner) (stepResult *StepRe start := time.Now() // run referenced testcase with step variables err = sessionRunner.Start(stepVariables) - if err == nil { - stepResult.Success = true - } stepResult.Elapsed = time.Since(start).Milliseconds() - summary := sessionRunner.GetSummary() + + summary, err2 := sessionRunner.GetSummary() + if err2 != nil { + log.Error().Err(err).Msg("get summary failed") + if err != nil { + err = errors.Wrap(err, err2.Error()) + } else { + err = err2 + } + } // update step names for _, record := range summary.Records { record.Name = fmt.Sprintf("%s - %s", stepResult.Name, record.Name) @@ -108,5 +115,8 @@ func (s *StepTestCaseWithOptionalArgs) Run(r *SessionRunner) (stepResult *StepRe r.summary.Stat.Successes += summary.Stat.Successes r.summary.Stat.Failures += summary.Stat.Failures + if err == nil { + stepResult.Success = true + } return stepResult, err } diff --git a/hrp/summary.go b/hrp/summary.go index a944d6a3..da3b0197 100644 --- a/hrp/summary.go +++ b/hrp/summary.go @@ -151,7 +151,7 @@ type TestCaseSummary struct { Stat *TestStepStat `json:"stat" yaml:"stat"` Time *TestCaseTime `json:"time" yaml:"time"` InOut *TestCaseInOut `json:"in_out" yaml:"in_out"` - Logs string `json:"logs,omitempty" yaml:"logs,omitempty"` // TODO + Logs interface{} `json:"logs,omitempty" yaml:"logs,omitempty"` Records []*StepResult `json:"records" yaml:"records"` RootDir string `json:"root_dir" yaml:"root_dir"` }