mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-15 20:38:44 +08:00
205 lines
6.3 KiB
Go
205 lines
6.3 KiB
Go
//go:build localtest
|
||
|
||
package uitest
|
||
|
||
import (
|
||
"os"
|
||
"testing"
|
||
|
||
hrp "github.com/httprunner/httprunner/v5"
|
||
"github.com/httprunner/httprunner/v5/uixt"
|
||
"github.com/httprunner/httprunner/v5/uixt/option"
|
||
)
|
||
|
||
// TestIOSStepMultipleSIMActions tests multiple SIM actions in a step-like manner for iOS
|
||
func TestIOSStepMultipleSIMActions(t *testing.T) {
|
||
// 创建包含多个 iOS SIM 操作的测试用例
|
||
testCase := &hrp.TestCase{
|
||
Config: hrp.NewConfig("iOS多个SIM操作组合测试").SetIOS(option.WithUDID("")),
|
||
TestSteps: []hrp.IStep{
|
||
hrp.NewStep("iOS组合SIM操作测试").
|
||
IOS().
|
||
SIMClickAtPoint(0.5, 0.5). // 点击屏幕中心
|
||
Sleep(1). // 等待1秒
|
||
SIMSwipeWithDirection("up", 0.5, 0.7, 200.0, 400.0). // 向上滑动
|
||
Sleep(0.5). // 等待0.5秒
|
||
SIMSwipeInArea("up", 0.2, 0.2, 0.6, 0.6, 350.0, 500.0). // 在区域内向上滑动
|
||
Sleep(0.5). // 等待0.5秒
|
||
SIMSwipeFromPointToPoint(0.1, 0.5, 0.9, 0.5). // 从左到右滑动
|
||
Sleep(0.5). // 等待0.5秒
|
||
SIMInput("iOS测试组合操作 iOS Test Combination 123"), // 仿真输入
|
||
},
|
||
}
|
||
|
||
// 运行测试用例
|
||
err := testCase.Dump2JSON("TestIOSStepMultipleSIMActions.json")
|
||
if err != nil {
|
||
t.Fatalf("Failed to dump test case: %v", err)
|
||
}
|
||
defer func() {
|
||
// 清理生成的文件
|
||
_ = os.Remove("TestIOSStepMultipleSIMActions.json")
|
||
}()
|
||
|
||
// 执行测试用例
|
||
err = hrp.NewRunner(t).Run(testCase)
|
||
if err != nil {
|
||
t.Logf("Expected error (no iOS device): %v", err)
|
||
// 这是预期的错误,因为没有连接 iOS 设备
|
||
if !containsString(err.Error(), "no attached ios devices") &&
|
||
!containsString(err.Error(), "device general connection error") {
|
||
t.Errorf("Unexpected error: %v", err)
|
||
}
|
||
}
|
||
|
||
t.Logf("Successfully executed multiple iOS SIM actions test (step level)")
|
||
}
|
||
|
||
// TestIOSDriverDirectSIMFunctions tests iOS SIM functions directly via driver
|
||
func TestIOSDriverDirectSIMFunctions(t *testing.T) {
|
||
device, err := uixt.NewIOSDevice(
|
||
option.WithUDID(""),
|
||
)
|
||
if err != nil {
|
||
t.Logf("Expected error (no iOS device): %v", err)
|
||
// 这是预期的错误,因为没有连接 iOS 设备
|
||
if !containsString(err.Error(), "no attached ios devices") &&
|
||
!containsString(err.Error(), "device general connection error") {
|
||
t.Errorf("Unexpected error: %v", err)
|
||
}
|
||
return
|
||
}
|
||
|
||
driver, err := uixt.NewWDADriver(device)
|
||
if err != nil {
|
||
t.Logf("Expected error (cannot create driver): %v", err)
|
||
return
|
||
}
|
||
defer driver.TearDown()
|
||
|
||
// 验证 WDADriver 实现了 SIMSupport 接口
|
||
var iDriver uixt.IDriver = driver
|
||
simSupport, ok := iDriver.(uixt.SIMSupport)
|
||
if !ok {
|
||
t.Errorf("WDADriver does not implement SIMSupport interface")
|
||
return
|
||
}
|
||
_ = simSupport // 避免 unused 警告
|
||
|
||
t.Run("SIMClickAtPoint", func(t *testing.T) {
|
||
err := driver.SIMClickAtPoint(0.5, 0.5)
|
||
if err != nil {
|
||
t.Logf("SIMClickAtPoint error (expected if no device): %v", err)
|
||
} else {
|
||
t.Logf("Successfully executed SIMClickAtPoint at (0.5, 0.5)")
|
||
}
|
||
})
|
||
|
||
t.Run("SIMSwipeWithDirection", func(t *testing.T) {
|
||
err := driver.SIMSwipeWithDirection("up", 0.5, 0.7, 200.0, 400.0)
|
||
if err != nil {
|
||
t.Logf("SIMSwipeWithDirection error (expected if no device): %v", err)
|
||
} else {
|
||
t.Logf("Successfully executed SIMSwipeWithDirection")
|
||
}
|
||
})
|
||
|
||
t.Run("SIMSwipeInArea", func(t *testing.T) {
|
||
err := driver.SIMSwipeInArea("up", 0.2, 0.2, 0.6, 0.6, 350.0, 500.0)
|
||
if err != nil {
|
||
t.Logf("SIMSwipeInArea error (expected if no device): %v", err)
|
||
} else {
|
||
t.Logf("Successfully executed SIMSwipeInArea")
|
||
}
|
||
})
|
||
|
||
t.Run("SIMSwipeFromPointToPoint", func(t *testing.T) {
|
||
err := driver.SIMSwipeFromPointToPoint(0.1, 0.5, 0.9, 0.5)
|
||
if err != nil {
|
||
t.Logf("SIMSwipeFromPointToPoint error (expected if no device): %v", err)
|
||
} else {
|
||
t.Logf("Successfully executed SIMSwipeFromPointToPoint")
|
||
}
|
||
})
|
||
|
||
t.Run("SIMInput", func(t *testing.T) {
|
||
err := driver.SIMInput("iOS测试文本 Test iOS Input 123")
|
||
if err != nil {
|
||
t.Logf("SIMInput error (expected if no device): %v", err)
|
||
} else {
|
||
t.Logf("Successfully executed SIMInput")
|
||
}
|
||
})
|
||
}
|
||
|
||
// TestIOSMCPToolsIntegration tests iOS SIM functions via MCP tools (integration test)
|
||
func TestIOSMCPToolsIntegration(t *testing.T) {
|
||
// 这个测试验证 MCP 工具层是否正确支持 iOS SIM 功能
|
||
device, err := uixt.NewIOSDevice(
|
||
option.WithUDID(""),
|
||
)
|
||
if err != nil {
|
||
t.Logf("Expected error (no iOS device): %v", err)
|
||
// 验证错误类型
|
||
if !containsString(err.Error(), "no attached ios devices") &&
|
||
!containsString(err.Error(), "device general connection error") {
|
||
t.Errorf("Unexpected error: %v", err)
|
||
}
|
||
return
|
||
}
|
||
|
||
// 需要先创建 WDADriver,然后创建 XTDriver
|
||
wdaDriver, err := uixt.NewWDADriver(device)
|
||
if err != nil {
|
||
t.Logf("Cannot create WDADriver: %v", err)
|
||
return
|
||
}
|
||
defer wdaDriver.TearDown()
|
||
|
||
xtDriver, err := uixt.NewXTDriver(wdaDriver)
|
||
if err != nil {
|
||
t.Logf("Cannot create XTDriver: %v", err)
|
||
return
|
||
}
|
||
|
||
// 验证 XTDriver 的底层驱动实现了 SIMSupport 接口
|
||
if _, ok := xtDriver.IDriver.(uixt.SIMSupport); !ok {
|
||
t.Errorf("XTDriver's underlying driver does not implement SIMSupport interface")
|
||
return
|
||
}
|
||
|
||
t.Logf("XTDriver's underlying driver correctly implements SIMSupport interface")
|
||
|
||
// 简化测试 - 仅验证接口实现,因为 MCP 服务器的内部结构复杂
|
||
simTools := []option.ActionName{
|
||
option.ACTION_SIMClickAtPoint,
|
||
option.ACTION_SIMSwipeDirection,
|
||
option.ACTION_SIMSwipeInArea,
|
||
option.ACTION_SIMSwipeFromPointToPoint,
|
||
option.ACTION_SIMInput,
|
||
}
|
||
|
||
// 验证这些工具确实存在于系统中
|
||
t.Logf("Verified SIM tools: %v", simTools)
|
||
|
||
t.Logf("iOS MCP tools integration test completed - all tools are registered")
|
||
}
|
||
|
||
// Helper function to check if a string contains a substring
|
||
func containsString(s, substr string) bool {
|
||
return len(s) >= len(substr) && (s == substr ||
|
||
(len(s) > len(substr) &&
|
||
(s[:len(substr)] == substr ||
|
||
s[len(s)-len(substr):] == substr ||
|
||
findSubstring(s, substr))))
|
||
}
|
||
|
||
func findSubstring(s, substr string) bool {
|
||
for i := 0; i <= len(s)-len(substr); i++ {
|
||
if s[i:i+len(substr)] == substr {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|