史上最全:python自动化测试栈

为什么做自动化测试

根据《中国软件测试从业人员调查报告》,手工测试占到的89% ,相对开发来说,测试的门槛底,薪资普遍较底,所要求的知识面虽然有一定广度,但缺乏深度。

上面的报告,直击痛点!

国内的测试多为手工点击,多人参与。测试门槛低,参与人员多,薪资涨幅弱。到头来,多数人面临着谢谢参与奖。 而自动化技术是新天地,将测试与开发的相结合,打出了最强硬的口号“不是所有测试人员的都叫测试开发人员”。测试人员想提高自身竞争力,就要向着测试开发人员努力。

自动化测试分类

传统自动化测试更关注UI层的自动化测试,而Martin Fowler大师提出了测试分层的概念,倡导产品的不同阶段都需要自动化测试。

这就是我们熟知的金字塔模型,第一层为UI测试,第二层为集成/接口测试,第三层为单元测试。

  • UI自动化测试,大部分测试人员的工作就是对UI层的功能进行测试。例如,我们对按钮进行点击,对输入框进行输入,都可以通过相应的自动化测试工具来模拟这些操作,从而解放重复的劳动。
  • 接口/集成测试则关注一个函数,一个接口,例如函数A()是否好用。接口也可以是url的传递,例如通过get方式向服务器发送请求,发送的内容做为URL的一部分传递到服务器端,此时Web service技术会对外提供一个公共接口,利用工具对其进行测试。
  • 单元测试关注代码的逻辑,比如for循环,if分支等;

于是会发现一个有意思的现象,如果把不同层级的测试用蛋糕比喻的话:单元测试衡量蛋糕材料是否新鲜,接口/集成测试衡量混合后的材料味道是否甜美,而UI测试则衡量最终的蛋糕是否光鲜艳丽。

需要注意的是:按照上面测试金字塔模型,越向下,回报率越高。比如单元测试回报率最高,因为蛋糕的材料不好,可以扔了重买;但UI测试不一样,成形的蛋糕即使有缺陷,我们也不舍得仍。

下面我将详细介绍各种python自动化工具:

UI自动化

为什么要做UI测试呢?因为UI层是用户使用产品的入口,也就是说,以用户的视角去评测我们的产品,这是对产品的最直观反应。

UI测试因为使用广,场景繁的缘故,有非常多的工具供我们使用,目前的使用场景有三大阵营:移动端app,web,电脑软件。其对应的测试工具,如下图:

其中的小红旗是推荐使用的工具。

移动app

移动app又分为两大阵营,android和ios,值得一提的是,几乎所有的工具支持这两个平台,而每个工具都有看家本领:

工具iosandroid特色官网
Appium✔️✔️跨平台http://appium.io/
Airtest✔️✔️组合开发http://airtest.netease.com/
ATX✔️✔️图像缩放https://github.com/NetEaseGame/ATX
UiAutomator
✔️

兼容

https://developer.android.google.cn/
  • Appium最大特点是跨平台性:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了iOS和Android测试套件间代码的复用性。
  • Airtest基于图像识别和控件识别,值得注意的是Airtest框架由网易团队自己开发,机用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形摆列组合成神器的程序。

  • ATX是完全的黑盒测试框架,无需知道项目代码。对于iOS的真机,安卓模拟器都能很好的支持,尤其对游戏的测试,使用了图像识别同一个测试脚本可以通过图像的缩放算法,适配到其他分辨率的手机上。
  • UiAutomator是Android团队提供的自动化测试框架,用来帮助开发人员更有效率的完成App的Debug工作,同时对于测试人员也是一大福音,它支持基本上所有的Android事件操作,它不需要测试人员了解代码实现细节。

这四种工具各有优点:appium的跨平台;airtest的简单便捷;atx对游戏的缩放扩展;以及uiautomator对安卓完美兼容。他们都有对应的Desktop版本,可视化操作是新手的福音,但你也要注意他们的缺点,比如atx团队分裂开发,他们官网分出了两个分支来应对android和ios;uiautomator固然强大,但他仅仅支持android。

WEB

工具特点官网
Selenium直接运行在浏览器中https://docs.seleniumhq.org/
Splinter对Selenium的二次封装https://docs.seleniumhq.org/
  • Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。支持自动录制动作和自动生成。Net、Java、Perl等不同语言的测试脚本。
  • Splinter是一个使用Python开发的开源Web应用测试工具。它可以帮你实现自动浏览站点和与其进行交互。Splinter对已有的自动化工具(如:Selenium、PhantomJS和zope.testbrowser)进行抽象,形成一个全新的上层应用API,它使为Web应用编写自动化测试脚本变的更容易。

显然 ,splinter运用了selenium框架,他的功能会更加丰富,比如动画演示中slinter使用的chrome驱动,不用像selenium那样必须显式指出chromeDriver的真实位置。

WIN/MAC

工具WindowsMac特点官网
PyAutoGui✔️✔️函数丰富https://pyautogui.readthedocs.io/en/latest/
Autopy✔️✔️跨平台https://www.autopy.org/
Autoit ✔️ 窗口句柄 http://www.sikulix.com/
  • PyAutoGui是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务
  • AutoPy是一个简单的跨平台GUI自动化工具包,适用于Python。它包括用于控制键盘和鼠标,在屏幕上查找颜色和位图以及显示警报的功能 – 所有这些都是以跨平台,高效和简单的方式进行的。
  • Autoit被设计用来在Windows GUI中进行自动操作。通过它可以组合使用模拟键击、鼠标移动和窗口/控件操作等来实现自动化任务。

