前言
在脚本内执行子脚本是同学们经常会遇到的一个需求。比如,当我们写了多个需要顺序执行的用例,然后想在一个正式脚本里面添加这些用例的执行,该如何实现呢?
今天我们就用一个简单的实操案例,来带大家看看具体的实现思路。
案例简介
① 本次案例我们用到的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()
方法,我们还可以用别的方式实现在主脚本中运行子脚本的操作,只不过这些方式需要我们自己实现一些运行用例的方法,会相对复杂一些。同学们可以优先使用已提供的接口,待需求更加复杂的时候,再实现自己的运行用例的方法。