测试两个设备之间的交互(通过 Espresso)

Testing interraction between two devices (via Espresso)

我现在正在开发 P2P 聊天应用程序(Android)。而且我想添加一些 UI 测试,以便在每次更改大部分内容后都不会手动检查所有用例(sending/receiving 消息、连接请求、断开连接、失去连接等)我的代码。

因此,我最初的想法是为两台设备创建两套 Espresso 测试,一套将发送请求和消息,另一套将作为接收器并同时 运行 它们。这只是抽象的想法,我的问题是:是否可以 运行 两组相互交互的测试?即使答案是 "yes",我应该实施这种方法,还是应该以某种方式模拟连接机制并仅在一台设备上进行 运行 测试? (如果这种方法没问题,我该如何实施?)你能建议一种 right/better 方法吗?

我没有找到任何类似的问题,我认为这可能是愚蠢的,答案对于每个有丰富测试经验的人来说都是显而易见的。无论如何,这个答案可能对其他处于类似情况的人有用。

提前致谢。

好的,我们来了,在我提出这个问题 8 个月后零 activity,我什至获得了 'Tumbleweed' 成就。

我不会说我已经解决了测试两个设备之间通信的问题,但至少我已经实现了一些有效的东西,我想与可能需要它的任何人分享。

自动回复

看起来没有一种简单的方法可以 运行 同时在两个相互通信的设备上进行两个不同的测试。因此,我决定实施通过脚本工作的自动回复器。基本上,测试会发送一条文本消息,例如 "respond_me",自动回复器会捕获它并通过另一条文本进行响应,例如 "response",然后测试会检查是否已收到消息。

样本已简化

我创建了'CommunicationProxy'界面

interface CommunicationProxy {
    fun onMessageReceived(message: ChatMessage)
    fun onMessageSent(message: ChatMessage)
} 

并在我接收消息事件的 class 中调用它的方法。

private var proxy: CommunicationProxy? = ...

override fun onMessageReceived(message: ChatMessage) {
    proxy?.onMessageReceived(message)
    messageListener?.onMessageReceived(message)
}

override fun onMessageSent(message: ChatMessage) {
    proxy?.onMessageSent(message)
    messageListener?.onMessageSent(message)
}

对于 debugrelease 构建类型,此代理是一个空接口实现:

class EmptyProxy : CommunicationProxy {
    override fun onMessageReceived(message: ChatMessage) {
    }
    override fun onMessageSent(message: ChatMessage) {
    }
}

我又添加了一种构建类型 autoresponder 并使用一些逻辑实例化 CommunicationProxy 实现:

proxy = if (BuildConfig.AUTORESPONDER) AutoresponderProxy(service) else EmptyProxy()

AutoresponderProxy:

class AutoresponderProxy(private val service: ConnectionService?) : CommunicationProxy {

    companion object {

        const val COMMAND_SEND_TEXT = "-send_text"

        const val RESPONSE_RECEIVED = "+text_message"
    }

    override fun onMessageReceived(message: ChatMessage) {

        service?.let {

            when {
                message.text == COMMAND_SEND_TEXT -> {
                    it.sendMessage(RESPONSE_RECEIVED)
                }

                ...
            }
        }
    }

    override fun onMessageSent(message: ChatMessage) {
    }
}

我在一台设备和另一台设备上安装 autoresponder 运行s Espresso 测试,在 EditText 中输入“-send_text”文本并按下 'Send' 按钮,然后等待'+text_message' 文本出现在 RecyclerView 中。

空闲资源?

这个示例非常简单,我的 CommunicationProxy 接口有 25 个方法,我尝试集成 IdlingResources 但我无法管理所有这些回调。我使用 Thread.sleep(...) 等待响应。

片状

我的测试 运行 很好,但我知道它可能有多不稳定,无论如何我实施这种方法是为了简化我的生活并且不每次都手动进行回归测试,我不打算 运行 它在 CI 或类似的东西上。