python自动化测试框架选择

发表于:2020-9-09 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:快乐肥宅燕    来源:今日头条

  基本概念
  什么是框架?
  框架(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的自动化覆盖,较少回归的时间。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号