From 191235e3f286a534c6b127069b7b8c684d1a1cc4 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Wed, 25 Jun 2025 20:17:27 +0800 Subject: [PATCH] add examples --- examples/game/2048/game_2048.json | 46 +++++++++++++++++++ examples/game/2048/main_test.go | 43 ++++++++++++++++++ examples/game/llk/game_llk.json | 46 +++++++++++++++++++ examples/game/llk/main_test.go | 40 +++++++++++++++++ internal/version/VERSION | 2 +- tests/step_ui_test.go | 74 ------------------------------- 6 files changed, 176 insertions(+), 75 deletions(-) create mode 100644 examples/game/2048/game_2048.json create mode 100644 examples/game/2048/main_test.go create mode 100644 examples/game/llk/game_llk.json diff --git a/examples/game/2048/game_2048.json b/examples/game/2048/game_2048.json new file mode 100644 index 00000000..4eb28516 --- /dev/null +++ b/examples/game/2048/game_2048.json @@ -0,0 +1,46 @@ +{ + "config": { + "name": "2048 小游戏自动化测试", + "ai_options": { + "llm_service": "doubao-1.5-ui-tars-250328" + } + }, + "teststeps": [ + { + "name": "启动抖音「2048经典」小游戏", + "android": { + "os_type": "android", + "actions": [ + { + "method": "start_to_goal", + "params": "启动抖音,搜索「2048经典」小游戏,并启动游戏", + "options": {} + } + ] + }, + "validate": [ + { + "check": "ui_ai", + "assert": "ai_assert", + "expect": "当前位于抖音「2048」小游戏页面", + "msg": "assert ai prompt [当前位于抖音「2048」小游戏页面] failed" + } + ] + }, + { + "name": "开始游戏", + "android": { + "os_type": "android", + "actions": [ + { + "method": "start_to_goal", + "params": "2048 是一款数字合并类的益智小游戏,以下是它的基本规则:\n1、游戏目标:在一个 4x4 的网格中,通过合并相同数字的方块,最终得到一个数值为 2048 的方块。当然,若你能继续合并,也可追求更高的数字。\n2、初始状态:游戏开始时,网格中会随机出现两个数字为 2 或 4 的方块。\n3、移动操作:玩家可以选择上、下、左、右四个方向进行移动。每次移动时,所有方块会朝着指定方向滑动,直到碰到边界或其他方块。\n4、合并规则:当两个相同数字的方块在移动过程中相遇时,它们会合并成一个新的方块,新方块的数值为原来两个方块数值之和。例如,两个 2 合并成一个 4,两个 4 合并成一个 8,依此类推。\n5、新方块生成:每次移动结束后,网格中会随机出现一个新的数字为 2 或 4 的方块。\n6、注意事项:若连续多次滑动无法生效,请调整策略;例如,向上无法滑动,可以尝试向下滑;向左无法滑动,可以尝试向右滑。\n7、游戏结束:当网格被填满,且没有可合并的方块时,游戏结束,停止游戏。\n\n请严格按照以上游戏规则,开始游戏\n", + "options": { + "max_retry_times": 100 + } + } + ] + } + } + ] +} diff --git a/examples/game/2048/main_test.go b/examples/game/2048/main_test.go new file mode 100644 index 00000000..304fd3a1 --- /dev/null +++ b/examples/game/2048/main_test.go @@ -0,0 +1,43 @@ +package game_2048 + +import ( + "testing" + + hrp "github.com/httprunner/httprunner/v5" + "github.com/httprunner/httprunner/v5/uixt/option" + "github.com/stretchr/testify/require" +) + +func TestGame2048(t *testing.T) { + userInstruction := `2048 是一款数字合并类的益智小游戏,以下是它的基本规则: +1、游戏目标:在一个 4x4 的网格中,通过合并相同数字的方块,最终得到一个数值为 2048 的方块。当然,若你能继续合并,也可追求更高的数字。 +2、初始状态:游戏开始时,网格中会随机出现两个数字为 2 或 4 的方块。 +3、移动操作:玩家可以选择上、下、左、右四个方向进行移动。每次移动时,所有方块会朝着指定方向滑动,直到碰到边界或其他方块。 +4、合并规则:当两个相同数字的方块在移动过程中相遇时,它们会合并成一个新的方块,新方块的数值为原来两个方块数值之和。例如,两个 2 合并成一个 4,两个 4 合并成一个 8,依此类推。 +5、新方块生成:每次移动结束后,网格中会随机出现一个新的数字为 2 或 4 的方块。 +6、注意事项:若连续多次滑动无法生效,请调整策略;例如,向上无法滑动,可以尝试向下滑;向左无法滑动,可以尝试向右滑。 +7、游戏结束:当网格被填满,且没有可合并的方块时,游戏结束,停止游戏。 + +请严格按照以上游戏规则,开始游戏 +` + + testCase := &hrp.TestCase{ + Config: hrp.NewConfig("2048 小游戏自动化测试"). + SetLLMService(option.DOUBAO_1_5_UI_TARS_250328), + TestSteps: []hrp.IStep{ + hrp.NewStep("启动抖音「2048经典」小游戏"). + Android(). + StartToGoal("启动抖音,搜索「2048经典」小游戏,并启动游戏"). + Validate(). + AssertAI("当前位于抖音「2048」小游戏页面"), + hrp.NewStep("开始游戏"). + Android(). + StartToGoal(userInstruction, option.WithMaxRetryTimes(100)), + }, + } + err := testCase.Dump2JSON("game_2048.json") + require.Nil(t, err) + + // err = hrp.NewRunner(t).Run(testCase) + // assert.Nil(t, err) +} diff --git a/examples/game/llk/game_llk.json b/examples/game/llk/game_llk.json new file mode 100644 index 00000000..07e39089 --- /dev/null +++ b/examples/game/llk/game_llk.json @@ -0,0 +1,46 @@ +{ + "config": { + "name": "连连看小游戏自动化测试", + "ai_options": { + "llm_service": "doubao-1.5-thinking-vision-pro-250428" + } + }, + "teststeps": [ + { + "name": "启动抖音「连了又连」小游戏", + "android": { + "os_type": "android", + "actions": [ + { + "method": "start_to_goal", + "params": "启动抖音,搜索「连了又连」小游戏,并启动游戏", + "options": {} + } + ] + }, + "validate": [ + { + "check": "ui_ai", + "assert": "ai_assert", + "expect": "当前位于抖音「连了又连」小游戏页面", + "msg": "assert ai prompt [当前位于抖音「连了又连」小游戏页面] failed" + } + ] + }, + { + "name": "开始游戏", + "android": { + "os_type": "android", + "actions": [ + { + "method": "start_to_goal", + "params": "连连看是一款经典的益智消除类小游戏,通常以图案或图标为主要元素。以下是连连看的基本规则说明:\n1. 游戏目标: 玩家需要通过连接相同的图案或图标,将它们从游戏界面中消除。\n2. 连接规则:\n- 两个相同的图案可以通过不超过三条直线连接。\n- 连接线可以水平或垂直,但不能斜线,也不能跨过其他图案。\n- 连接线的转折次数不能超过两次。\n3. 游戏界面:\n- 游戏界面是一个矩形区域,内含多个图案或图标,排列成行和列;图案或图标在未选中状态下背景为白色,选中状态下背景为绿色。\n- 游戏界面下方是道具区域,共有 3 种道具,从左到右分别是:「高亮显示」、「随机打乱」、「减少种类」。\n4、游戏攻略:建议多次使用道具,可以降低游戏难度\n- 优先使用「减少种类」道具,可以将图案种类随机减少一种\n- 遇到困难时,推荐使用「随机打乱」道具,可以获得很多新的消除机会\n- 观看广告视频,待屏幕右上角出现「领取成功」后,点击其右侧的 X 即可关闭广告,继续游戏\n\n请严格按照以上游戏规则,开始游戏\n", + "options": { + "max_retry_times": 100 + } + } + ] + } + } + ] +} diff --git a/examples/game/llk/main_test.go b/examples/game/llk/main_test.go index 981318ba..a7eb28fb 100644 --- a/examples/game/llk/main_test.go +++ b/examples/game/llk/main_test.go @@ -7,6 +7,7 @@ import ( "os" "testing" + hrp "github.com/httprunner/httprunner/v5" "github.com/httprunner/httprunner/v5/internal/builtin" "github.com/httprunner/httprunner/v5/uixt/ai" "github.com/httprunner/httprunner/v5/uixt/option" @@ -15,6 +16,45 @@ import ( "github.com/stretchr/testify/require" ) +func TestGameLianliankan(t *testing.T) { + userInstruction := `连连看是一款经典的益智消除类小游戏,通常以图案或图标为主要元素。以下是连连看的基本规则说明: +1. 游戏目标: 玩家需要通过连接相同的图案或图标,将它们从游戏界面中消除。 +2. 连接规则: +- 两个相同的图案可以通过不超过三条直线连接。 +- 连接线可以水平或垂直,但不能斜线,也不能跨过其他图案。 +- 连接线的转折次数不能超过两次。 +3. 游戏界面: +- 游戏界面是一个矩形区域,内含多个图案或图标,排列成行和列;图案或图标在未选中状态下背景为白色,选中状态下背景为绿色。 +- 游戏界面下方是道具区域,共有 3 种道具,从左到右分别是:「高亮显示」、「随机打乱」、「减少种类」。 +4、游戏攻略:建议多次使用道具,可以降低游戏难度 +- 优先使用「减少种类」道具,可以将图案种类随机减少一种 +- 遇到困难时,推荐使用「随机打乱」道具,可以获得很多新的消除机会 +- 观看广告视频,待屏幕右上角出现「领取成功」后,点击其右侧的 X 即可关闭广告,继续游戏 + +请严格按照以上游戏规则,开始游戏 +` + + testCase := &hrp.TestCase{ + Config: hrp.NewConfig("连连看小游戏自动化测试"). + SetLLMService(option.DOUBAO_1_5_THINKING_VISION_PRO_250428), + TestSteps: []hrp.IStep{ + hrp.NewStep("启动抖音「连了又连」小游戏"). + Android(). + StartToGoal("启动抖音,搜索「连了又连」小游戏,并启动游戏"). + Validate(). + AssertAI("当前位于抖音「连了又连」小游戏页面"), + hrp.NewStep("开始游戏"). + Android(). + StartToGoal(userInstruction, option.WithMaxRetryTimes(100)), + }, + } + err := testCase.Dump2JSON("game_llk.json") + require.Nil(t, err) + + // err = hrp.NewRunner(t).Run(testCase) + // assert.Nil(t, err) +} + // convertToGameElementFromQueryResult converts AI query result to GameElement for testing func convertToGameElementFromQueryResult(result *ai.QueryResult) (*GameElement, error) { if result == nil { diff --git a/internal/version/VERSION b/internal/version/VERSION index 56ecd3e7..bdc3e786 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2506251728 +v5.0.0-beta-2506252017 diff --git a/tests/step_ui_test.go b/tests/step_ui_test.go index c563011c..624c780f 100644 --- a/tests/step_ui_test.go +++ b/tests/step_ui_test.go @@ -8,7 +8,6 @@ import ( hrp "github.com/httprunner/httprunner/v5" "github.com/httprunner/httprunner/v5/uixt/option" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) // GameInfo 定义游戏界面分析的输出格式 @@ -111,79 +110,6 @@ func TestAndroidAction(t *testing.T) { assert.Nil(t, err) } -func TestGameLianliankan(t *testing.T) { - userInstruction := `连连看是一款经典的益智消除类小游戏,通常以图案或图标为主要元素。以下是连连看的基本规则说明: -1. 游戏目标: 玩家需要通过连接相同的图案或图标,将它们从游戏界面中消除。 -2. 连接规则: -- 两个相同的图案可以通过不超过三条直线连接。 -- 连接线可以水平或垂直,但不能斜线,也不能跨过其他图案。 -- 连接线的转折次数不能超过两次。 -3. 游戏界面: -- 游戏界面是一个矩形区域,内含多个图案或图标,排列成行和列;图案或图标在未选中状态下背景为白色,选中状态下背景为绿色。 -- 游戏界面下方是道具区域,共有 3 种道具,从左到右分别是:「高亮显示」、「随机打乱」、「减少种类」。 -4、游戏攻略:建议多次使用道具,可以降低游戏难度 -- 优先使用「减少种类」道具,可以将图案种类随机减少一种 -- 遇到困难时,推荐使用「随机打乱」道具,可以获得很多新的消除机会 -- 观看广告视频,待屏幕右上角出现「领取成功」后,点击其右侧的 X 即可关闭广告,继续游戏 - -请严格按照以上游戏规则,开始游戏 -` - - testCase := &hrp.TestCase{ - Config: hrp.NewConfig("连连看小游戏自动化测试"). - SetLLMService(option.DOUBAO_1_5_THINKING_VISION_PRO_250428), - TestSteps: []hrp.IStep{ - hrp.NewStep("启动抖音「连了又连」小游戏"). - Android(). - StartToGoal("启动抖音,搜索「连了又连」小游戏,并启动游戏"). - Validate(). - AssertAI("当前位于抖音「连了又连」小游戏页面"), - hrp.NewStep("开始游戏"). - Android(). - StartToGoal(userInstruction, option.WithMaxRetryTimes(100)), - }, - } - err := testCase.Dump2JSON("game_llk.json") - require.Nil(t, err) - - err = hrp.NewRunner(t).Run(testCase) - assert.Nil(t, err) -} - -func TestGame2048(t *testing.T) { - userInstruction := `2048 是一款数字合并类的益智小游戏,以下是它的基本规则: -1、游戏目标:在一个 4x4 的网格中,通过合并相同数字的方块,最终得到一个数值为 2048 的方块。当然,若你能继续合并,也可追求更高的数字。 -2、初始状态:游戏开始时,网格中会随机出现两个数字为 2 或 4 的方块。 -3、移动操作:玩家可以选择上、下、左、右四个方向进行移动。每次移动时,所有方块会朝着指定方向滑动,直到碰到边界或其他方块。 -4、合并规则:当两个相同数字的方块在移动过程中相遇时,它们会合并成一个新的方块,新方块的数值为原来两个方块数值之和。例如,两个 2 合并成一个 4,两个 4 合并成一个 8,依此类推。 -5、新方块生成:每次移动结束后,网格中会随机出现一个新的数字为 2 或 4 的方块。 -6、注意事项:若连续多次滑动无法生效,请调整策略;例如,向上无法滑动,可以尝试向下滑;向左无法滑动,可以尝试向右滑。 -7、游戏结束:当网格被填满,且没有可合并的方块时,游戏结束,停止游戏。 - -请严格按照以上游戏规则,开始游戏 -` - - testCase := &hrp.TestCase{ - Config: hrp.NewConfig("2048 小游戏自动化测试"). - SetLLMService(option.DOUBAO_1_5_UI_TARS_250328), - TestSteps: []hrp.IStep{ - hrp.NewStep("启动抖音「2048经典」小游戏"). - Android(). - StartToGoal("启动抖音,搜索「2048经典」小游戏,并启动游戏"). - Validate(). - AssertAI("当前位于抖音「2048」小游戏页面"), - hrp.NewStep("开始游戏"). - Android(). - StartToGoal(userInstruction, option.WithMaxRetryTimes(100)), - }, - } - err := testCase.Dump2JSON("game_2048.json") - require.Nil(t, err) - - // err = hrp.NewRunner(t).Run(testCase) - // assert.Nil(t, err) -} - func TestAIAction(t *testing.T) { testCase := &hrp.TestCase{ Config: hrp.NewConfig("run ui action with ai").