# BwProCost_Auto_v2 **Repository Path**: sanshil/BwProCost_Auto_v2 ## Basic Information - **Project Name**: BwProCost_Auto_v2 - **Description**: 为了实现公司客户端软件的自动化测试,支持开源软件,基于python语言,采用网易的airtest进行部分代码录制,同时采用uiautomation编写的代码对控件进行操作,使用pytest+allure的框架实现自动化用例执行,数据驱动,报告展现。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2024-06-15 - **Last Updated**: 2024-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **airtest+uiautomation+pytest+allure自动化测试框架应用实践说明文档** ## 一、**框架整体介绍** 前言: 通过阅读本文档,你将了解以下内容: 1、Airtest脚本的录制 2、Uiautomation模块的使用 3、PO设计模式编写自动化代码 4、Pytest自动化测试框架 5、Allure定制化报告 6、工具的执行操作 介绍: 为了实现公司客户端软件的自动化测试,支持开源软件,基于python语言,采用网易的airtest进行部分代码录制,同时采用uiautomation编写的代码对控件进行操作,使用pytest+allure的框架实现自动化用例执行,数据驱动,报告展现。 ## 二、**Airtest脚本的录制** ### **1、学习文档** AirtestProject是由网易游戏推出的UI自动化测试解决方案,项目主要构成如下: 1、Airtest框架 2、Poco框架 3、AirtestIDE 其中Poco目前仅支持手机移动设备,windows设备在未来或将支持,因此我们主要使用AirtestIDE进行代码录制,再将代码复制到Pycharm中进行整体的项目编码,利用Airtest框架补充我们的测试框架。 网易编写的airtest文档非常全,非常细,建议大家可直接通过官方文档学习。 AirtestProject官方文档: https://airtest.doc.io.netease.com/ 从官方文档中,***\*我们需要学会以下几点\****: 1、安装并启动AirtestIDE 2、录制windows应用软件自动化脚本 3、能脱离AirtestIDE跑脚本(建议使用pycharm) ![img](img/wps25.jpg) ![img](img/wps26.jpg) ### **2、录制注意点** 1、截图中有颜色需要区分时,可以双击AirtestIDE中的图片,在弹窗中勾选rgb。 ![img](img/wps27.jpg) 2、如果需要操作的地方,内容经常变化,可采用target_pos进行定位操作。 ![img](img/wps28.jpg) 通过AirtestIDE录制的脚本,我们能够实现简单的回放操作,但是还不足以完成自动化测试: 1、所操作的位置,其照片发生变化,导致识别失败 2、没有明显区别特点的照片,无法识别 3、电脑分辨率等原因,图片无法通用 因此我们需要利用一些python库来解决,如pywinauto、uiautomation,这里我们采用uiautomation这种更底层的库来解决。 ## 三、**uiautomation模块的使用** ### 1、**学习文档** Uiautomation可以识别操作位置的控件对象,操作对象,进行点击、编辑等操作,可以解决上面的问题。 详细使用方法见文档:《Windows桌面程序自动化控制之uiautomation模块全面讲解.pdf 》 ![img](img/wps29.png) ### 2、**认识控件** 常用控件:WindowControl,ButtonControl、ComboBoxControl、DataItemControl、EditControl、HeaderControl、MenuControl等 ![img](img/wps30.jpg) WindowControl指的是窗口控件,如软件窗口、录入资源窗口等; ButtonControl指的是按钮控件,如打开、确定按钮等; TableControl指的是表格控件,如工程信息、基本信息的列表等; TreeControl指的是树形控件,如工程量、取费设置的树形等; 软件中有更多的控件,这里只列举其中几个。 ### 3、**工具使用** 使用工具,我们可能更清楚的看到需要操作的区域是什么控件,从而更方便使用代码去操作它。 ![img](img/wps31.png) 打开inspect后,可以看到工具主要分为2个部分,左边是电脑中已启动的所有窗口的树状列表,右侧是某个控件的具体信息。 ![img](img/wps32.jpg) 注意:inspect上展示的数据也可能不准确,导致抓不到控件,这个时候可以用其他的工具,或者用automation.py的命令行获取控件树。 ### 4、**注意事项与技巧** ①常用的定位参数有:Name、ClassName、AutomationId、foundIndex ②定位不到控件时,可能是控件在窗口中,这时就要到这个窗口中,或者在窗口上层控件中去查找,如到顶层,即auto ③工具查到的属性值,一般是可以获取到的,通过GetPattern获取,代码如下 ![img](img/wps33.jpg) ![img](img/wps34.jpg) ④searchDepth和Depth的区别,需注意,具体可见:https://www.cnblogs.com/xiongjianwen/p/17062639.html ⑤可以巧用兄弟层级、父子层级、祖先层级来定位控件,比如工程名称右边的编辑区, 就可以用GetNextSiblingControl()来获取该兄弟层级控件。 通过学习airtest和uiautomation,我们已经能够完成一段比较复杂的自动化代码的编写,但是如果用来执行测试,就会很麻烦,比如: ①相同功能导致代码冗余 ②一条用例对应一个文件,用例较多时不方便维护管理 ③数据和代码糅杂在一起,可维护性差 ④如果某个控件改了,你要更改多个地方,可维护性差(这个暂时没想到解决方案) ## 四、**PO设计模式编写自动化代码** PO模式是一种自动化测试设计模式,将页面定位和业务操作分开,也就是把对象定位和测试脚本分开,从而提供可维护性。它可以解决我们上面遇到的问题。 PO是自动化测试项目开发实践的最佳设计模式之一。 下面介绍一下代码大致的模式: 1、The pulic methods represent the services that the page offers A.使用公共方法来代表页面提供的服务 B.基类(基础服务:页面的基础的服务:获取控件) C.页面类:主页、工程信息、工程量等 2、Try not to expose the internals of the page A.不要暴露页面的内部细节(比如元素,元素的定位方法等),隔离了测试用例和业务和页面对象 ---- 暂未实现 3、Generally don't make assertions A.PO本身通常(绝)不应进行判断或断言,判断和断言是测试的一部分,应始终在测试的代码内,而不是在PO中,PO用来包含页面的表示形式,以及页面通过方法提供的服务,但是与PO无关的测试代码不应包含在其中 4.Methods return other Pageobjects A.方法返回其他的页面对象,进行页面的关联 ---- 客户端不像web端会经常页面跳转,所以这里不适用。 5.Need not represent an entire page A.PO不一定需要代表整个页面,定义你所需要实现的业务的部分即可,所以在我们的测试中有的页面对象可以非常简单(用什么写什么)· B.PO设计模式可用于表示页面上的组件,如果自动化测试中的页面包含多个组件,则每个组件都有单独的页面对象,则可以提高可维护性. 6.Different results for the same action are modelled as different methods A.相同的操作(但可能是不同的数据)带来的不同的结果可以封装成不同的方法。 我们采用了PO设计模式中的基类封装、不同页面的业务模块封装,不同页面之间的模块可以相互调用 ### 1、**基类封装** ***\*def\**** getControl(self,control_type: str,control: Control, **kwargs) -> 'Control': ​ """ ​ 做了数据分离,控件类型存在yaml中 ​ 封装获取控件的方法,基于父控件control去查询其下的类型为control_type,查询条件为kwargs的控件 ​ :param control_type: 要查询控件的类型,String型 ​ :param control: 父级控件对象 ​ :param kwargs: 查询条件,如:Name='notepad',searchDepth=2 ​ :return: 返回查询到的控件对象,查询不到就返回错误 ​ """ ​ CONTROL_DICT = get_yaml_data(config_path+'/ctrl_conf.yaml')['CONTROL_DICT'] ​ ***\*for\**** type,ctrl ***\*in\**** CONTROL_DICT.items(): ​ ***\*if\**** type == control_type: ​ ***\*return\**** eval(ctrl) 使用时 window = auto.WindowControl(ClassName='CCNotePad') Control1 = BaseControl().getControl('MenuItemControl',window,Name='查找(S)') 返回控件后,可以对该控件进行操作,如Sendkeys、Click等 这样做的好处是:需要修改所有查找控件的方法时,只需要改这一处代码即可,不需要每个查找都修改。 ### 2、**业务模块封装** ![img](img/wps35.jpg) 不同页面,单独设置一个py文件,每个页面只写该页面的操作,这些操作需要测试人员自己去写,这里展示工程信息模块的代码: ![img](img/wps36.jpg) 这里只需要写操作,不需要具体的数据,数据在测试用例中体现即可。 ## 五、**pytest自动化测试框架** Pytest是一种自动化测试框架,pytest向下兼容unittest ***\*命名规范:\**** a. 测试文件名必须以“test_”开头 b. 测试类以Test开头,并且不能带有 init 方法 c. 测试方法必须以“test_”开头 d. 除了有setup/teardown,还能更自由的定义fixture装载测试用例 \# 安装 pip install -U pytest \# 查看安装版本 pip show pytest \# 或者 pytest --version ### **1、简单的例子** **# test_class.py** ***\*class\**** TestClass: ***\*def\**** test_one(self): ​ x = "this" ​ ***\*assert\**** 'h' ***\*in\**** x ***\*def\**** test_two(self): ​ x = "hello" ​ ***\*assert\**** hasattr(x, 'check') ### **2、实际运用** ![img](img/wps37.jpg) 运行框架时需要在代码中加上运行代码: if __name__ == ***\*'__main__'\****: pytest.main([__file__,***\*'-sv'\****,***\*'--alluredir'\****,***\*'../outFiles/report'\****,***\*'--clean-alluredir'\****]) os.system(***\*'allure serve ../outFiles/report'\****) 参数说明: __file__: 指当前文件,运行当前文件 --sv: 详细日志,并输出print中的内容 --alluredir: allure文件的存放地址,即:***\*../outFiles/report\**** --clean-alluredir: 每次执行当前文件代码时会清除之前的allure报告文件,以防数据重复 os.system: 系统cmd启动allure服务 3、**pytest数据驱动** ![img](img/wps38.jpg) 讲到数据驱动,那就要介绍下excel的数据来源 ![img](img/wps39.jpg) 如何获取这个Excel用例的数据呢,我封装在handle_excel_v3.py中,调用get_format_data函数,可以获得结果是[(),()] 列表套元组类型的数据,比如:[(第一行所有数据),(第二行所有数据)],刚好是pytest需要的类型。 ### **3、学习文档** Pytest有很多运用的技巧,目前大家只要能照着案例中的代码编写即可,若代码不满足需求,可自行学习。https://www.w3cschool.cn/pytest/ ## 六、**Allure定制化报告** allure使用条件: 1、本地装有java1.8+,并配置环境变量 2、下载allure:https://github.com/allure-framework/allure2/releases ![img](img/wps40.jpg) 版本不要求,需要配置环境变量 3、安装pytest、及allure插件 pip install pytest # 上面已经安装的话,就不需要再安装了 pip install allure-pytest ### 1、**allure模块介绍** | ***\*使用方法\**** | ***\*参数值\**** | ***\*参数说明\**** | | ------------------------- | ------------------ | --------------------------------------- | | @allure.epic() | epic描述 | 敏捷里面的概念,定义史诗,往下是feature | | @allure.feature() | 模块名称 | 功能点的描述,往下是story | | @allure.story() | 用户故事 | 用户故事,往下是title | | @allure.title(用例的标题) | 用例的标题 | 重命名html报告名称 | | @allure.testcase() | 测试用例的链接地址 | 对应功测试用例系统里面的case | | @allure.issue() | 缺陷 | 对应缺陷管理系统里面的链接 | | @allure.description() | 用例描述 | 测试用例的描述 | | @allure.step() | 操作步骤 | 测试用例的步骤 | | @allure.severity() | 用例等级 | blocker,critical,normal,minor,trivial | | @allure.link() | 链接 | 定义一个链接,在测试报告展现 | | @allure.attachment() | 附件 | 报告添加附件 | ![img](img/wps41.jpg) ![img](img/wps42.jpg) 框架中除了截图会以附件放上去,还有log文件也会放上去(注意log可以不写attach方法),详情见csAssert.py ### 2、**定制化allure** 生成的报告页面,如下图所示: ![img](img/wps43.jpg) 为了更加符合部门需求,我在allure报告中增加了自定义的功能: 1、修改导出按钮,导出整个测试结果的excel ![img](img/wps44.jpg) ![img](img/wps45.jpg) 导出的excel如下图所示: ![img](img/wps46.jpg) ## 七、**工具的执行操作** 代码完成后,工具该如何执行呢? 在testCase模块中有个run.py文件,我们在命令行中执行它即可。ps:需要配置python的环境变量才能这么运行 ![img](img/wps47.jpg) ## 八、**封装的函数** ![img](img/wps48.png)