接口学习笔记

接口学习笔记

接口测试用例.xlsx
11.3 KB

接口是某个对象和外界交互的部分,包括命令行接口、用户界面的接口,比如一个输入框,还有一种就是消息交互接口、和其他应用程序之间进行的消息交互接口 软件和外界系统进行交互的接口:
1.
diameter,radius - socket tcp
基于SOAP的web service -http
REST API -HTTP

编程接口,各种语言的开发包

其它接口:
数据服务产品:sql语言操作接口
对账系统:FTP文件接口

对上述接口的测试都可以称之为接口测试

UI测试是测试UI接口
互联网产品对外提供的服务接口,我们通常称之为
web服务接口
web service接口
web API

常基于http协议传输的
webservice接口
webAPI 应用编程接口

经常说的‘接口测试’、‘API测试’,就是对Web服务接口的测试,包括APP服务端接口

主要包括两种类型,基于SOAP的web service接口和REST 接口
狭义的接口测试就是指的web服务接口或者是webAPI接口的测试

REST 接口
具体的约束 ?
API测试的特点:
使用软件
使用编程语言进行开发

webAPI测试和webUI测试的区别是?

构建http请求消息、发送给客户端、然后返回响应,根据响应进行判断

什么时候需要做webAPI的测试?

如果接口是内部接口,不暴露给外部,通常我们QA是不直接去测试它的
如果接口是供外部使用,是需要做的。如果要做内部接口的测试,那么实际上是做一些灰盒测试。

Web接口测试方法
使用第三方工具
有很多支持web服务接口(主要是REST接口)测试的工具:postman、SoapUI、RestClient…

核心功能:
构建HTTP请求消息
解析收到的HTTP响应消息
一般学会了一种,其它的核心功能基本类似

自己开发工具;
利用编程语言(比如python语言)和一些库
构造HTTP请求消息,并且解析收到的HTTP响应消息,检查结果
这种方式更加适用于完全的自动化,并且和自动化框架结合起来使用

HTTP协议
99%的接口就是基于HTTP协议的,是整个WEB API的基础
目前使用最广泛的版本是HTTP/1.1版本

HTTP和HTML
HTML是一种来定义网页的文本语言
HTTP是在网络上传输信息(当然也包括HTML)的协议

http协议包含请求和响应两部分
请求是客户端发送给服务器的消息
响应是服务器返回给客户端的消息

GET/index.html HTTP/1.1 请求行

GET代表请求方法,表示从服务端获取资源,index.html代表url地址,HTTP/1.1代表HTTP协议版本

Host:www.example.com 请求头 可以有多个
代表服务器地址

通常get请求是没有消息体的,post、put是有的,delete有时候也是有的,如有消息体的话,通常是有一个空行将请求头和消息体隔开的,只要是空行隔开的都是消息体

HTTP请求方法,常用的包含如下:

GET(对应R,read) 请求获取Request-URL所标识的资源,查询一般是get

POST (对应C, create) 在Request-URL所标识的资源后附加新的数据,新增一般是post

HEAD 用的不是很多

PUT(对应U,update) 主要是更新资源
DELETE (对应D,delete) 主要是删除资源

postman号称是最广泛的REST API测试工具,不仅仅是测试工具,API开发支持:

构建API
Mock Server
开发文档自动生成

两种形式的安装方式:
本地应用程序
chrome浏览器的插件

Postman可以帮助我们快速地构建HTTP请求,我们可以参与构造的部分主要就是:
Method(请求方法) #put、delete等等
URL:
URL参数query string
encodeURLComponent
Headers(请求头)
Content-Type #表明请求的消息体格式
消息体格式
application/x-www-form-urlencoded #格式是键值对, 与上面的URL参数query string一样,只不过放在消息体里面,put、post、delete通常是有消息体的,而get通常是没有的
application/json (序列化)
application/xml
multipart/form-data
其他

post请求的参数一般放在消息体内,而不是URL里,因为post请求的可能有些很大的数据,URL的长度是有限制的
URL参数次序没有先后顺序

接口测试的流程
大体流程
阅读API接口文档
编写测试用例
根据测试用例进行API的手工测试
现状
给的文档比较不规范
没有文档
测试人员自己形成一份文档
第5、6节课接口测试用例设计
接口测试步骤
构建请求
流程:
阅读API接口文档
编写测试用例
根据用例进行API的手工测试
开发API工具,使之能测试产品

