必看超赞!python+unittest+selenium测试框架GitHub源码分享!从。。。
⽂章⽬录
GitHub 分享
GitHub 框架源码:
项⽬介绍
本⼈使⽤的是 python + selenium + unittest + PO + BeautifulReport + redis + mysql + ParamUnittest + 多线程 + 截图/⽇志 + 多浏览器⽀持 + RemoteWebDriver +⽂件读取 + 全参数化构建,即在 python + unittest + selenium 基础上加了不少东西。
为什么是 unittest 不是 pytest,因为 pytest 相对 unittest 来讲更容易些,⽽且⼆者虽然使⽤频率都很⾼,但是 unittest 似乎使⽤频率要更⾼⼀点,并且 unittest 还可做单元测试,于是就选择了 unittest 来搭建。
下⾯就会进⾏保姆级搭建讲解O(∩_∩)O
⼯具准备
建议使⽤ pycharm
本⼈ python 3.6 和 pip ⼯具
git ⼯具,提交代码到远端仓库可⽤
项⽬依赖如下:
BeautifulReport 0.1.2
ParamUnittest 0.2
PyMySQL 0.9.3
futures 3.1.1
pip 10.0.1
redis 3.3.11
selenium 3.141.0
setuptools 39.1.0
tomorrow 0.2.4
urllib3 1.25.7
采⽤的是 PageObject 分层结构,什么是 PO 结构可以百度,由于本⽂内容较多不做赘述。搭建的过程中我使⽤的是 venv 虚拟环境,⼤家搭建过程中可⽤虚拟环境也可⽤系统环境,虚拟环境和系统环境的区别这⾥也不做赘述,同时我也把这个 venv ⽂件夹给 gitignore 了,⼤家若是从 github 拉下来是看不到这个⽂件夹的,可以依据此⽂提供的依赖⾃⾏ pycharm 中 install 依赖。
框架结构搭建
python 项⽬默认将项⽬根⽂件夹作为包,我将其下的 ui-test 作为了包,在 pycharm 的 settings 中搜索 Project Structure,选中 ui-test 点击蓝⾊的 Sources 然后保存即可,因为防⽌ python import 时候路径不会出现红⾊波浪,不过出现了也不会运⾏出错。采⽤ PO 思想,⼤家可以先 install 上⾯说的依赖,再创建需要的⼏个⽂件夹如下图所⽰:
python-ui-auto-test
- api-test(api 测试包,未添加内容)
- ui-test(ui 测试包)
- base(与项⽬初始化配置相关)
- case(测试⽤例脚本)
- common(共⽤⽅法)
- data(数据驱动)
- locator(页⾯对应的元素定位)
- page(页⾯类)
- report(输出报告)
- html(html 类型报告)
- log(log ⽇志报告)
-
img(测试截图)
- resource(资源⽂件夹)
- config(配置⽂件)
- driver(驱动)
- util(⼯具类)
- README.md(项⽬介绍 md)
- (项⽬依赖清单)
- run_all.py(类似于 testng ⽂件执⾏测试套,单线程)
- run_all_mutithread.py(类似于 testng ⽂件执⾏测试套,多线程)
- venv(虚拟环境的⽂件夹,github 拉下来后需要⾃⼰创虚拟环境)
- .gitignore(git 忽略⽂件)
External Libraries
Scratches and Consoles
其中需要着重关注的是 base ⽂件夹,common ⽂件夹,case ⽂件夹,resource ⽂件夹,util ⽂件夹和两个 run.py。⼤致思想是 base 中存放初始化项⽬的⼯具,然后 page 中编写页⾯逻辑代码,page 中可使⽤ data 的数据和 locator 的元素定位,在 case 中对 page 进⾏测试组织,通过 resource 中的配置在 run.py 中跑测试⽤产⽣的报告放在 report ⽂件夹中。每个⽂件夹中含有⼀个__init__()⾥头就是对该⽂件的描述
case/data/locator/page PO 思想
case
我打算测试百度,csdn两个页⾯的基本流程,我所有的测试模块全部以 test 字段开头,并且所有测试模块中的测试类继承
了unittest.TestCase
并且其中的测试⽅法都以 test 字段打头,通过后⾯跟上数字来按顺序跑测试⽅法
单个模块去测试的话我们在测试模块下补上这样的代码:
unittest 的 main ⽅法执⾏时会⾃动去所有 test 打头的测试⽅法,测试类中若有 setUp 或者 tearDown ⽅法,他们会在每个 test 测试⽅法之前和之后执⾏,⼀般存放驱动初始化和驱动退出的操作
data
对应 page 存放指定页⾯的数据,可以弄成 excel 表格存储指定页⾯的数据,这⾥可以直接写成代码,因为考虑到如果项⽬不稳定,会⽐较频繁的改动这个地⽅的数据,⽤ excel 打开再去改动⽐较繁琐
locator
与 data 类似,这⾥存放指定页⾯的元素定位
python怎么读文件夹下的文件夹page
这⾥写不同页⾯的逻辑功能代码,page 需要继承 common ⽂件夹的 PageCommon 类,同时 PageCommon 再继承
BrowserCommon 类
run.py 测试套件
⼀个是run_all.py另⼀个是run_all_mutithread.py分别可以跑单线程和多线程,相当于 testng 的l只不过这⾥写的是 python 代码,⼤致就是⽤到了 unittest 往测试套中添加测试模块,然后使⽤了 BeautifulReport 的 report ⽅法,但实际写的过程中本⼈把它封装成了ReportTool ⼯具类,如下:
多线程的话使⽤了 tomorrow 依赖,通过@thread运⾏测试⽤例,下⾯的run_mutithread()⽅法被 main 调⽤
common 共⽤类
PageCommon
存放页⾯原⽣操作的封装,如元素点击元素等等,对于测试模块有其他较⼤型的共⽤⽅法的封装可以放在其中或者单独弄出⼀个类,使得所有页⾯类继承这个新类,然后新类继承 PageCommon,⽬前是页⾯类都继承了 PageCommon
BrowserCommon
PageCommon 继承了 BrowserCommon,包含与浏览器相关的共⽤⽅法,如浏览器切换窗⼝句柄,执⾏ js,驱动获取和关闭等,其构造器会传⼊⼀个驱动,所以每次在测试类中初始化⼀个页⾯类必须要往⾥头传⼊⼀个驱动才⾏
config.ini 参数化构建项⽬
本⼈将项⽬⼏乎所有可配置的参数保存在 ini ⽂件中,通过⼯具类 ConfigReader 来对此⽂件读取参数使⽤,config.ini ⽂件中包含[project],[driver],[redis],[mysql],[screenshot],[html],[log] ⼀共 7 项配置,后续可能加上 [oracle],[sqlserver],[mongoDB] 等⼯具的配置,ini ⽂件部分内容如下:
那如何读取呢?通过 util 中的 ConfigReader 的 read ⽅法来读取
在其他模块中通过ConfigReader().read("project")["driver"]这样的形式即可获取配置⽂件中的参数,项⽬完全可以依靠此配置⽂件来构建整个项⽬
Assembler 装配器
注意是装配器⽽不是装饰器!Assembler 装配器的功能就是让测试⽤例运⾏之初进⾏各项功能的配置初始化,当然参数来源于 config.ini ⽂件。具体怎么使⽤呢,可以在测试模块的 setUp ⽅法中assembler = Assembler()来创建,其可以写⼀个⽆参的构造器把初始化驱
动,redis,mysql 等放在其中,通过 get ⽅法来获取这些⼯具,包括 driver,部分代码如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论