Skip to content
📔 阅读量:

远程交互式控制

在用例执行过程中控制远程机器执行复杂的 UI 操作或命令行操作。

在远程测试机上部署一个完整的 YouQu 环境以提供 UI 交互的基础能力,然后将这些基础能力通过 RPC 服务的方式提供出来,在服务端通过调用 RPC 接口从而控制远程机器执行用例步骤。

slaves对象提供远程机器信息

slaves 是 YouQu 提供的一个全局对象,它保存了远程测试机的信息列表;

机器信息有 2 种方式传入:

  • 命令行

    shell
    youqu manage.py run --slaves root@192.168.1.1:password1

    多个机器信息用 / 分割:root@192.168.1.1:password1/root@192.168.1.2:password2

  • 配置文件

    setting/globalconfig.ini 里面:

    ini
    ;=============================== SLAVE CONFIG ===================================
    ;附属的测试机,用例步骤中与其他机器进行交互
    ;        ┌─ slave ${user}@${ip}:${password}
    ; master ┼─ slave mikigo@192.168.8.11:admin123
    ;        └─ slave ${user}@${ip}
    ;如果${password}和前面配置项PASSWORD一样,可以不传:${user}@${ip}
    ;多个机器之间用斜线分割:${user}@${ip}:${password}/${user}@${ip}
    SLAVES =

3个Remote远程对象

Remote.rdog

Remote.rdog 仅用于属性定位相关操作;

python
# remote_widget.py

from src.remotectl.remote import Remote


class RemoteWidget(Remote):

    def click_xxx_element_by_attr(self, element):
        self.rdog.element_click(element)

rdog 对象包含了 DogUtils 所有的方法:

调用:

python
class RemoteWidget(Remote):

    def click_xxx_element_by_attr(self, element):
        self.rdog.element_click(element)

if __name__ == '__main__':
    r = RemoteWidget(
        user="root",
        ip="192.196.1.1",
        password="xxx",
    )
    r.click_xxx_element_by_attr("xxx")

Remote.rctl

Remote.rctl 用于其他操作;

python
from src.remotectl.remote import Remote


class RemoteWidget(Remote):

    def start_terminal(self):
        """快捷键启动终端"""
        self.rctl.ctrl_alt_t()

调用:

python
class RemoteWidget(Remote):

    def start_terminal(self):
        self.rctl.ctrl_alt_t()

if __name__ == '__main__':
    r = RemoteWidget(
        user="root",
        ip="192.196.1.1",
        password="xxx",
    )
    r.start_terminal()

跨过 rctl 直接调用

python
class RemoteWidget(Remote):

    def start_terminal(self):
        self.ctrl_alt_t()  

这样的写法就和本地方法的调用写法是一样的。

更重要的是,可以在用例层优雅的调用远程方法, start_terminal 方法可以不用在方法层定义了。

python
class TestMyCase003(BaseCase):

    def test_mycase_003(self, slaves):
        """my case 003"""
        kwargs = slaves[0]
        remote = RemoteWidget(**kwargs)
        remote.ctrl_alt_t()

Remote.rctl_plus

Remote.rctl_plus 只是在 Remote.rctl 的基础上增加了发送 APP 工程的功能,因为有些情况下需要用到 APP 工程中的资源(如:图像断言需要用到的图片资源);

在调用的时候,需要传入参数:

python
class RemoteWidget(Remote):

    def start_terminal(self):
        self.rctl_plus.ctrl_alt_t()

if __name__ == '__main__':
    r = RemoteWidget(
        user="root", 
        ip="192.168.1.1", 
        password="xxx", 
        transfer_appname="autotest_my_app"  # APP工程的名称
    )
    r.start_terminal()

代码补全

所有的远程调用方法,都是通过 RPC 客户端对象提供的,本身无法提供代码补全,但我们仍然实现了,让你能像调用本地方法一样调用远程方法。