如何编写覆盖率比较高的测试用例?
单个用例格式怎么写
前置条件
输入操作
预期输出

请求头和url一般不设计用例
一般通过查询的API接口验证增加和修改、删除的内容是不是正确的

可以使用postman产生API文档
第7节、8节postman变量的使用
经常变动的地方如host,可以使用ppostman中的变量
环境里面的变量
全局变量
使用postman进行抓包

cookie的概念:是我们在访问一个网站时,通常由网站服务器返回的一种标记为cookie类型数据,通常网站服务器返回Http响应,在里面会包含网站的要求,要求浏览器存储在客户端电脑上的一些数据,以后每次在访问同一个网站中,域名是一样的,浏览器都会将这些数据带出来。这个特性明显地用在登录上,服务端在验证用户名密码正确的情况后,创建一个session id,该id是一串数字,在数据库里是一张表,一个session id可能包含用户名、密码、用户等级等,比如session id1 session id2, 放在head里面给某个字段比如set-cookie,后续再访问该网站时,浏览器会在请求头里会将cookie带上,cookie可以保存任何数据,session是cookie要保存的数据的一种,cookie是存放数据的机制,session id是用来校验用户身份的

session 的概念:相当于给会话的一个ID,唯一标记该会话。
比如一个人用身份证号码唯一标识这个人的身份。

token 的概念:包含数据信息(data)和验证信息(HMAC)
hash算法产生token
密钥 +data = HMAC,密钥并不发送给客户端
假如data修改了以后,会产生新的验证信息,客户端再次发送token给服务器时,服务器会校验这个token是否和原来token信息是否一致。如果一致认为是合法用户

token不用保存数据库,不用到服务器读取数据

token也是一串字符,它开始和session一样,客户端(浏览器)发送一个请求给服务端,传了用户名密码在里面,服务端进行校验后返回一个token信息,里面包含数据信息和验证信息,该用户后续的请求里也会将token带上,不同于session肯定会在head里带上,token看设计怎么设计在哪里携带的,可以在消息体Head或者其他,后续请求发送给服务器后,服务器就需要验证这个token。

第9节、10节postman自动化技巧与python实现接口测试
postman适合做自动化测试吗

主要适合:
手工测试
半自动化测试

postman加入自动化代码
使用JS语言
在发送之前,设置发送消息的代码
pm.setEnvironmentvariable(varname,varvalue)
例如:
postman.setEnvironmentVariable(‘curTime’,new Date()); #插入当前日期与时间

python语言实现接口测试
主要是构造出相应的http请求
内置库httplib 、urllib2
第三方库urllib3、request、pyCurl

类型是"Content-Type":"application/x-www-form-urlencoded"的连接使用data

例:
import requests,pprint
headers = {
“Content-Type”:“application/x-www-form-urlencoded”
}
payload = {“action”:“add_course”,
“data”:’’’{
“name”:“初中化学”,
“desc”:“初中化学课程”,
“display_idx”:“4”
}’’’
}

