3Python与软件测试 本章首先介绍Python的相关知识,包括Python语言的特点、应用场合等;其次介绍Python解释器,以及Python编辑器的安装和配置;最后,简要介绍Python的相关测试框架,如unittest、Pytest、Selenium、Appium等。 3.1Python简介〖*2〗3.1.1Python的历史Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,被列入LAMP(Linux、Apache、Mysql以及Python/Perl/PHP)。Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。像Perl语言一样,Python 源代码同样遵循GNU通用公共授权(General Public License,GPL)协议。 Python 2.0于2000年10月16日发布,实现垃圾回收,并支持Unicode。Python 3.0版本于2008年12月3日发布,常被称为Python 3000,或简称Py3k。它相对于Python的早期版本作了较大的升级,未考虑向下相容,导致早期Python程式无法在Python 3.0上正常执行。为此,Python 2.6和2.7作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。 3.1.2Python的特点 Python是一种简单易学、功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python具有如下一些特点。 1. 简单易学 Python作为代表简单主义思想的语言,语法简捷而清晰,结构简单。用户可以快速上手学习。在学习Python过程中,不用计较程序语言在形式上的诸多细节和规则,用户可以专注程序本身的逻辑和算法,探究程序执行的过程。 2. 免费开源 Python是FLOSS(自由/开放源码软件)之一,用户可以自由地发布这个软件的拷贝,阅读它的源代码,对它做改动,并将它用于新的自由软件中。 3. 解释型语言 计算机并不能直接接收和执行用高级语言编写的源程序,源程序在输入计算机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执行。这种“翻译”通常有两种方式: 一种是编译执行;另一种是解释执行。 编译执行是指源程序代码先由编译器编译成可执行的机器码,然后再执行;解释执行是指源代码程序被解释器直接读取执行。编译执行和解释执行各有优缺点。编译执行可一次性将高级语言源程序编译成二进制的可执行指令,通常执行效率高;而解释执行是由该语言(如HTML)运行环境(如浏览器)读取一条该语言的源程序,然后转变成二进制指令,交给计算机执行,通常可以灵活地跨平台。C、C++等采用编译执行方式,Python作为解释型语言,与Java语言类似,不需要编译成二进制代码,而是通过解释器把源代码转换成称为字节码的中间形式,由虚拟机负责在不同的计算机运行。因此,Python程序便于移植,可在众多平台运行,如Linux、Windows、Macintosh、OS/2等。 4. 面向对象 Python是完全面向对象的语言。函数、模块、数字、字符串都是对象,并且完全支持继承、重载、派生、多重继承。用Python语言编写程序无须考虑硬件和内存等底层细节。 5. 丰富的库 Python称为胶水语言,能够轻松地与其他语言(特别是C或C++)联结在一起。其具有丰富的API和标准库,支持图形处理、科学计算、Web开发、爬虫、人工智能等。 3.1.3Python的应用场合 Python功能强大,主要应用于以下场合。 1. GUI软件开发 Python具有wxPython、PyQT等工具,因此可以快速开发出GUI,并且不做任何改变就可以运行在Windows、Linux等平台上。 2. 网络应用开发 Python提供了标准Internet模块,可以广泛应用到各种网络任务中,无论在服务端还是在客户端。另外,网站编程第三方工具,如HTMLGen、mod_python、Django、TurboGears、Zop可以帮助Python快速构建功能完善和高质量的网站。 3. 游戏开发 Pygame是建立在SDL(Simple DirectMedia Layer)基础上的软件包,提供了简单的方式控制媒体信息(如图像、声音等),专为电子游戏设计使用。Pygamer的下载网址为www.pygame.org,如图3.1所示。 图3.1Pygame网址 4. 科学计算 Python具有科学计算的三剑客,即numpy、scipy、matplotlib。其中,numpy负责数值计算、矩阵操作等;scipy负责常见的数学算法,插值、拟合等;matplotlib负责数据可视化。 5. Web与移动设备应用开发 Web2py是一种免费的开源的Web开发框架,帮助开发者分别设计、实施和测试MVC(模型Model、视图View、控制器Controller)模型。web2py的下载网址为www.web2py.com,如图3.2所示。 图3.2web2py网址 6. 数据库开发 Python支持所有主流数据库,如Oracle、Sybase、MySQL、PostgreSQL、Informix等,并通过标准的数据库API接口将关系数据库映射到Python类,实现面向对象数据库系统。 7. 系统编程 Python对操作系统服务设置的内置接口,使其成为编写可移植的维护操作系统的管理工具和部件。Python程序可以搜索文件和目录树,运行其他程序,用进程或线程进行并行处理等。 3.2Python解释器〖*2〗3.2.1在Ubuntu下安装PythonUbuntu(乌班图)是一个以桌面应用为主的Linux操作系统,它基于Debian发行版和GNOME桌面环境。与Debian不同的是,它每6个月会发布一个新版本。Ubuntu的目标在于为用户提供最新的、同时又相当稳定的自由软件构建的操作系统。 在Ubuntu中内置Python,如图3.3所示。 图3.3Ubuntu下内置Python 3.2.2在Windows下安装Python 在Windows下安装Python,一般具有如下步骤: 步骤1: 在浏览器中输入http://www.Python.org进入Python官网,在下载页选择Python3版本的安装包进行安装,如图3.4所示。 图3.4下载Python3 步骤2: 在Windows环境变量中添加Python,将Python的安装目录添加到Windows下的path变量中,如图3.5所示。 图3.5设置环境变量步骤3: 测试Python安装是否成功 在Windows下使用cmd打开命令行,输入Python命令,图3.6表示安装成功。 图3.6测试Python安装是否成功 3.3Python编辑器 Python编辑器众多,除了Python自带的IDLE外,还有notepad++、Sublime、Eclipse+PyDev、Ulipad以及Vim和emacs等。其中,Linux下的Eclipse+PyDev和Windows的PyCharm功能较强大,Anaconda的应用较为广泛。下面依次介绍。 3.3.1IDLE IDLE作为Python内置的集成开发工具,具有能够利用颜色突出显示语法的编辑器、调试工具,Python Shell以及完整的Python 3在线文档集。Python的IDLE具有命令行和图形用户界面两种方式,采用命令行交互式执行Python语句方便快捷,但必须逐条输入语句,不能重复执行,适合测试少量的Python代码,不适合复杂的程序设计。 在Windows下安装的Python文件如图3.7所示。 图3.7Python 3.6 3.3.2PyCharm PyCharm具有一整套可以帮助用户使用Python语言开发时提高效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。此外,PyCharm提供了一些高级功能,用于支持Django框架下的专业Web开发。下载PyCharm双击安装,如图3.8所示。 单击Next按钮,弹出界面如图3.9所示。 安装结束,运行PyCharm,如图3.10所示。图3.8安装PyCharm步骤1 图3.9安装PyCharm步骤2 图3.10运行PyCharm 在PyCharm主界面中单击Create New Project,输入项目名、路径,选择Python解释器。如果没有出现Python解释器,如图3.11所示,选择Python解释器。 图3.11在PyCharm主界面中选择Python解释器 启动PyCharm,创建Python文件,如图3.12所示。 图3.12在PyCharm中创建Python文件 3.3.3Anaconda Anaconda是一个开源的Python发行版本,包含了conda、Python等180多个科学包及其依赖项,涉及数据可视化、机器学习、深度学习等多方面。本书重点介绍Anaconda,所有程序均在Anaconda下调试与运行。 第一,提供包管理。使用conda和pip安装、更新、卸载第三方工具包简单方便,不需要考虑版本等问题。 第二,关注于数据科学相关的工具包。Anaconda集成了如Numpy、Scipy、pandas等数据分析的各类第三方包。 第三,提供虚拟环境管理。在conda中可以建立多个虚拟环境,为不同的Python版本项目建立不同的运行环境,从而解决了Python多版本并存的问题。 Anaconda的安装步骤如下: 打开Anaconda的官网(地址https://www.anaconda.com/download/),如图3.13所示。 图3.13Anaconda的网站 根据本机的操作系统是32位还是64位选择对应的下载版本,如图3.14所示。 下载Python 3.6 version,选择本机保存目录,如图3.15所示。 下载Anaconda35.1.0Windowsx86_64.exe,文件大小约500MB。 注意: 如果是Windows 10系统,注意在安装Anaconda软件的时候,右击安装软件,选择以管理员的身份运行。 选择安装路径,例如C:\\anaconda3,一直单击Next运行结果,完成安装,如图3.16所示。图3.14选择Python 3.6版本 图3.15下载Anaconda文件 图3.16程序运行结果 Anaconda包含如下应用,如图3.17所示。 图3.17Anaconda包含应用 (1) Anaconda Navigator: 用于管理工具包和环境的图形用户界面,后续涉及的众多管理命令也可以在 Navigator 中手工实现。 (2) Anaconda Prompt: Python的交互式运行环境。 (3) Jupyter Notebook: 基于Web的交互式计算环境,可以编辑易于人们阅读的文档,展示数据分析的过程。 (4) Spyder: 一个使用Python语言、跨平台的、科学运算的集成开发环境。相对于Pydev、PyCharm、PTVS等Python编辑器,Spyder对内存的需求小很多。 下面进行Anaconda的环境变量配置。在Anaconda Prompt中出现类似cmd的窗口。输入conda version,运行效果如图3.18所示。 图3.18Anaconda版本 在Anaconda Prompt中输入如下命令: conda create -n env_name package_names其中,env_name 是设置环境的名称(n 是指该命令后面的env_name是创建环境的名称),package_names 是安装在创建环境中的包名称。conda create --name test_py3 python=3.6 #创建基于Python3.6的名为test_py3 的环境运行效果如图3.19所示。 图3.19创建基于Python 3.6的名为test_py3 的环境 在Anaconda Prompt中使用conda list查看环境中默认安装的几个包,如图3.20所示。 图3.20查看环境的默认包 在Anaconda下,Python的编辑和执行有交互式编程、脚本式编程和Spyder三种运行方式。 1. 交互式编程 交互式编程是指编辑完一行代码,回车后会立即执行并显示运行结果。在test_py3环境中输入Python 命令回车后,出现>>>,进入交互式编程模式,如图3.21所示。 图3.21进入交互式编程模式 在>>>之后输入Python 语言的各种命令。例如,输入print('Hello world!')命令,如图3.22所示。 图3.22print()输出 2. 脚本式编程 Python和其他脚本语言,如java、R、Perl等一样,可以直接在命令行里运行脚本程序。首先,在D:\\目录下创建Hello.py文件,内容如图3.23所示。 图3.23Hello.py文件内容 其次,进入test_py3环境后输入Python d:\\Hello.py命令,运行结果如图3.24所示。 图3.24运行d:\\Hello.py文件 3. Spyder 单击Anaconda应用中的最后一个项目——Spyder。Spyder是Python的集成开发环境,如图3.25所示。 图3.25Spyder编辑器 3.4Python测试框架 自动化测试工具需要脚本语言的支持,而Python作为“胶水语言”,其应用范围广泛。和Python相关的测试框架有unittest、Pywinauto、Selenium、Pylot、Appium、pytest等。 3.4.1unittest unittest模块实现单元测试。单元测试是由开发人员(而不是测试人员)完成的测试,用于保证一个程序基本单元的正确性。单元测试框架代替开发人员完成了一些调用、IO等与单元测试无直接关系的支撑代码,让开发人员可以专注于测试用例的编写,简化单元测试工作。 unittest模块的API与Java的JUnit、.net的NUnit、C++的CppUnit很相似,第4章进行详细介绍。 3.4.2Pywinauto Python提供Pywinauto开源的框架进行图形用户界面(Graphical User Interface,GUI)测试,对开发环境可复用的构件进行操作的正误判断。 Pywinauto与QTP测试工具的功能类似,用于测试Windows控件的一系列动作,如指定窗口、鼠标或键盘操作,获得控件属性等。Pywinauto的官网是http://pypi.python.org/pypi/pywinauto/0.4.0。 Pywinauto的操作步骤如下所示: 步骤1: 下载Pywinauto,网址是https://sourceforge.net/projects/pywinauto/files/,如图3.26所示。 图3.26Pywinauto下载网页 步骤2: 下载pywinauto0.4.0.zip文件,解压缩到C:\\pywinauto0.4.0,在DOS下进入pywinauto0.4.0目录,执行如下安装命令: python setup.py install,如图3.27所示。 图3.27Pywinauto安装界面 【例3.1】Pywinauto举例。from pywinauto import Application#引入Pywinauto模块 import time app=Application.start("notepad") #调用notepad app.__setattr__("name","notepad") time.sleep(2) app.Notepad.edit.TypeKeys('hello!') i=0 while i<=10: app.Notepad.edit.TypeKeys('test') i+=1 time.sleep(2) app.Dialog.Button1.Click() time.sleep(1) app.Notepad.Close()程序运行结果如图3.28所示。 图3.28Pywinauto的运行结果 3.4.3Selenium Python进行Web自动化测试的工具有很多,如Selenium、RF和twill等。其中较常用的是Selenium。Web负载测试解决方案几乎都是采用“录制回放”的技术。通过捕获用户的每一步操作,如界面的像素坐标或对象(窗口、按钮、滚动条等)的位置,以及状态或属性的变化,可以用脚本语言记录。回放时,将脚本语言转换为屏幕操作,对比被测系统的输出记录与预先标准记录之间的关系。 Selenium在第5章进行详细介绍。 3.4.4Pylot Pylot工具实现的压力性能测试,用于测试被测应用程序能够承受的压力,即同时能够承受的用户访问量(容量),最多支持有多少用户同时访问某个功能。 Pylot是Python编写的用以测试 Web性能和扩展性的工具,进行http负载测试。Pylot下载网址为 http://www.pylot.org/,如图3.29所示。 图3.29Pylot下载网址 Pylot具有以下优点: (1) Pylot是通过Python语言开发的第三方软件,继承了Python简洁优雅的代码风格,通俗易懂,十分容易上手。 (2) Pylot体积小,十分适合个人网站以及中小型企业网站测试网站性能。它支持http和https请求,有着多线程负载生成器,可以自动处理cookies,支持响应正则表达式,在安装了wxpython后还支持GUI模式,具有测试实时统计功能,有良好的跨平台性,支持Windows系统和Linux系统。 (3) Pylot在进行压力测试时会模拟大量主机发起并发请求,在测试过程中检验服务器的响应,测试完成后会生成关于本次测试的结果报表。使用过程中,如果配合上Numpy、Matplotlib,就可以在最后的测试报表中自动绘制图表来反映对被测试网站的测试过程。 【例3.2】Pylot举例。 下载并解压Pylot,如图3.30所示。 图3.30下载并解压Pylot Pylot测试步骤如下所示。 步骤1: 配置testcases.xml。 在pylot_1.26文件夹里修改testcases.xml文件,用记事本打开,将需要测试的网页地址添加进去。 http://www.example.com/ 在上面的代码中,把http://www.example.com/改为需要测试的网址,然后保存文件。 步骤2: 执行测试命令。 在Pylot目录下执行run.py。如并发10台主机,测试时间3s,就可以执行以下命令:python run.py -a 10 -d 3其中a即agent,代表并发的连接主机数,d即duration,表示测试时间,以显示测试进度。测试过程如图3.31所示。 图3.31测试过程 在生成报表后,在pylot_1.26文件夹下的result文件夹中会有测试完成后所生成的数据图表,如图3.32所示。 图3.32所生成报表 3.4.5Appium Python提供Appium测试框架进行移动测试(Mobile Testing)。移动测试是指对移动设备提供真机测试服务的平台,用于发现App中的各类隐患,如应用崩溃、各类兼容性问题、功能性问题、性能问题等。 Appium测试框架在第8章进行详细介绍。 3.4.6Pytest Pytest是Python最流行的单测框架之一。它与Python自带的unittest测试框架类似,提供测试用例的详细失败信息,使得开发者可以快速准确地改正问题,还兼容 unittest、doctest 和 nose等测试工具。 Pytest具有如下优点:  允许直接使用assert进行断言,而不需要使用self.assert。  可以自动寻找单测文件、类和函数。  非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考。  能够支持简单的单元测试和复杂的功能测试。  支持运行由nose、unittest编写的测试case。  具有很多第三方插件,并且可以自定义扩展。  方便地和持续集成工具集成。 在Anaconda Prompt下使用命令pip install  U pytest进行安装,如图3.33所示。 图3.33安装Pytest 【例3.3】Pytest举例。 实现如下功能: (1) 定义被测试函数inc,将传递进来的参数加1后返回。 (2) 定义测试函数 test_answer对func进行测试。 (3) 在test_answer中利用断言进行结果验证。 (4) 保存代码,命名为test_sample.py。 test_sample.py代码如下所示:definc(x): return x+1 deftest_answer(): assert inc(3)==5在命令行执行如下命令运行:Pytesttest_sample.py运行完成后,可以得到如图3.34所示结果。 图3.34程序运行结果