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

Vas*_*dan 4 testing android android-espresso

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

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

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

提前致谢。

Vas*_*dan 5

好吧,我们到了,在我提出这个问题并且零活动 8 个月后,我什至获得了“风滚草”成就。

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

自动回复器

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

样本被简化

我创建了“CommunicationProxy”接口

interface CommunicationProxy {
    fun onMessageReceived(message: ChatMessage)
    fun onMessageSent(message: ChatMessage)
} 
Run Code Online (Sandbox Code Playgroud)

并在我接收消息传递事件的类中调用其方法。

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)
}
Run Code Online (Sandbox Code Playgroud)

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

class EmptyProxy : CommunicationProxy {
    override fun onMessageReceived(message: ChatMessage) {
    }
    override fun onMessageSent(message: ChatMessage) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加了另一种构建类型autoresponderCommunicationProxy使用一些逻辑实例化实现:

proxy = if (BuildConfig.AUTORESPONDER) AutoresponderProxy(service) else EmptyProxy()
Run Code Online (Sandbox Code Playgroud)

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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

autoresponder在一台设备上安装,另一台设备运行 Espresso 测试,将“-send_text”文本键入 EditText 并按“发送”按钮,然后等待“+text_message”文本出现在 RecyclerView 中。

资源闲置?

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

片状

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