软件测试之python自动化测试框架选择
软
件
测
试
软件测试之python自动化测试框架选择
什么是框架?
框架(Framework)是整个或部分系统的可重用设计,框架是用来解决代码的组织及运行控制问题的。
框架是一个“架子”,这个架子能够完成领域内基础的、重要的功能。基于这个已有的架子,我们可以将重心放在面向业务的开发上。
其次,框架也是一个“框框”。“框框”为我们设置了有形和无形的约束。所谓有形的约束,就是我们的开发工作需要符合框架的定义、与框架兼容。所谓无形的约束,就是我们的开发工作需要承受框架的缺点和不足(毕竟,没有十全十美的框架)。
总结:封装公共方法、代码和配置文件的组织、执行控制。
什么是测试框架?
软件测试分为手工测试和自动化测试。需要注意的是,一般只有自动化测试才有框架的概念。(自动化)测试框架,需要提供自动化测试用例编写、自动化测试用例执行、自动化测试报告生成等基础功能。
有了测试框架,我们只需要完成和业务高度相关的测试用例设计和实现即可。另外,框架会为我们处理好复杂度与扩展性的问题,我们无需为此操心。
有了这些概念作为支撑,我们就很容易理解什么是Python单元测试框架了。所谓Python单元测试框架,就是面向Python编程语言,服务于Python单元测试的自动化测试框架。
一个完整的测试脚本(用例)一般包含以下几个步骤:
环境准备或检查
执行业务操作
断言结果
清理环境
而测试框架一般还要完成用例加载,批量执行,异常控制,结果输出等功能。基础的测试框架一般只提供执行控制方面的功能。
测试框架应具有的特点:
易用性:编写用例,执行用例,生成报告及定位问题方便
健壮性:稳定,比如timeout机制等
扩展性:插件
灵活性:用例组织或执行的灵活性,Fixture功能(不同范围的setUp和tearDown)等
定制性:二次开发方便
什么是单元测试?
单元测试是软件测试的一种类型。顾名思义,单元测试就是测试的对象是程序中的最小单元的测试。程序的最小单元可以是一个函数,一个类,也可以是函数的组合,类的组合。
单元测试是软件测试中最低级别的测试活动,与之相对的更高级别的测试有模块测试,集成系统和系统测试等。单元测试一般由软件开发者而不是独立的测试工程师完成。另外,单元测试有一个隐含的性质,那就是单元测试天然就是自动化的,单元测试属于自动化测试。
主流框架
unittest:python自带,最基础的单元测试框架
nose:基于unittest开发,易用性好,有许多插件
pytest:同样基于unittest开发,易用性好,信息更详细,插件众多
robotframework:一款基于Python语言的关键字驱动测试框架,有界面,功能完善,自带报告及log清晰美观
总体来说,robotframework由于有界面及美观的报告,易用性更好,灵活性及可定制性略差;unittest比较基础,二次开发方便,适合高手使用;pytest/nose插件多更简洁;pytest>nose>unittest
pytest优点:
社区更活跃,学习资料详细(node2不支持node全部功能)
pytest支持更复杂的测试功能
pytest报错调试更易查看
unittest
用例编写规则?
unittest提供了testcases、testsuites、testfixtures、testrunner相关的类,让测试更加明确、方便、可控。使用unittest编写用例,必须遵守以下规则:
测试文件必须先importunittest
测试类必须继承unittest.TestCase
测试方法必须以“test_”开头
测试类必须要有unittest.main()方法
用例前置和后置
unittest提供了setUp/tearDown,只能针对所有用例。
断言
unittest提供了assertEqual、assertIn、assertTrue、assertFalse。
报告
unittest使用HTMLTestRunnerNew库。
失败重跑
unittest无此功能。
参数化
unittest需依赖ddt库。
用例分类执行
unittest默认执行全部用例,也可以通过加载testsuit,执行部分用例。
pytest
用例编写规则
pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效。使用pytest编写用例,必须遵守以下规则:
试件名必须以“test_”开头或者"_test"结尾(如:test_ab.py)
测试方法必须以“test_”开头
测试类命名以"Test"开头
用例前置和后置
pytest提供了模块级、函数级、类级、方法级的setup/teardown,比unittest的setUp/tearDown更灵活。
模块级(setup_module/teardown_module)开始于模块始末,全局的
函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
方法级(setup_method/teardown_method)开始于方法始末(在类中)
类里面的(setup/teardown)运行在调用方法的前后
断言
pytest直接使用assert表达式。
报告
pytest有pytest-HTML、allure插件。
失败重跑
pytest支持用例执行失败重跑,pytest-rerunfailures插件。
参数化
pytest直接使用@pytest.mark.parametrize装饰器。
用例分类执行
pytest可以通过@pytest.mark来标记类和方法,pytest.main加入参数("-m")可以只运行标记的类和方法。
robotframework
优点:
不需要懂编程也可以用。
有丰富的测试库:AutoItLibrary,AppiumLibrary,HTTPlibrary(Requests)...,所以,满足了主流的各种自动化测试需求。
实在满足不了测试需求,只要你懂Python,也可以自己去开发关键字来用。
便于团队推广,不是所有测试团队都懂编程的,也不是每个测试都对技术有追求的。这个时候,只要团队中有一个人懂python开发robotfamework关键字,其它人会关键字就可以。
集成了非常棒的HTML测试报告,还带错误截图噢。
缺点:
一样有学习成本。robotframework也不带录制功能;不是录个脚本随便跑的那种。
robotframework目前对Python3的支持性不好,主要是它的扩展库的问题。
我不太喜欢robotframework的语法(我说的是我)。
nose
nose是Python的一个第三方单元测试框架。这意味着,如果要使用nose,需要先显式安装它:pipinstallnose。
与unittest不同的是,nose的测试用例并不限制于类。任何函数和类,只要名称匹配一定的条件(例如,以test开头或以test结尾等),都会被自动识别为测试用例;并且,为了兼容unittest,所有的基于unitest编写的测试用例,也会被nose自动识别为。
需要注意的是,nose已经进入维护模式,从github(https://github.com/nosedevs/nose/commits/master)上可以看到,nose最近的一次代码提交还是在2016年5月4日。继承nose的是nose2,但要注意的是,nose2并不支持nose的全部功能,
nose2的主要目的是扩展Python的标准单元测试库unittest,因此它的定位是“带插件的unittest”。nose2提供的插件,例如测试用例加载器,覆盖度报告生成器,并行测试等内置插件和第三方插件,让单元测试变得更加完善。
使用情况
越来越多的项目开始放弃unittest和nose以及robotframework,转而使用pytest,比如Mozilla和Dropbox.因为pytest可以提供更丰富功能,包括assert重写,第三方插件,以及其他测试工具无法比拟的fixture模型。
此外,现在大厂很多都用了pytest这个测试框架,因为效率高,数据驱动模式非常人性化,可持续集成也非常方便,最主要是非常简单,团队实习生都看一下模板都可以上手,团队从unittest转为nose,再最终定为pytest,目前基本是每个项目都有pytest的自动化覆盖,较少回归的时间。
好好学习,天天向上
天道酬勤
END
获取更多精彩内容