远程交互式控制
在用例执行过程中控制远程机器执行复杂的 UI 操作或命令行操作。
在远程测试机上部署一个完整的 YouQu 环境以提供 UI 交互的基础能力,然后将这些基础能力通过 RPC 服务的方式提供出来,在服务端通过调用 RPC 接口从而控制远程机器执行用例步骤。
slaves对象提供远程机器信息
slaves
是 YouQu 提供的一个全局对象,它保存了远程测试机的信息列表;
机器信息有 2 种方式传入:
命令行
shellyouqu 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
客户端对象提供的,本身无法提供代码补全,但我们仍然实现了,让你能像调用本地方法一样调用远程方法。