You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Appium Android:如何启动新Activity、切换Activity及TestNG获取测试结果

没问题,这两个问题我都帮你梳理清楚,结合你的代码片段给你具体方案:

一、Appium中完全可以在应用内切换Activity

Appium专门提供了API来实现应用内或跨应用的Activity切换,对于同一应用内的场景,操作起来很简单:

  1. 首先你可以通过driver.currentActivity()查看当前所在的Activity,确认切换前的状态;
  2. 使用driver.startActivity(appPackage, appActivity)方法直接切换到目标Activity。

结合你给出的包名和Activity名,代码示例如下:

// 假设你已经初始化好AndroidDriver实例driver
// 查看当前Activity
String currentActivity = driver.currentActivity();
System.out.println("Login 3333::>" + currentActivity);

// 切换到目标DashBoard Activity
String settingsAppPackageName = "com.xxx.xxx.xxxx.dashBoard";
String settingsAppActivityName = "com.xxxx.xxxx.xxx.xxx.DashBoard";
driver.startActivity(settingsAppPackageName, settingsAppActivityName);

// 验证切换是否成功
System.out.println("切换后的Activity::>" + driver.currentActivity());

如果是同一应用内的Activity,也可以通过driver.getCapabilities().getCapability("appPackage")动态获取包名,避免硬编码,让代码更灵活。

二、TestNG中获取上一个测试用例的执行结果

TestNG提供了多种方式实现这个需求,这里给你两种最实用的方案:

方案1:通过ITestContext共享测试状态

你可以在每个测试方法中将自己的执行结果存入ITestContext的属性中,下一个测试方法直接从上下文取出上一个的结果。结合你的loginTC2方法,修改后示例:

@Test(priority = 1)
public void loginTC2(ITestContext context) {
    boolean testPassed = false;
    try {
        System.out.println("Login 3333::>" + driver.currentActivity());
        // 这里编写你的登录测试逻辑
        // 假设测试执行通过
        testPassed = true;
        Assert.assertTrue(testPassed, "登录测试失败");
    } catch (Exception e) {
        testPassed = false;
        Assert.fail("登录测试抛出异常: " + e.getMessage());
    } finally {
        // 将当前测试结果存入TestNG上下文
        context.setAttribute("previousTestResult", testPassed);
    }
}

@Test(priority = 2)
public void nextTest(ITestContext context) {
    // 从上下文获取上一个测试的结果
    Boolean previousResult = (Boolean) context.getAttribute("previousTestResult");
    if (previousResult != null) {
        if (previousResult) {
            System.out.println("上一个测试用例(loginTC2)执行成功,继续当前测试");
            // 编写当前测试逻辑
        } else {
            System.out.println("上一个测试用例(loginTC2)执行失败,可选择跳过或执行降级逻辑");
            // 比如跳过当前测试
            throw new SkipException("因上一个测试失败,跳过当前测试");
        }
    }
}

方案2:使用TestNG监听器全局监听

如果需要全局跟踪所有测试的执行结果,可以实现IInvokedMethodListener接口,在监听器中记录每个测试的状态,后续测试可以从监听器获取结果:

// 自定义测试结果监听器
public class TestResultTracker implements IInvokedMethodListener {
    private final Map<String, Boolean> testResultMap = new HashMap<>();

    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
        // 记录每个测试方法的执行结果,key为方法名
        testResultMap.put(method.getTestMethod().getMethodName(), testResult.isSuccess());
    }

    // 获取上一个测试的结果
    public Boolean getPreviousTestResult(String currentMethodName, List<String> testOrder) {
        int currentIdx = testOrder.indexOf(currentMethodName);
        if (currentIdx > 0) {
            String prevMethodName = testOrder.get(currentIdx - 1);
            return testResultMap.get(prevMethodName);
        }
        return null;
    }
}

然后在你的测试类上添加监听器注解:

@Listeners(TestResultTracker.class)
public class YourTestClass {
    // 测试方法...

    @Test(priority = 2)
    public void nextTest(ITestContext context) {
        // 获取监听器实例
        TestResultTracker tracker = context.getSuite().getListeners().stream()
                .filter(listener -> listener instanceof TestResultTracker)
                .map(TestResultTracker.class::cast)
                .findFirst()
                .orElse(null);

        if (tracker != null) {
            // 获取测试方法执行顺序
            List<String> testOrder = context.getAllTestMethods()
                    .stream()
                    .map(ITestNGMethod::getMethodName)
                    .collect(Collectors.toList());
            Boolean prevResult = tracker.getPreviousTestResult("nextTest", testOrder);
            // 处理上一个测试结果
        }
    }
}

内容的提问来源于stack exchange,提问作者NikhilReddy

火山引擎 最新活动