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

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

前言



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


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


案例简介



① 本次案例我们用到的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 脚本不带后缀的名称即可,方便后面我们引入这些子脚本。运行效果如下:



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



5.小结



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

相关文章
|
9月前
|
Shell
shell实战案例- 实现文件锁(调用外部脚本)
shell实战案例- 实现文件锁(调用外部脚本)
154 0
|
Linux Python
Python 用一个脚本来控制另一个脚本的运行、关闭
Python 用一个脚本来控制另一个脚本的运行、关闭
192 0
SHEL脚本中调用另外一个脚本的函数和变量
SHEL脚本中调用另外一个脚本的函数和变量
85 0
脚本中调用别的脚本,如何得到执行结果?
脚本中调用别的脚本,如何得到执行结果?
62 0
脚本比别人的代码都多
脚本比别人的代码都多
98 0
|
Shell
编写SHELL脚本--判断用户的参数
测试语句格式: [ 条件表达式 ] 常见的几种形式: [ -d /etc ]  判断/etc是不是一个目录类型, [ -e /etc/php.ini ] 判断/etc/php.ini 文件是否存在 [ -f /etc/php.
998 0