软件测试在软件研发过程中起到重要组成部分,是贯穿整个软件研发生命周期,与需求、开发、运维等人员起到沟通的桥梁。其目的是尽早的发现软件研发过程中的各种bug,从而降低软件的修复成本和团队间的沟通成本,提升软件产品的质量。随着互联网时代的发展,软件测试从手工测试逐渐演变成单元测试、接口测试、性能测试、自动化等。
单元测试:软件中的最小可测试单元进行检查和验证 。一般来说,单元测试是开发编写代码中的一个功能、一个函数、一个判断等最小可测单元代码。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个方法(函数)的功能操作。
集成测试:在单元测试的基础上,将所有模块按照设计要求组装成为子系统或系统,进行集成测试。 很多公司在集成测试时,单元测试已经完成的。如果不经过单元测试,则集成测试的结果将会受到很大影响,并且也会加大单元代码合并及运行的错误率。
系统测试:将被测的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素及环境结合在一起测试。系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。
自动化经典的测试分层金字塔图(源于Mike Cohn在2009年的著作《Scrum敏捷软件开发》)。如下图所示:
三层金字塔中,最下层是单元测试,单元测试是自动化测试策略稳固的根基,因此也是金字塔结构的最底层;最上层是用户界面,通常用户界面是脆弱的,测试和修改的经济成本和时间成本较高;中间服务层是为了过渡用户界面和程序单元而设计的,认为所有应用程序都由各种服务组成。通过对服务(接口层面)进行测试,而不是对用户界面进行测试,可以极大缩短时间和成本。关于接口自动化方面的处理可通过三种方式来解决:
①通过代码
②借助接口测试工具(Postman/Jmeter/SoapUI等),配合集成工具(Jenkins)实现接口自动化测试持续集成;
③借助开源接口测试( FasterRunner等)平台实现自动化测试。
下面我们通过Python搭建自动化环境来实现接口自动化操作。
本文部分内容引用《接口测试白皮书 》
接口测试也叫API(全称:Application Programming Interface 应用程序编程接口),是测试系统间(系统与系统/前后台)接口的一种测试。接口测试主要检测系统间的数据流向以及响应数据(response body)是否正确。
测试人员通过程序或测试工具,模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理,再把应答报文发送给客户端,客户端(程序或工具)接收应答报文这一个过程。
接口测试一般分为两种:①系统功能间<前后端>的内部接口;②系统与系统之间的外部接口(第三方接口)。
项目的所有接口都需要测试吗?
随着软件产品系统的复杂度越来越高,接口数量越来越多,想完全覆盖所有接口是一件很困难的事情。通常情况下,优先覆盖主流程方面的接口和系统对外的两个方面的接口,系统对外的接口有:系统接收数据方面的接口(获取其它系统接口数据)和系统相关数据被其它系统调用的接口。
接口测试需要测试哪些方面?
需要关注被测接口的功能是否实现、性能是否达标、安全性是否满足,重点关注接口数据的交互(接口间的关联等)。
接口根据协议的不同可分为以下几类:
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。(Web service引用百度百科介绍)
本文已安装python 3.5版本。详情的安装可见参考:Python 安装及环境变量配置(Windows)
在CMD命令行(DOS窗口)输入命令 pip install requests
进行安装。
pip下载的时候慢,在后面加 -i https://mirrors.aliyun.com/pypi/simple/
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
解决方式(一)
解决方式(二)
本文已安装Jenkins,这里就不多做介绍,详情可参考:
持续集成之Jenkins安装使用(Windows)
# 导入requests库
import requests
# 变量url:存放url地址
url = 'http://ip地址:端口/路径'
# 使用requests发送get请求,将得到的响应结果赋予变量res
res = requests.get(url)
# 打印res响应数据: 响应数据的状态码格式
print(res)
# 打印res响应数据的http状态码
print(res.status_code)
# 打印res响应数据的正文--以文本格式打印
print(res.text)
# 打印res响应数据的正文--以json格式打印
print(res.json())
# 获取验证的URL变量
URL = 'http://ip地址:端口/路径'
# post请求的数据格式:以字典格式{"参数":"值"}传输
data = {
"username":"***********","authType":"1"}
# 发送post请求
resp = requests.post(url=URL,data=data)
# 打印响应数据--json格式
print(resp.json())