软件测试行业两大经典难题,是怎么被HttpRunner解决掉的?

测试行业面临两个经典问题。

一是工具多。每个工具只能满足特定的一个部分,接口工具只能做接口,性能工具的只能做性能,而实际工作往往需要多个工具配合。

二是需要加大投入产出比,用最少的投入获得最大的回报。

举个例子:编写接口测试开发代码需要使用:Requests。但只使用Requests工具未免有些小缺陷,必须配合单测Unitest和Charles才能好用。代码编写通过后,又得使用jenkins进行项目部署。

于是,我们想:“是不是有一款工具,集合了上面所有功能?这样我就可以轻装上阵!”

1HttpRunner是什么?

HttpRunner是什么?它就是让你轻装上阵的工具,这是一款面向 HTTP(S) 协议的通用测试框架。

只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。

HttpRunner基于Python,可以运行在 macOS、Linux、Windows 系统平台上。读到这里,你是否有疑问,HttpRunner真是个全能手,既然它可以像Requests那样便利的操作HTTP,又可以做到jenkins的持续集成,那它的内部一定藏着大量干货!

2HttpRunner的设计理念

不,你想错了,HttpRunner并没有实现这么多工具!说到这里,不得不介绍一下HttpRunner的设计理念

  • 充分复用优秀的开源项目,不追求重复造轮子,而是将强大的轮子组装成战车
  • 遵循约定大于配置的准则,在框架功能中融入最佳工程实践
  • 追求投入产出比,一份投入即可实现多种测试需求

于是可以得出这个结论:HttpRunner=requests+jenkins+locust+...哦!好像明白了,它并不是闭门造轮子,而是通过整合许多工具,实现了很多功能。比如我们发HTTP请求,它会调用Request。HttpRunner只是更多的去做整合类似的工具。同时他们也在强调,希望投入非常少,回报非常丰厚,由于整合的缘故,学习HttpRunner的成本会非常低,如果你之前用过Requests,现在使用HttpRunner的HTTP协议,学习成本几乎为零。下图清晰的展示了HttpRunner的工具集。

它们的图标也蕴含着整合的概念,从外部视角来看,拼图代表它是整体中的一个部分。从内部视角呢,它实现了一个模块化的拆分,比如用例的时候分为准备,初始化,加载,运行。其实它遵循了unix哲学,如果你上过shell课程,你会发现shell也是简单的命令组合,但结果却非常强大。

ps:图标的含义不是我凭空想象,而是HttpRunner作者亲口相传,具体内容请关注霍格沃兹测试学院:HttpRunner作者与您分享开发经验!

3性能指标

可是它有这么多的功能,好用吗?HttpRunner有自己的性能体系,它们关注三个指标:测试用例数,执行频率和运行成功率。很多人对指标没有概念,认为这是比较虚的东西,于是坚持三好原则:好用就行,好看就行,好评就行。其实并不是这样,指标是测试必须要考虑和面对的问题,因为这是数据上的铁证。HttpRunner用指标衡量自己,规范自身,下面介绍HttpRunner是如何落实三个指标的。

图片来自网络,侵权即删

  • 测试用例数和覆盖率有关系。大家所知的覆盖率通常是指单元测试上的代码覆盖率,它是用来衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况。就拿条件覆盖举例,它判定每个if表达式的结果是否被测试到了。测试用例数同理,是指测试用例的覆盖率,它由用例的编写,维护效率和学习成本决定。
  • 执行频率能反应项目使用情况,于是对效率有足够的要求,比如HttpRunner的分布式执行高度,后面会有所涉及。
  • 最后的成功率很好理解,代表整个项目的稳定性。

三个指标相辅相成相互制约,HttpRunner靠什么来提升这些指标?HttpRunner究竟有哪些特色?请继续观看。

4能力检阅

上面我们提到许多概念性的东西:设计理念,文化和指标等等。本小节会详细讲解HttpRunner的工作原理,带你检阅它的能力,去感受它的强大。首先,HttpRunner以YAML/JSON文件为核心。你会惊讶,它仅用一份文件就实现了性能测试,持续集成,线上监控,生成测试数据等等,你必须要知道YAML/JSON文件的前世今生。

生成YAML/JSON文件有两种方式:人工编写和自动生成。人工编写的代码与Requests很像,比如下面是requests代码:

HttpRunner的YAML/JSON文件对Requests进行精简,提取出了主要部分。下面是HttpRunner的文件内容,它对Requests改动并不是很大,实现了一个功能最小描述。可以让HttpRunner既简洁又规范,让你从Requests无缝转换到HttpRunner。

HttpRunner为什么不直接采用requests格式,而是取功能最小描述呢?你会发现,每一个接口测试都包含三个部分:构造请求,发起请求,校验。

虽然内容一样,但每个人都有自己的代码风格,如果风格不一样,理解起来会很困难,HttpRunner采取精策略,做到了简单易懂。

以上就是人工编写的实例,实际工作中,手动编写费时费力,于是自动生成YAML/JSON文件深入人心。你可以利用抓包工具:Charles,Fiddler,postman,用这些软件抓取数据,然后生成har文件,HttpRunner可以把这har文件转换成自己的YAML/JSON,后面会有简单例子。整个过程就像下面这幅图:

