使用Airtest构建移动端自动化测试框架(记录贴)

1.前言

目标

  • 使用Python结合Airtest进行移动端的自动化测试
  • 基于开源代码DIY
  • 实现一个完整的项目框架

软件准备

  • python3
  • Pycharm
  • AirtestIDE
  • 安卓手机或者模拟器

2.准备工作

  • 项目目录结构搭建
  • 配置的概念
  • 使用pycharm写airtest相关脚本

2.1目录结构搭建

1.Base

  • 存放公共方法文件

2.Logs

  • 存放日志数据,截屏图片

3.TestCase

  • 存放测试用例

4.TestData

  • 存放测试数据

5.TestSuite

  • 存放测试套件 组装测试用例

6.Report

  • 存放测试报告

2.2 项目集成unittest

为什么要使用unittest:

1)能够组织多个用例去执行

2)提供丰富的断言方法

3)可以使用UnitTest来管理测试用例

4)已经实现了很多基本功能避免重复造轮子

airtest脚本移植到python

因为我们在新建脚本时就是采用的py脚本。

里面使用的语法就是Python语法。

所以我们可以直接把文件内容粘贴复制到Python运行

3.项目存在的问题

  1. 各个case互相存在关联性
  2. 报告没有独立

3.1 实现每个case有对应的报告的方案

思路:

每个case要产生自己的报告 那么应该在初始化的时候 有一个单独的文件夹存放自己运行过程中产生的日志数据,等待生成报告的时候在读取该文件夹渲染到指定报告文件

解决方案:

  • 初始化方法auto_setup() 里的logdir 参数决定了你case运行过程中产生的日志存储到哪里,所以只要指定logdir为一个你想要存储的路径地址即可
  • simple_report()内的logpath参数 决定生成的报告上的日志数据从哪读取,所以只要将该参数的值设置的跟logdir参数一致即可。存到哪里就从哪里读取。
  • simple_report()内的output参数 决定报告输出到哪里。

重写auto_steup()

为了让每个case有自己的报告,那么每个函数都需要调用一次auto_steup(),但是auto_steup()里面还包含了连接操作,这样做意味中调用一次函数就连接一次。这显然是不合理的。所以我们需要重写auto_setup()

思路:

原本的auto_steup()实现了建立连接和创建日志文件夹两个功能。那我们可以模仿他的代码,进行重写。重写两个方法一个就是建立连接一个就是创建日志文件夹

3.2 case执行过程中即使报错,也要产出报告,并指出错误原因

思路:

即使程序报错也要执行报告生成的方法 捕获异常

解决方案:

try execpt else finally

捕获异常后程序出错报告显示依旧是通过

解决方案: 在异常内使用log()方法

4.装饰器优化代码

每个case中,会发现有很多的重复操作 如建立日志文件夹,都需要异常捕获,然后生成报告这些操作。那这些操作可以使用装饰器来进行优化。

4.1 装饰器的常见应用场景

引入日志
函数执行时间统计
执行函数前预备处理
执行函数后清理功能
权限校验等场景

4.2实际应用

def get_parameter(logname):
    """
    装饰器接收参数
    :param logname:  日志文件夹名称
    :return:
    """
    def outer(func):
        def inner(self,*args, **kwargs):
            only_set_logdir(LogsDIR + logname)
            try:
                arg = func(self,*args, **kwargs)
            except Exception as e:
                print(e)
                log(e, snapshot=True)
                raise e
            finally:
                simple_report(__file__, logpath=LogsDIR+logname, output=ReportDIR +logname+".html")
            return arg
        return inner
    return  outer
raise使用场景:
比如在unittest框架中若不使用 raise 抛出异常,系统是看代码有没有报错,
原本代码是有1个错误,但我们使用except捕获异常了,对于代码来说这是你期望的错误,你已经自己把它捕获了
但代码整体执行并没有报错,对于unittest来说就没有异常了
所以要 用到抛出异常,unittest就会判断该条case执行失败

5.BeautifulReport的使用

5.1目标

  • 用BeautifulReport生成测试报告
  • 重写BeautifulReport源码实现高级自定制
  • 实现报告整合

5.2安装

源地址

pip install BeautifulReport

5.3报告功能自定制

BeautifulReport的页面的确很beautiful,
但是如果将这个页面和我们的airtest生成的报告结合起来?
相对于BeautifulReport产出的只是一个目录页面,我们需要一个链接跳转到指定详情页面

5.4源码重写

Python部分源码的重写

需要改变的其实就是字段的新增以及新增字段的显示
目标:新增两列(开始运行时间和报告详情列)

主要改动的地方在于以下两个函数
1、get_testcase_property: 添加新增字段的获取
2、 修改MakeResultJson 里的__repr__ 使新增的字段能够正常压缩对应

报告模板页面的修改

template.html文件新增字段 th新增两列
template.html文件新增字段 td新增两列

实现效果

5.5 airtest报告详情

1.进入详情页面没有样式

原因

生成报告时的css样式是用的绝对路径

解决思路

将airtest生成报告所需要的css,js等一些文件夹也放到静态服务器,后期生成的报告引用文件都引用服务器地址

2.进入详情页面没有日志图片数据

原因

日志图片数据也是用的绝对路径

解决思路

将这些log数据也放到静态服务器,后期生成的报告引用文件都引用服务器地址

6.用flask搭建简单服务器

  • 用flask搭建简单服务器
  • 能够将报告放在服务器远程访问

1静态文件和模板文件

静态目录

在项目 目录下创建 static 文件夹
运行服务即可通过 地址:端口/static/文件路径 访问该静态文件

7. 实现效果

可以自定义修改配色

新增报告目录页

8. 再优化

上传报告至ftp服务器

目前此方案已经完美替代了之前用flask来实现查看报告的问题

还可以配合脚本进行自动上传报告至ftp服务器(百度ctrl+c的代码)

修改BearutfulReport报告中的资源引用

第一种是默认引入的Bootstrap相关 css、js文件是直接使用 BootstrapCDN 提供的链接

第二种是把资源上传到服务器

最后一种是引入本地相对路径下的资源

修改报告详情也就是airtest报告中的资源引用

需要在源码中进行修改

除此之外,还要修改airtest报告中的测试数据读取路径

读取的测试数据有:log、操作步骤中显示的大小图片以及用例中点击的图片

至此,报告中所有的资源引用都改为了相对路径,可以不再受发送限制,报告可以打包放在任何位置,也可以离线查看

项目目前已经搞得差不多了,后期也就写写测试用例,跑跑脚本,优化优化啥的!

posted @ 2021-08-15 09:45  者諹  阅读(1053)  评论(2编辑  收藏  举报