r = requests.post(‘http://localhost/api/mgr/sq_mgr/’,headers=headers,data=payload)
pprint.pprint(r.json())

类型是"Content-Type":“application/json” 的连接使用json
例:
headers = {“Content-Type”:“application/json”}

json = {
“action”: “add_course_json”,
“data”:{
“name”:“初中化学”,
“desc”:“初中化学课程”,
“display_idx”:“4”
}
}

r = requests.post(‘http://localhost/apijson/mgr/sq_mgr/’,headers = headers,json = json)
pprint.pprint(r.json())

r.text 返回的是一个字典形式的字符串

类型是xml格式的,参数还是用data:
import requests,pprint

head = {“Content-Type”:“application/xml”}

body = ‘’’
George
John
Reminder

Don't forget the meeting! '''

r = requests.post(“http://localhost/api/mgr/sq_mgr/”,
headers=head,
data=body)
pprint.pprint(r.json())

assert a==b,‘测试不通过’
如果成立就通过,不成立就抛出后面指定的异常内容

第94、95节课.API接口的自动化测试2和参数带上sessionid
import requests,pprint
from datetime import datetime

def log_in(username,password):
head = {‘Content-Type’:‘application/x-www-form-urlencoded’}
body = {‘username’:username,‘password’:password}
p = requests.post(‘http://localhost/api/mgr/loginReq’,data=body)
result = p.json()
pprint.pprint(result)
return result,p.cookies[‘sessionid’]

def add_courses(name,desc,display_idx,sessionid):
head = {‘Content-Type’:‘application/x-www-form-urlencoded’}
body = {‘action’:‘add_course’,
‘data’:’’’{
“name”:"%s",
“desc”:"%s",
“display_idx”:"%s"
}’’’% (name,desc,display_idx)}

p = requests.post('http://localhost/api/mgr/sq_mgr/',data=body,cookies={'sessionid':sessionid})
addcourse = p.json()
pprint.pprint(addcourse)
return addcourse

login,sessionid = log_in(‘auto’,‘sdfsdfsdf’)
print(sessionid)
assert login[‘retcode’] == 0
add = add_courses(‘python’,‘python描述’,‘1’,sessionid)
print(add)
第96、97节课.python操作数据库
python操作数据库的测试需要点:
用例检查点
用例数据准备

安装虚拟机,虚拟机中安装Linux
请大家自行百度搜索,安装虚拟机管理器 virtualbox 或者 vmvareplayer, 创建 64位 虚拟机, 安装centos镜像

cetos6.5 下载地址 : http://archive.kernel.org/centos-vault/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso

安装好以后,以root用户登录

安装 Mysql 服务
1 执行下面命令安装mysql 5.6 基于 centos 6.5 的yum源

wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
rpm -ivh mysql-community-release-el6-5.noarch.rpm
2 执行下面命令安装 mysql server 和 mysql devel

yum install mysql-server
yum install mysql-devel
启动mysql
执行命令 service mysqld start

创建 数据库用户 账号
执行命令 mysql 启动 mysql 命令行客户端,在交互式命令行输入

CREATE USER ‘songqin’@‘localhost’ IDENTIFIED BY ‘songqin’;
CREATE USER ‘songqin’@’%’ IDENTIFIED BY ‘songqin’;
然后 给 数据库用户 账号 songqin 赋予超级权限

GRANT ALL ON . TO ‘songqin’@‘localhost’;
GRANT ALL ON . TO ‘songqin’@’%’;
执行quit 退出 mysql client

创建数据库
下载数据库文件

wget --no-check-certificate https://github.com/jcyrss/songqin-testdev/raw/master/webapi/doc/plesson.sql

执行如下命令,将plesson.sql文件 导入数据库中

mysql -usongqin -psongqin < plesson.sql

执行如下命令,让mysqld服务开机启动

chkconfig --level 2345 mysqld on

修改教管系统配置文件
将教管系统 访问数据库从本地的sqlite改为使用远程mysql 服务

修改配置文件 restapi-teach\backend\project\settings.py

注意,下面的ip地址一定要写对

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘plesson’,
‘USER’: ‘songqin’,
‘PASSWORD’: ‘songqin’,
‘HOST’: ‘你机器的ip地址’,
‘PORT’: ‘3306’,
‘CONN_MAX_AGE’: 0,
‘OPTIONS’: {
“init_command”: “SET storage_engine=INNODB”,
}
}
}
重新启动

打开防火墙端口
iptables -I INPUT -p TCP --dport 3306 -j ACCEPT;/sbin/service iptables save

Heidisql工具连接访问数据库
打开 https://www.heidisql.com/

下载安装portableversion

安装 mysqlclient 客户端库
在自己的客户端机器上,通常也就是教管系统所在机器上,运行如下命令, mysqlclient 客户端库

pip install mysqlclient==1.3.12

python操作Mysql
pip install mysqlclient库
import MySQLdb

import MySQLdb
获取数据记录:
fetchone fetchmany fetchall
conection = MySQLdb.connect(host=‘192.168.142.128’,user=‘songqin’,password=‘songqin’,db=‘plesson’,charset=‘utf8’)

c = conection.cursor() #游标通常是指向第一行,游标是不断的移动的
fetchone : 获取一行数据 返回的是一个个的元祖
fetchmany(): 获取多行 返回的是一个大元祖,元祖里面还有元祖
fetchall():获取全部数据

通过fetchone 获取查询结果
c.execute(‘select * from sq_course’)
numrows = c.rowcount
print(numrows)
for x in range(numrows):
row = c.fetchone()
print(row)
打印结果:
3
(125, ‘初中语文’, ‘初中语文描述’, 12)
(126, ‘初中数学’, ‘初中数学描述’, 1)
(127, ‘ew’, ‘ew’, 1)

打印结果是元祖,如果只需要获取其中课程名称,可以通过元祖的索引方式获取row = c.fetchone()[1]

通过fetchmany获取所需要的行数
connection = MySQLdb.connect(host=‘192.168.142.128’,user=‘songqin’,password=‘songqin’,db=‘plesson’,charset=‘utf8’)
c = connection.cursor()
c.execute(‘select * from sq_course’)
row = c.fetchmany(3)
print(row)

打印结果:
((125, ‘初中语文’, ‘初中语文描述’, 12), (126, ‘初中数学’, ‘初中数学描述’, 1), (127, ‘ew’, ‘ew’, 1))
返回的是一个大元祖,元祖里面有元祖

通过fetchall获取所有数据
connection = MySQLdb.connect(host=‘192.168.142.128’,user=‘songqin’,password=‘songqin’,db=‘plesson’,charset=‘utf8’)
c = connection.cursor()
c.execute(‘select * from sq_course’)
row = c.fetchall()
print(row)
返回的是一个大元祖,元祖里面有元祖

关于游标的指向问题,可见如下:
b = c.fetchmany(2)
print(b)

a = c.fetchone()
print(a)

d = c.fetchmany()
print(d)

打印结果:
((125, ‘初中语文’, ‘初中语文描述’, 12), (126, ‘初中数学’, ‘初中数学描述’, 1))
(127, ‘ew’, ‘ew’, 1)
()

c.execute(“INSERT INTO sq_course (name,desc,display_idx) VALUE (‘语文’,‘语文描述’,10)”)
conection.commit()

插入数据时,注意desc要加引号,因为刚好是sql里面的一个关键字
api作业7
import time
import requests,pprint,MySQLdb
from datetime import datetime

def log_in(username,password):
head = {‘Content-Type’:‘application/x-www-form-urlencoded’}
body = {‘username’:username,‘password’:password}
p = requests.post(‘http://localhost/api/mgr/loginReq’,headers=head,data=body)
result = p.json()
pprint.pprint(result)
return result,p.cookies[‘sessionid’]

def list_teacher(sessionid):
g = requests.get(‘http://localhost/api/mgr/sq_mgr/?action=list_teacher&pagenum=1&pagesize=20’,cookies={'sessionid’:sessionid})
lte = g.json()
#pprint.pprint(lte)
return lte

def add_teacher(username,password,realname,desc,display_idx,sessionid):
body = {‘action’:‘add_teacher’,
‘data’:’’’{
“username”:"%s",
“password”:"%s",
“realname”:"%s",
“desc”:"%s",
“courses”:[{“id”:12}],
“display_idx”:%s
}’’’ % (username,password,realname,desc,display_idx)}
p = requests.post(‘http://localhost/api/mgr/sq_mgr/’,data=body,cookies={'sessionid’:sessionid})
result = p.json()
#pprint.pprint(result)
return result

login,sessionid = log_in(‘auto’,‘sdfsdfsdf’)
print(sessionid)
assert login[‘retcode’] == 0

teacherlist1 = list_teacher(sessionid)[“retlist”]

loginname = f’user-{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}’
rn = ‘老师’ + time.ctime()
adt = add_teacher(loginname,‘123456’,rn,‘ghah’,1,sessionid)
assert adt[ “retcode”]==0

teacherlist2 = list_teacher(sessionid)[“retlist”]
#pprint.pprint(teacherlists)

newteacher = [item for item in teacherlist2 if item not in teacherlist1]
assert len(newteacher)==1
newteacher = newteacher[0]
un = newteacher[‘realname’]
print(un)

connection = MySQLdb.connect(host=‘192.168.142.128’,user=‘songqin’,password=‘songqin’,db=‘plesson’,charset=‘utf8’)
c = connection.cursor()

c.execute(‘select * from sq_teacher’)

rows = c.fetchall()

for one in rows:
if one[1] == un:
print(newteacher)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值