Airtest命令行运行airtest run详解

上期回顾:Airtest API精讲之报告日志log()


以下基于
python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83

之前我们都是在AirtestIDE里运行脚本,但如果用在工作中,大批量用例运行、并行运行、定时或集成Jenkins运行,就要用到命令行运行了。

想要用命令运行,必须要装独立于AirtestIDE的Python环境,还没装的可以看下之前的文章Airtest之python本地环境安装、独立IDE运行

装好环境之后,在命令行中输入airtest run -h,如果出现下图,就表示安装成功了

图片

如果你是Windows且提示没有airtest run这个命令,那就是你python的环境变量没配好,网上搜一下配好环境变量。实在不行,试试python -m airtest run -h

先给出一个完整示例大家有个印象:

airtest run "D:\qasite.air" --device "android://127.0.0.1:5037/65fade15?cap_method=JAVACAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH" 
--log "D:\log" --compress 90 --recording qasite.mp4

在解说参数之前,我先放上之前的各个平台连接AirtestIDE的文章,里面的内容都是基础:
AirtestIDE连接安卓真机及常见问题
airtestIDE连接模拟器及常见问题

airtest之使用tidevice工具轻松连接iOS
Airtest连接Windows窗口(应用)

参数说明:

  1. 脚本路径:airtest run命令后紧跟的第1个参数是脚本的绝对路径,当然你也可以用相对路径,但为了避免路径层级搞乱,我还是推荐大家用绝对路径,简单明了。路径用双引号包住,防止因为特殊符号报错

  2. --device参数后跟的是设备连接字符串,用双引号包住。以上面例子进行说明:
    ①android表示连的是安卓手机。
    ②127.0.0.1:5037表示连接的是本机的5037端口,如果你要连远程服务器的真机,就写对应的IP和端口。如果不写,则默认是本机的5037。
    ③65fade15表示手机序列号,安卓通过adb devices获取。
    ④cap_method=JAVACAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH表示了几个连接的特殊参数,一般这些参数全部不用写,Airtest会自动适配,除非模拟器或个别手机连接有问题时才用,具体使用看上面的连接文章吧。

设备连接字符串URI示例:

# 什么都不写,连接第一台安卓手机
"android:///"
# 连接65fade15这台安卓(推荐写法)
"android:///65fade15"
# 连接一台模拟器,并指定参数。其中127.0.0.1:62001是模拟器的序列号
"Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH"
# 通过tidevice连接ios手机,'07bbb06a267ee'是UDID,通过`tidevice info`获取,具体看上面tidevice文章连接
"ios:///http+usbmux://07bbb06a267ee"
# 连接整个windows桌面
"Windows:///"
# 连接匹配的窗口名称正则
"Windows:///?title_re=.*记事本.*"
  1. --log表示运行过程中日志和截图存放路径,注意事项同第1个参数脚本路径。如果不写这个参数,可以运行,但不记录日志,无法生成报告。
  2. --compress表示运行过程中截图的质量,从1-99,数字越小,截图越模糊,但图片大小越小,可不写,默认为10

  3. --recording表示将运行过程录屏,'qasite.mp4'表示录屏文件名,不写会有默认文件名,录屏仅支持安卓平台

  4. --no-image参数表示运行过程中不再截图,这样生成报告后就不会有截图。与'--compress'参数互斥。我个人推荐最好还是要截图,这样生成报告后可以看到运行的整个过程。

看完上面如果你还是不会写,可以在AirtestIDE里先运行,然后复制日志第一行的命令,再自己修改一下

图片

源码解析

我们看看运行命令之后,代码到底是如何流转的

# 文件位置:your_python_path/site-packages/airtest/__main__.py
# -*- coding: utf-8 -*-
from airtest.cli.__main__ import main


if __name__ == '__main__':
    main()

命令行运行airtest后,首先进入到这里,可以看是调用了airtest.cli.__main__中的 main()方法,进入查看:

# 文件位置:your_python_path/site-packages/airtest/cli/__main__.py
# -*- coding: utf-8 -*-
from airtest.cli.parser import get_parser


