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

时间:2017-07-10 20:42:41

标签: android testing android-espresso

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

好的,在我问这个问题和零活动8个月后,我甚至获得了“Tumbleweed”的成就。

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

<强>自动应答

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

示例简化

我创建了'CommunicationProxy'界面

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

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

空闲资源?

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

<强>片状

我的测试运行正常,但我理解它可能有多么脆弱,无论如何我实现了这种方法来简化我的生活并且不会每次手动进行回归测试,我不打算在CI上运行它或类似的东西