Macaca Android 和 iOS 并行测试

目录

前言

1. 获取连接到电脑上的机器

2. 动态获取 3456 端口后的空闲端口,获取的端口数根据上个方法中获取的设备数

3. 开启 macaca 服务,为每一个 service 动态分布一个端口


前言

在进行移动应用测试时,如果需要对 Android 和 iOS 平台的应用进行并行测试,可以使用 Macaca 测试框架。Macaca 支持多平台测试,可以实现在 Mac 上同时运行 Android 和 iOS 的测试脚本,节省了测试时间和人力成本

1. 获取连接到电脑上的机器

  • Android :利用 adb devices 获取连接上的所有安卓设备。
  • iOS:利用 instruments -s devices 获取连接上的所有 iOS 设备

    class InitDevice:
    """
    获取连接的设备的信息
    """
    def __init__(self):
        self.GET_ANDROID = "adb devices"
        self.GET_IOS = "instruments -s devices"
    
    def get_device(self):
        value = os.popen(self.GET_ANDROID)
    
        device = []
    
        for v in value.readlines():
            android = {}
            s_value = str(v).replace("\n", "").replace("\t", "")
            if s_value.rfind('device') != -1 and (not s_value.startswith("List")) and s_value != "":
                android['platformName'] = 'Android'
                android['udid'] = s_value[:s_value.find('device')].strip()
                android['package'] = 'xxxx'
                android['activity'] = 'xxxxxx'
                device.append(android)
    
        value = os.popen(self.GET_IOS)
    
        for v in value.readlines():
            iOS = {}
    
            s_value = str(v).replace("\n", "").replace("\t", "").replace(" ", "")
    
            if v.rfind('Simulator') != -1:
                continue
            if v.rfind("(") == -1:
                continue
    
            iOS['platformName'] = 'iOS'
            iOS['platformVersion'] = re.compile(r'\((.*)\)').findall(s_value)[0]
            iOS['deviceName'] = re.compile(r'(.*)\(').findall(s_value)[0]
            iOS['udid'] = re.compile(r'\[(.*?)\]').findall(s_value)[0]
            iOS['bundleId'] = 'xxxx'
    
            device.append(iOS)
    
        return device
    

    2. 动态获取 3456 端口后的空闲端口,获取的端口数根据上个方法中获取的设备数

  • 判断端口号是否被占用是去执行 netstat -an | grep port这条命令判断端口号是否被占用

def is_using(port):
    """
    判断端口号是否被占用
    :param port:
    :return:
    """
    cmd = "netstat -an | grep %s" % port

    if os.popen(cmd).readlines():
        return True
    else:
        return False

def get_port(count):
    """
    获得3456端口后一系列free port
    :param count:
    :return:
    """
    port = 3456
    port_list = []
    while True:
        if len(port_list) == count:
            break

        if not is_using(port) and (port not in port_list):
            port_list.append(port)
        else:
            port += 1

    return port_list

3. 开启 macaca 服务,为每一个 service 动态分布一个端口

  • start_server: 开启一个进程池,每一个 device 对应一个 macaca server
  • run_server:运行 macaca server
  • is_running:判断 server 是否有开启成功,判断的方法为:去访问每个 server 对应的http://127.0.0.1:port/wd/hub/status地址,看看返回的状态码是不是以 2 开头。
  • run_test:运行脚本
class macacaServer():
    def __init__(self, devices):

        self.devices = devices
        self.count = len(devices)
        self.url = 'http://127.0.0.1:%s/wd/hub/status'

    def start_server(self):

        pool = Pool(processes=self.count)
        port_list = get_port(self.count)

        for i in range(self.count):
            pool.apply_async(self.run_server, args=(self.devices[i], port_list[i]))

        pool.close()
        pool.join()

    def run_server(self, device, port):

        r = RunServer(port)
        r.start()

        while not self.is_running(port):
            sleep(1)

        server_url = {
            'hostname': "ununtrium.local",
            'port': port,
        }
        driver = WebDriver(device, server_url)
        driver.init()

        DRIVER.set_driver(driver)
        DRIVER.set_OS(device.get("platformName"))

        self.run_test()

    def run_test(self):
        """运行测试
        """
        all_test = AllTests()
        all_test.run_case()

    def is_running(self, port):
        """Determine whether server is running
        :return:True or False
        """
        url = self.url % port
        response = None
        try:
            response = requests.get(url, timeout=0.01)

            if str(response.status_code).startswith('2'):

                # data = json.loads((response.content).decode("utf-8"))

                # if data.get("staus") == 0:
                return True

            return False
        except requests.exceptions.ConnectionError:
            return False
        except ReadTimeout:
            return False
        finally:
            if response:
                response.close()


class RunServer(threading.Thread):

    def __init__(self, port):
        threading.Thread.__init__(self)
        self.cmd = 'macaca server -p %s --verbose' % port

    def run(self):
        os.system(self.cmd)

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

 【自动化测试交流】:574737577(备注ccc)icon-default.png?t=N6B9http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MlSJV6ISUuVb2x_i-6ay4HRSdy3u_2cd&authKey=6d2k0Iz2MZDejl8f1hdTEkt94KvLoEXQmeNoC0MC00%2BRhq2Yfmy27T0Hslhzenuz&noverify=0&group_code=574737577

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值