def main(argv=None):
    ap = get_parser()
    args = ap.parse_args(argv)
    if args.action == "info":
        from airtest.cli.info import get_script_info
        print(get_script_info(args.script))
    elif args.action == "report":
        from airtest.report.report import main as report_main
        report_main(args)
    elif args.action == "run":
        from airtest.cli.runner import run_script
        run_script(args)
    elif args.action == "version":
        from airtest.utils.version import show_version
        show_version()
    else:
        ap.print_help()


if __name__ == '__main__':
    main()

(1)首先ap = get_parser()获取参数
(2)其次args = ap.parse_args(argv)对参数进行正确性检查
(3)最后根据具体的命令执行不同逻辑,我们可以看到一共有4个子命令:
1.airtest info获取脚本信息(目前没发现这个功能有啥实际用处,具体可以查看官方文档);
2.airtest report生成报告;
3.airtest run运行脚本,执行了run_script(args)
4.airtest version打印版本号;
5.如果都没匹配上,则输入帮助命令

下面分别看下(1)(2)(3)的源码:

(1)ap = get_parser()

# 文件位置:your_python_path/site-packages/airtest/cli/parser.py
# -*- coding: utf-8 -*-
import argparse
import sys
from airtest.report.report import get_parger as report_parser
from airtest.cli.runner import setup_by_args


def get_parser():
    ap = argparse.ArgumentParser()
    subparsers = ap.add_subparsers(dest="action", help="version/run/info/report")
    # subparser version
    subparsers.add_parser("version", help="show version and exit")
    # subparser run
    ap_run = subparsers.add_parser("run", help="run script")
    runner_parser(ap_run)
    # subparser info
    ap_info = subparsers.add_parser("info", help="get & print author/title/desc info of script")
    ap_info.add_argument("script", help="script filename")
    # subparser report
    ap_report = subparsers.add_parser("report", help="generate report of script")
    report_parser(ap_report)
    return ap

def runner_parser(ap=None):
    if not ap:
        ap = argparse.ArgumentParser()
    ap.add_argument("script", help="air path")
    ap.add_argument("--device", help="connect dev by uri string, e.g. Android:///", nargs="?", action="append")
    ap.add_argument("--log", help="set log dir, default to be script dir", nargs="?", const=True)
    ap.add_argument("--compress", required=False, type=int, choices=range(1, 100), help="set snapshot quality, 1-99", default=10)
    ap.add_argument("--recording", help="record screen when running", nargs="?", const=True)
    ap.add_argument("--no-image", help="Do not save screenshots", nargs="?", const=True)
    return ap

可以看到Airtest也是用了argparse这个命令行的库,在'run'时,执行了runner_parser(ap_run)
runner_parser()则是airtest run命令的具体参数设定

(2)args = ap.parse_args(argv)

# 文件位置:your_python_path/site-packages/airtest/Lib/argparse.py
    # =====================================
    # Command line argument parsing methods
    # =====================================
    def parse_args(self, args=None, namespace=None):
        args, argv = self.parse_known_args(args, namespace)
        if argv:
            msg = _('unrecognized arguments: %s')
            self.error(msg % ' '.join(argv))
        return args

参数检查,如果你把参数输错了或者输入了一个不存在的参数,则会提示'unrecognized arguments',你可以自己随便加一个参数运行试试看,比如airtest run --gongzhonghao qasite

(3)run_script(args)

# 文件位置:your_python_path/site-packages/airtest/cli/runner.py
def run_script(parsed_args, testcase_cls=AirtestCase):
    global args  # make it global deliberately to be used in AirtestCase & test scripts
    args = parsed_args
    suite = unittest.TestSuite()
    suite.addTest(testcase_cls())
    result = unittest.TextTestRunner(verbosity=0).run(suite)
    if not result.wasSuccessful():
        sys.exit(-1)

用过unittest的同学对这个肯定不会陌生,这里就是调用unittest运行用例。
入参中的AirtestCase就是基于unittest二次封装的类,感兴趣的同学可以自己看看/airtest/cli/runner.py

以上就是命令大体的一个运行过程。

 

---------------------------------------------------------------------------------

关注微信公众号即可在手机上查阅,并可接收更多测试分享~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章