阅读 107

一个方法帮你在正式脚本里添加“子脚本”的运行

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

在脚本内执行子脚本是同学们经常会遇到的一个需求。比如,当我们写了多个需要顺序执行的用例,然后想在一个正式脚本里面添加这些用例的执行,该如何实现呢?

今天我们就用一个简单的实操案例,来带大家看看具体的实现思路。

案例简介

① 本次案例我们用到的APP、IDE和设备情况如下:

  • 1.待测应用:网易新闻app
  • 2.IDE版本:1.2.3
  • 3.设备:雷电模拟器

② 这个案例需要完成以下工作:

  • 1.编写登录网易新闻app的用例
  • 2.编写使用网易新闻app的用例
  • 3.编写退出网易新闻app的用例
  • 4.新增1个脚本,在里面添加以上3个用例的执行

1.登录app

我们在登录app的脚本 newsLogin.air 中定义了一个执行登录操作的方法,并且要求不论在执行登录操作的任何一个步骤中报错,都会生成一个登录的运行报告。

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
from airtest.report.report import simple_report

def newsLogin():
    auto_setup(__file__,logdir=True,devices=["Android://127.0.0.1:5037/emulator-5554"])

    clear_app("com.netease.newsreader.activity")
    start_app("com.netease.newsreader.activity")
    sleep(1.0)

    from poco.drivers.android.uiautomation import AndroidUiautomationPoco
    poco = AndroidUiautomationPoco(use_airtest_input=True,  screenshot_each_action=False)
    sleep(1.0)

    try:
        # 实现登录操作
        pass
    finally:
        simple_report(__file__,logpath=True,output="../netease_music/登录.html")
复制代码

另外小编还想强调下,初始化脚本、打开应用和初始化poco,这三者的顺序不能随意变动,否则很容易带来各种各样神奇的报错。

2.使用app

在使用app的脚本 newsUsing.air 中,我们主要实现了几个小操作:

  • 浏览首页首条文章
  • 双击视频菜单下的首个视频
  • 给圈子里面的第一条圈子点赞
def newsUsing():
    try:
        pass
        log("成功浏览首页首条文章")

        pass
        log("成功双击首个视频")

        pass
        log("成功给第一条圈子点赞")
    finally:
        simple_report(__file__,logpath=True,output="../netease_music/浏览.html")
复制代码

3.退出登录

def newsExit():
    try:
        # 实现退出登录的操作
        pass
    finally:
        simple_report(__file__,logpath=True,output="../netease_music/退出.html")
复制代码

4.运行多个子脚本

编写完上述三个需要顺序执行的用例以后,我们再来给大家介绍一个 airtest 提供的调用子脚本的方法: using() 方法。

using() 方法我们在之前的推文“调用过程中你一定遇到过的几个问题”中就有简单介绍过,它可以帮助我们在1个主脚本中引入其它脚本,从而帮助我们实现运行子脚本的功能。

using() 方法里传入子脚本的绝对或者相对路径,都可以将子脚本引入进来:

# 使用相对路径
using("a.air")
# 使用绝对路径
using("D:/test/a.air")
复制代码

因此,我们可以用如下方式将上述的3个用例引入到一个正式脚本中并执行他们:

def customUsing(fiLe):
    print("--------引入" + fiLe + ".air--------")
    pathU = os.path.join("D:/test/"+fiLe+".air")
    using(pathU)
try:
    # 执行登录的脚本
    customUsing("newsLogin")
    from newsLogin import newsLogin
    newsLogin()
    print("-----newsLogin执行完毕-----")

    # 执行浏览使用的脚本
    customUsing("newsUsing")
    from newsUsing import newsUsing
    newsUsing()
    print("-----newsUsing执行完毕-----")
    
    # 执行退出登录的脚本
    customUsing("newsExit")
    from newsExit import newsExit
    newsExit()
    print("-----newsExit执行完毕-----")
except Exception as e:
    traceback.print_exc()
复制代码

因上述3个脚本都是存放在 D:/test/ 这个相同的目录下,所以我们定义了一个新的 customUsing 方法,只要传入 .air 脚本不带后缀的名称即可,方便后面我们引入这些子脚本。运行效果如下:

image

因在编写用例时,我们要求不论用例执行是否成功,都会在指定目录中生成对应的html报告,所以在主脚本执行完3个用例之后,生成的报告如下:

image

image

5.小结

其实除了 using() 方法,我们还可以用别的方式实现在主脚本中运行子脚本的操作,只不过这些方式需要我们自己实现一些运行用例的方法,会相对复杂一些。同学们可以优先使用已提供的接口,待需求更加复杂的时候,再实现自己的运行用例的方法。

如果想获取今天示例的完整代码,童鞋们可以在直接在公众号回复关键词“子脚本”。


Airtest官网:airtest.netease.com/
Airtest教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b