引言
为什么要做接口自动化测试?
在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归。
但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。
为什么要自己写框架呢?
使用 requets + unittest 很容易实现接口自动化测试,而且 requests 的api已经非常人性化,非常简单。
但通过封装以后(特别是针对公司内特定接口),再加上对一些常用工具的封装,可以进一步提高业务脚本编写效率。
目录
- 接口与接口测试
接口测试认知、
python接口开发、
postman接口测试、
接口测试实战
- 接口自动化测试技术篇
接口自动化测试用例设计、
Excel接口测试用例访问、
MySQL数据库接口测试用例访问
-
接口自动化测试实战篇
PyTest测试框架、
接口自动化测试必备技能-HTTP协议、
Requests库实现接口请求的代码实现、
电商平台慕慕生鲜全套接口自动化测试实现 -
本阶段达到的目的
- 能够独立进行接口自动化测试的代码开发
- 掌握Requests库,能够使用Requests库进行接口自动化测试
- 掌握Postman工具,并能够使用Postman完成接口测试
- 能够掌握PyTest测试框架,并能够结合Allure框架自动生成测试报告
- 掌握PyMySQL,能够使用PyMySQL进行数据库的操作
- 掌握HTTP协议,能够理解请求头与响应投中信息的含义
环境准备
确保本机已安装 python2.7 以上版本,然后安装如下库:
pip install flask
pip install requests
后面我们会使用 flask 写一个用来测试的接口,使用requests去测试。
第一章. 接口测试的认知
1. 为什么要进行接口测试
- 常见软件的分类
- 软件的架构演变
2. 什么是接口
- 常见硬件接口
通过某种约定对其他设备进行接入以实现设备与设备之间的交互 - 常见软件接口
- 系统中的软件接口
- 系统中软件接口的常见约定
3. 接口测试与功能测试的区别
- 功能测试的测试方法
- 围绕着页面上的功能点进行测试用例设计与执行
- 从页面的反馈层面验证,侧重验证功能逻辑实现的准确性
- 接口测试的测试方法
- 根据接口协议,并结合接口参数进行测试用例设计与执行
- 从接口返回的数据验证,侧重验证返回数据的准确性
- HTTP协议的接口请求方法
- get请求
- post请求
- 什么是get请求
- 通过url来向接口传递数据的请求方式
- 比较适合传递数据量小,并且保密性低的数据
- 什么是post请求
- 通过请求体的方式向接口传递数据的请求方式
- 比较适合传递数据量偏大或数据保密性高的数据
- 从测试流程上看介入时机不同
立项→文档→代码编写→单元测试→接口及自动化→功能测试→集成测试→集成接口及接口自动化→集成功能测试→上线部署→线上回归
第二章. python接口开发
1. python接口开发框架Flask简介与安装
- Flask接口测试框架的简介与安装
- Flask是轻量级的web开发框架
- 相比于其他框架,Flask更自由,灵活
- 相比于其他框架,Flask更容易上手
Flask安装网址:https://flask.net.cn/
- 安装Flask:pip install Flask
2. 使用Flask开发一个Get接口
- 开发get接口
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "hello world qqqqqq"
if __name__ == "__main__":
app.run()
- 输入以上代码得出以此后的链接:http://127.0.0.1:5000
- 如果想连续网址后面的参数,那就在写代码时添加/hello后,再打开原有的网址后添加/hello,再重启
- 如果只是在网址后随意输入任意参数结果是无法接收到的
- 以下解决方法:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "hello world qqqqqq"
@app.route("/hello")
def hello_world2():
return "hello22222"
@app.route("/hello/<username>")
def hello_world3(username):
print(username)
return "hello22222" + username
if __name__ == "__main__":
app.run()
-
并在python里打印出了aaa
-
路径不能一样,否则打印结果一样
-
以下代码修改路径之后再重启
from flask import Flask,request
app = Flask(__name__)
@app.route("/")
def hello_world():
return "hello world qqqqqq"
@app.route("/hello")
def hello_world2():
return "hello22222"
@app.route("/hello/<username>")
def hello_world3(username):
print(username)
return "hello22222" + username
@app.route("/hello/args/<username>")
def hello_world4(username):
print(username)
key = request.args.get("key")
print(key)
return "hello22222" + username + "::::" + key
if __name__ == "__main__":
app.run()
- 并在python里打印出了aaa和qqqqqq
- 如果想在网址后方添加value以下代码
from flask import Flask,request
app = Flask(__name__)
@app.route("/")
def hello_world():
return "hello world qqqqqq"
@app.route("/hello")
def hello_world2():
return "hello22222"
@app.route("/hello/<username>")
def hello_world3(username):
print(username)
return "hello22222" + username
@app.route("/hello/args/<username>")
def hello_world4(username):
print(username)
key = request.args.get("key")
value = request.args.get("value")
print(key)
return "hello22222" + username + "::::" + key + "::::" + value
if __name__ == "__main__":
app.run()
- 重启之后打开http://127.0.0.1:5000/hello/args/aaa?key=qqqqqq&value=vvvvv
- 并在python里打印出了aaa和qqqqqq和vvvvv
3. 使用Flask开发一个Post接口
- 端口号可以在这里修改
- 开发post接口
from flask import Flask,request
app = Flask(__name__)
@app.route("/mypost",methods=["post"])
def my_post():
return "post request"
if __name__ == "__main__":
app.run(port=5555)
- 如果直接打开这个链接是无法访问的http://127.0.0.1:5555/mypost
- 修改后的代码:
from flask import Flask,request
app = Flask(__name__)
@app.route("/mypost",methods=["post"])
def my_post():
return "post request"
@app.route("/mypost1",methods=["post"])
def my_post1():
# 表单数据类型
username =request.form["username"]
sex = request.form["sex"]
print(username)
print(sex)
return "post request" + username + "::" + sex
@app.route("/mypost1",methods=["post"])
def my_post2():
# json数据类型
request_data =request.get_json()
sex = request.form["sex"]
print(request_data)
print(request_data["user"])
return "post request" + str(request_data)
if __name__ == "__main__":
app.run(port=5555)
4. Flask结合PyMySQL接口与数据库的交互
https://pymysql.readthedocs.io/en/latest/user/installation.html
-
这时我们需要打开python下方Terminal
-
输入exit()回车后弹出输入页面
-
输入:pip install PyMySQL
-
mysql的基本连接信息
import pymysql
from flask import Flask
# 这里是mysql的基本连接信息
conn = pymysql.connect(
host="192.168.1.116",
user="root",
password="123",
database="nydb1",
charset="utf8"
)
cursor = conn.cursor()
app = Flask(__name__)
@app.route("/")
def hello_world():
sel = "select * from school"
result = cursor.execute(sql)
# 得到查询后的真正的结果
r = cursor.fetchall()
print(r)
return str(r)
if __name__ == "__main__":
app.run()
- 刷新http://127.0.0.1:5000 后查询到的四条信息v:
第三章. postman接口测试
1. postman介绍与安装
2. postman发送get请求
import pymysql
from flask import Flask,request
# 这里是mysql的基本连接信息
conn = pymysql.connect(
host="192.168.1.116",
user="root",
password="123",
database="nydb1",
charset="utf8"
)
cursor = conn.cursor()
app = Flask(__name__)
@app.route("/")
def hello_world():
sel = "select * from school"
result = cursor.execute(sql)
# 得到查询后的真正的结果
r = cursor.fetchall()
print(r)
return str(r)
@app.route("/mypost",methods=["post"])
def my_post():
return "post request"
@app.route("/mypost1",methods=["post"])
def my_post1():
# 表单数据类型
username =request.form["username"]
sex = request.form["sex"]
print(username)
print(sex)
return "post request" + username + "::" + sex
@app.route("/mypost1",methods=["post"])
def my_post2():
# json数据类型
request_data =request.get_json()
sex = request.form["sex"]
print(request_data)
print(request_data["user"])
return "post request" + str(request_data)
@app.route("/mypost",methods=["post"])
def my_post():
return "post request"
@app.route("/mypost1",methods=["post"])
def my_post1():
# 表单数据类型
username =request.form["username"]
sex = request.form["sex"]
print(username)
print(sex)
return "post request" + username + "::" + sex
@app.route("/mypost1",methods=["post"])
def my_post2():
# json数据类型
request_data =request.get_json()
sex = request.form["sex"]
print(request_data)
print(request_data["user"])
return "post request" + str(request_data)
if __name__ == "__main__":
app.run()
- 执行代码后打开链接:http://127.0.0.1:5000
- 将127.0.0.1:5000输入到postman里面执行:
- 另外在代码里看到/hello,也可以输入执行查看结果:
3. postman发送post请求
import pymysql
from flask import Flask,request
# 这里是mysql的基本连接信息
conn = pymysql.connect(
host="192.168.1.116",
user="root",
password="123",
database="nydb1",
charset="utf8"
)
cursor = conn.cursor()
app = Flask(__name__)
@app.route("/")
def hello_world():
sel = "select * from school"
result = cursor.execute(sql)
# 得到查询后的真正的结果
r = cursor.fetchall()
print(r)
return str(r)
@app.route("/mypost",methods=["post"])
def my_post():
return "post request"
@app.route("/mypost1",methods=["post"])
def my_post1():
# 表单数据类型
username =request.form["username"]
sex = request.form["sex"]
print(username)
print(sex)
return "post request" + username + "::" + sex
@app.route("/mypost1",methods=["post"])
def my_post2():
# json数据类型
request_data =request.get_json()
sex = request.form["sex"]
print(request_data)
print(request_data["user"])
return "post request" + str(request_data)
@app.route("/mypost",methods=["post"])
def my_post():
return "post request"
@app.route("/mypost1",methods=["post"])
def my_post1():
# 表单数据类型
username =request.form["username"]
sex = request.form["sex"]
print(username)
print(sex)
return "post request" + username + "::" + sex
@app.route("/mypost2",methods=["post"])
def my_post2():
# json数据类型
request_data =request.get_json()
sex = request.form["sex"]
print(request_data)
print(request_data["user"])
return "post request" + str(request_data)
if __name__ == "__main__":
app.run()
- 并在python里打印出
第四章. 接口测试实战——电商网站接口测试
1. 接口测试需求分析
- 常见接口文档提供的两种方式
①word文档
②在线文档
- 电商网站网址模拟练习:http://111.231.103.117:8083/swagger-ui.html
2. 登陆的分析
- 慕慕生鲜网址:http://111.231.103.117/#/login
- 账号密码
- 点击execute后
- 输入账号密码后点击开发者工具,再登录,点击网络(网络请求)
- 创建新的集合后添加新的请求:http://111.231.103.117:8083/loginWithJwt
- 将路径添加到以上网址后:
- 在开发工具里面找到:?userName=imooc&password=12345678 粘贴到网址后方可补充以下
- 随后点击发送:
- 添加新请求后:
- 之后点击发送,就可以看到网址内的信息
3. 环境区分及变量设置
-
创建dev与test环境保存后,将链接改为{{ip}}
-
直到通过
-
然后发送,就可以查看内容
-
postman设置环境变量
Postman 允许用户自己定义环境变量-Environment。在Environment中设置URL域名变量。最常见的是将URL定义成变量的形式,这样随着你的域名无论怎么变,只需要在环境变量中更改URL就可以了,也可以将一些敏感的测试值定义为环境变量,比如密码。对于 Postman 来说,全局变量(Globals)仅有一组,而环境变量(Environment)可以有多组。 (备注:接下来的操作最后都保存后在进行下一步。)
①:在postman中点击右侧的“小眼睛”图标。弹出环境变量和全局变量设置窗口。 ②:设置环境变量,点击:Add,进入环境变量设置页面, ③:在里面填写变量名和初始值。 修改前: 修改后: ④:用设置的变量去取代URL中填写的域名信息,要以 “{{变量名}}” 的方式来引用。
- postman设置全局变量
①:设置环境变量,点击:Add,进入环境变量便捷页面, 修改前: 修改后:
- postman引用CSV文件进行Run collection
①:先在接口里面设置检查点: (一定要设置检查点,不设置检查点的话,Run collection时会报:# This request does not have any tests) ②:鼠标右键选择:Run collection
③:电脑桌面新建一个txt参数化文本,文本里面设置phone参数化。code不需要设置,因为code在Globals里面已经配置写死了。只需要配置phone的参数就可以了。
④:选择参数化csv/txt文件 ⑤:点击Run collection就可以看到运行的结果了。
总结
在本文中,我们以提高脚本开发效率为前提,一步一步打造了一个简易的测试框架。
但因水平所限,并未涉及测试数据初始化清理、测试中如何 MOCK 等话题,前路依然任重而道远,希望给大家一个启发,不足之处还望多多指点,非常感谢。
标签:__,username,思考,app,request,接口,测试,post From: https://www.cnblogs.com/kasia/p/17103134.html