三种工具的差别并不大,pyautogui的函数很丰富,比如演示中的size()函数,其余两种工具就不存在;值的一提的是autopy支持找图,不过这个功能有点鸡肋,实际测试中,autopy对图片的要求非常高,经常出现找不到;autoit可以识别窗口句柄,这就意味着,我们不会被弹出的窗口所干扰,但是不支持mac系统。

接口

相对UI测试而言,接口测试就很清爽了,只有下面三类:

工具特点官网
Requests简单快捷http://www.python-requests.org/en/master/
HttpRunner测试报告https://github.com/HttpRunner/HttpRunner
Pyresttest利用配置文件驱动https://github.com/svanoort/pyresttest
  • Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests是python实现的最简单易用的HTTP库。
  • HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
  • pyresttest是一个用python实现的API自动化测试工具。同样使用YMAL/JSON格式的脚本驱动,不用写代码。由于与httprunner很像,就不录制gif了。

这三种工具,requests是非常方便的http工具,几行代码便可以模拟浏览器;httprunner有自己的生成报告,这一点太出色了!我们只需要维护YMAL/JSON脚本,就像演示的那样。

单元测试

工具测试的语言官网
JythonJavahttp://www.jython.org/
SwigC/C++http://swig.org/
  • Jython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython几乎拥有标准的Python中不依赖于C语言的全部模块。比如,Jython的用户界面将使用Swing,AWT或者SWT。 Jython可以被动态或静态地编译成Java字节码。
  • Swig是一个可以把c/c++代码封装为python库的工具。

这两种工具,jython的使用让我很吃惊,我从没在python中运行java代码,jython的出现,真正让我们感受到了胶水语言的强大;swig同理,用来封装c/c++到python库。

其他测试

安全

工具官网
Grabberhttps://pypi.org/project/grabber/0.1.0/
Wapitihttp://wapiti.sourceforge.net/
W3afhttp://w3af.org/
  • grabber定期抓取Mac屏幕的图片,并可选择制作电影。默认情况下,每隔5分钟运行一次Mac的screencapture实用程序并保存抓取。
  • wapiti允许审核网站或Web应用程序的安全性。它通过抓取已部署的webapp的网页,查找可以注入数据的脚本和表单来执行Web应用程序的“黑盒”扫描(它不会研究源代码)。一旦获得了URL,表单及其输入的列表,Wapiti就像一个模糊器,注入有效负载以查看脚本是否容易受到攻击。
  • w3af是一个Web应用程序攻击和审计框架。该项目的目标是创建一个框架,通过查找和利用所有Web应用程序漏洞来帮助您保护Web应用程序。

性能

工具官网
Locusthttps://www.locust.io/
Grinderhttp://wapiti.sourceforge.net/
W3afhttp://w3af.org/
  • locust支持分布在多台机器上的运行负载测试,因此可用于模拟数百万同时用户经过验证和战斗测试蝗虫已被用于模拟数百万同时用户。在代码中定义用户行为不需要笨重的UI或臃肿的XML。
  • Grinder是一个Java装载测试框架,可以使用许多装载注入器机器轻松运行分布式测试。它可以在BSD风格的开源许可下免费获得。
  • w3af是一个Web应用程序攻击和审计框架。该项目的目标是创建一个框架,通过查找和利用所有Web应用程序漏洞来帮助您保护Web应用程序。

测试框架

工具官网
Pytesthttps://docs.pytest.org/en/latest/
Unittesthttps://docs.python.org/3/library/unittest.html
Nosehttps://pypi.org/project/nose/
  • pytest框架可以轻松编写小型测试,然后进行扩展以支持应用程序和库的复杂功能测试。
  • unittest单元测试框架最初的灵感来自JUnit,与其他语言的主要单元测试框架具有相似的风格。它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性。
  • nose扩展了unittest的测试加载和运行功能,制作 它更容易编写,查找和运行测试。

DevOps

工具官网
Ansiblehttps://www.ansible.com/
Saltstackhttps://www.saltstack.com/
Fabrichttps://get.fabric.io/
  • ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
  • SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
  • Fabric是一个 Python (2.5-2.7) 的库和命令行工具,用来提高基于 SSH 的应用部署和系统管理效率。更具体地说,Fabric是一个让你通过命令行执行无参数Python函数的工具;一个让通过SSH执行Shell命令更加容易、更符合Python风格的命令库(建立于一个更低层次的库)。

总结

在这篇文章中,汇集了python技术栈的许多工具,我几乎试用了每一个工具,并为之录制了小demo,得出几个结论:

  1. 测试工具大部分免费。
  2. 工具很重视多个平台。

我们学习工具,不仅要学习如何使用,而是要学习工具的内核,比如appium的内核是uiautomator,你不仅会用appium的find_element函数,也需要知道appium调用的是webdriver的接口等等。

许多人对测试行业有很深的误解,我和思寒老师也讨论过这个问题,开发人员眼中的测试是:薪资低,门槛低,技术栈低,但这只是你们听来的三低,我写这篇测试技术栈文章,试用了几乎所有的测试工具,有的工具门槛很高,需要很强的代码逻辑,有的工具使用简单,但背后的原理深不可测,现如今的测试已经不是大家口头的三低,随着软件的蓬勃发展,测试行业必然随影随行,就像是试卷和判卷老师,判卷老师决定了试卷分数高低,如果你是一名开发人员,了解判卷规则后,你的代码水平会指数上升,如果你是一名测试人员,学习更多内容,会让你判卷时得心应手,甚至可以另辟蹊径,开辟测试开发这个潜力市场。

更多

霍格沃兹测试学院官网首页:https://testing-studio.com