You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Appium测试聊天应用?安卓聊天App测试框架搭建疑问

如何用Appium+Java搭建安卓聊天应用测试框架?

兄弟,我刚好做过类似的安卓聊天应用自动化测试,给你梳理下可行的方案,不用纠结,其实没那么复杂~

一、设备/模拟器方案:不一定非要两台实体设备

你有几种选择,完全看你的测试需求和硬件条件:

  • 两台实体安卓设备(最稳定):直接把两台设备连到电脑,分别获取各自的udid,启动两个Appium会话就行,适合需要真实硬件场景的测试(比如摄像头拍图发消息、语音消息这类)。
  • 一台实体机+一个模拟器:实体机装客户端A,模拟器装客户端B,同样可以启动两个会话,成本低,大部分普通聊天场景(文字消息、表情)都能覆盖。
  • 两个模拟器:完全用模拟器跑,适合没有实体设备的情况,注意给模拟器分配足够的内存(比如每个至少2G),避免卡顿影响测试稳定性。

重点说一句:完全不需要创建两个独立项目,一个Java项目里就能轻松管理两个Appium Driver实例,分别控制两个客户端。

二、核心框架思路:单项目多Driver实例

你只需要一个Java项目(用Maven或Gradle管理依赖就行),核心逻辑是初始化两个AppiumDriver对象,分别对应用户A和用户B,然后在测试用例里让它们完成聊天交互。

给你个简单的代码示例参考:

1. Driver管理工具类

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.MalformedURLException;
import java.net.URL;

public class ChatDriverManager {
    // 初始化用户A的Driver(连接设备A)
    public static AppiumDriver<MobileElement> getDriverForUserA() throws MalformedURLException {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("deviceName", "你的实体机A名称");
        caps.setCapability("udid", "设备A的udid(通过adb devices查看)");
        caps.setCapability("platformName", "Android");
        caps.setCapability("appPackage", "你的聊天App包名(比如com.yourcompany.chat)");
        caps.setCapability("appActivity", "App的启动页Activity(比如com.yourcompany.chat.ui.LaunchActivity)");
        caps.setCapability("noReset", true); // 保留登录状态,不用每次重新登录
        // 连接第一个Appium服务(端口4723)
        return new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), caps);
    }

    // 初始化用户B的Driver(连接设备B)
    public static AppiumDriver<MobileElement> getDriverForUserB() throws MalformedURLException {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("deviceName", "模拟器/实体机B名称");
        caps.setCapability("udid", "设备B的udid");
        caps.setCapability("platformName", "Android");
        caps.setCapability("appPackage", "你的聊天App包名");
        caps.setCapability("appActivity", "App的启动页Activity");
        caps.setCapability("noReset", true);
        // 连接第二个Appium服务(端口4724,避免和第一个服务冲突)
        return new AndroidDriver<>(new URL("http://127.0.0.1:4724/wd/hub"), caps);
    }
}

2. 测试用例示例(用TestNG)

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.net.MalformedURLException;

public class ChatTest {
    @Test
    public void testTwoWayChat() throws MalformedURLException {
        // 初始化两个Driver
        AppiumDriver<MobileElement> driverA = ChatDriverManager.getDriverForUserA();
        AppiumDriver<MobileElement> driverB = ChatDriverManager.getDriverForUserB();

        // 用户A发送消息
        driverA.findElementById("com.yourcompany.chat:id/et_input").sendKeys("Hey, this is User A!");
        driverA.findElementById("com.yourcompany.chat:id/btn_send").click();

        // 等待用户B收到消息并验证内容
        WebDriverWait wait = new WebDriverWait(driverB, 10);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("com.yourcompany.chat:id/tv_message_content")));
        String receivedByB = driverB.findElementById("com.yourcompany.chat:id/tv_message_content").getText();
        Assert.assertEquals(receivedByB, "Hey, this is User A!");

        // 用户B回复消息
        driverB.findElementById("com.yourcompany.chat:id/et_input").sendKeys("Hi User A, this is User B!");
        driverB.findElementById("com.yourcompany.chat:id/btn_send").click();

        // 等待用户A收到回复并验证
        wait = new WebDriverWait(driverA, 10);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("com.yourcompany.chat:id/tv_message_content")));
        String receivedByA = driverA.findElementById("com.yourcompany.chat:id/tv_message_content").getText();
        Assert.assertEquals(receivedByA, "Hi User A, this is User B!");

        // 关闭Driver
        driverA.quit();
        driverB.quit();
    }
}

三、关键注意事项

  • 启动多个Appium服务:同时控制两个设备时,建议启动两个Appium服务,分别用不同的端口(比如4723和4724),避免会话冲突。启动命令很简单:
    appium -p 4723  # 第一个服务
    appium -p 4724  # 第二个服务
    
  • 保留登录状态:设置noReset=true可以让App保留之前的登录状态,不用每次测试都重复登录,大大节省时间。如果需要测试登录流程,再改成noReset=false。
  • 用显式等待代替sleep:聊天消息的收发有网络延迟,一定要用WebDriverWait做显式等待,不要用Thread.sleep(),不然测试很容易不稳定。
  • 元素定位优先用稳定方式:优先用id定位元素,其次是稳定的xpath,尽量避免用坐标定位,不然换个屏幕尺寸测试就失效了。
  • 多线程优化:如果用TestNG,可以把测试方法设置为多线程执行,让两个用户的操作更贴近真实场景(比如用户A发送消息的同时,用户B正在浏览聊天列表)。

四、关于“是否需要两个独立项目”的结论

完全不需要!一个Java项目就足够了,把Driver管理、测试用例、页面元素定位(可以用Page Object模式优化)都放在同一个项目里,维护起来非常方便,不用来回切换项目。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:53:30