现在,你知道了如何产生YAML/JSON文件。HttpRunner可以利用YAML/JSON进行自动化测试,性能测试,持续集成,线上监控等……这么多功能得益于复用原理,你跟着下面的图片进行理解,HttpRunner使用Requests进行自动化测试,他们惊喜的发现LOCUST居然和Requests原理相同。

所谓性能测试,不过是多个设备,多个请求,于是与Requests同步进行性能测试。其次,Jenkins有着独特的优点:持续集成和线上监控,HttpRunner利用Jenkins勾子,自动触发这两个操作。而测试数据生成则依赖于自动化测试代码,编写一段代码,可以将指定输入转化为测试数据。

以上是对HttpRunner功能的简介,很多人有个疑问,HttpRunner不就是个整合工具嘛,他整合了Jenkins、Requests、LOCUST,它没有自己的干货吗?其实,除了整合,HttpRunner还做了一些非常优秀的借鉴,比如说下面几个工具。


5借鉴

整合是HttpRunner理念的一部分:我们不凭空造轮子。整合带来了很多优点,包括无缝切换,零成本学习,工具稳定等等,但只会整合未免有点尴尬。

HttpRunner也有自己的核心功能。比如pytest有一个conftest.py文件,这是一个本地的per-directory插件,在这里你可以定义本目录特定的钩子和配置,它有什么用呢?我们在编写测试用的时候,会遇到登陆问题。这就要求每个用例先登录后操作,conftest.py实现了这个功能,下面是项目结构:

ConftestFile
   |conftest.py
   |test1.py
   |test2.py
   |__init__.py

代码如下:

# conftest.py
import pytest
@pytest.fixture()
def login():  
  print('login in')
# test1.py
def test_01(login):
  print('\n----用例文件1测试用例1开始执行----')
  print('login after : in test1->case test_01')

# test2.py
def test_02(login):
  print('\n---用例文件2测试用例2开始执行---')
  print('login after : in test1->case test_01')

pytest -vs运行后,你会看到它的作用:每个文件下的测试用例都执行了login()方法,于是,我们使用conftest.py方便的解决了登陆问题。

test.py
login in
.
------用例文件1测试用例1开始执行------
login after : in test1->case test_01
                                                      [ 50%]
test2.py
------conftest文件login方法开始执行------
login in
------conftest.py文件login方法执行结束------
.
------用例文件2测试用例2开始执行------
login after : in test1->case test_01
                                                      [100%]

====== 2 passed in 0.04 seconds ======

HttpRunner用同样的原理开发出了debugtalk.py。还不止于此,HttpRunner还吸收了load runner的参数化机制,以及katalon的测试用例分层管理,katalon大家可能用的少,通常用它来做webUI的自动化测试,HttpRunner2.0版本才把它吸收进来,从这里你可以看出,HttpRunner是集百家之能,做到了百花齐放,百家争鸣。

HttpRunner的主要功能大概如此,当这些功能集合在一起,会产生一个体系,整个体系如下图,个人开发只会涉及脚本开发用户,它表示在本地实现本地运行,当我们需要更高要求,比如说上面三个指标,就到了相互协作和分布式这一层,首先利用Gitlab进行推送,然后利用任务调动,把任务分发到几个执行机,最后由多个执行机完成工作。

下面用一个demo快速上手,让大家对HttpRunner有个简单认识。


6快速上手

这里会演示一个简单的项目,带你快速上手HttpRunner,本项目以登陆幕布为目标,你需要利用pip安装下面的开发环境:

pip install httprunner

幕布是一个类似于思维导图的工具,通过编写文字可以自动生成导图。

使用命令生成一个新的项目:

hrun --startproject demo

生成的目录结构很清晰,还包括debugtalk.py,前面提过,它采用yaml或者jason,接下来利用Charles抓取登陆的数据包。

利用Charlse的filter过滤功能可以方便快速的找出想要的内容。

点击登陆后,排除静态资源,只关注动态的既可,切回幕布,点击登陆。

找到需要的数据包,右键将它导出成har格式:

这里注意,一定要选har格式,这是HttpRunner可识别的格式:

随后,我们使用命令将har格式转换为YAML/JSON

har2case login.har
图片

以ymal作演示,使用命令后,会生成下面的yaml文件:

但是很不幸,运行时,发生错误。报错是因为charles正在开启,我们的数据包经过了charles,这里两种解决办法:

第一种,在代码中加入verify:false,让他不检测,另一个方法是关闭charles:

运行成功,下面是运行过程和生成的报告。

7写在最后

本篇文章讨论了HttpRunner的文化,指标,核心技术,它做到了工具集成,也有自己的核心技术,最让我们惊喜的是HttpRunner简单易用。就像requests代码和HttpRunner的YAML文件,你可以无缝切换,它是一款面向 HTTP(S) 协议的通用测试框架,你确实只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。本文章并没有详细讲使用方法,更多的使用方法请关注霍格沃兹测试学院的视频课程。会有更多惊喜等着你~