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

标签 android testing android-espresso

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

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

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

提前致谢。

最佳答案

好吧,我们来了,在我提出这个问题和零 Activity 8 个月后,我什至获得了“风滚草”成就。

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

自动回复

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

示例已简化

我创建了“CommunicationProxy”接口(interface)

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

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

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 构建类型,此代理是一个空接口(interface)实现:

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

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

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

自动回复代理:

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,另一台设备运行 Espresso 测试,在 EditText 中键入“-send_text”文本并按下“发送”按钮,然后等待 RecyclerView 中出现“+text_message”文本。

闲置资源?

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

片状

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

关于android - 测试两个设备之间的交互(通过 Espresso),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021251/

相关文章:

android - Dagger 2,@set :Inject and @Inject有什么区别

java - 如何创建带有标题和背景形状的 TextView

java - 为什么我无法将数据从 RecyclerView 传递到另一个 RecyclerView - AndroidX

java - 如何使用 Espresso 测试抽象类?

Android - 如何使用 Espresso 单击抽屉导航上的项目?

java - 使用同一行上的按钮更改 ListView 中的数字

mysql - Junit:测试查询类

unit-testing - 我可以做些什么来改进我的测试?

javascript - 如何在 Cypress 中设置/定义环境变量和 api_Server?

android - uiController.loopMainThreadForAtLeast 与 Thread.sleep 有何不同?