技能树点亮中,和大家分享一下我的学习之路
思路:在本地搭建数据库,利用flask框架模拟API调用,使用request和pytest编写接口自动化脚本,集成到pipeline运行并生成测试报告
1、在本地搭建数据库
此处可以百度到详细的步骤,不再赘述,请移步:
手把手教你MySQL数据库安装-Mac版 - 云+社区 - 腾讯云
PS:安装好数据库服务端后,还需要下载数据库客户端哦,推荐使用mysql或Dbeaver
2、利用flask框架模拟API调用
官网文档:欢迎来到 Flask 的世界 — Flask 中文文档 (2.0.2)
我们在flask框架下,写一些功能简单便于测试的API。
@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
return jsonify({'tasks': tasks})
连接数据库,让我们在本地搭建的数据库发挥作用
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host='localhost',
user='root',
password='********0',
database='********l')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute('SELECT *****')
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
if __name__ == '__main__':
print("Database version : %s" % data)
在进阶一步,写个和数据库交互的API
@app.route('/insert/information', methods=['POST'])
def add_student():
body = request.json
print((body['birthday']))
sql = 'insert into student (name, ID ,class, birthday) values ("%s", "%s", "%s", "%s")' % (body["name"], body["ID"], body["class"], body["birthday"])
print(sql)
DBConnection.cursor.execute(sql)
DBConnection.db.commit()
return jsonify({'save student successfully!': body})
ps:和直接在数据库操作不同,当我们使用代码执行sql语句时,需要commit方法来最终执行sql语句,负责该语句只提交未执行哦
接下来在控制台执行flask run运行该服务,使用postman调用进行测试
成功调通mock API,准备工作结束,可以开始写自动化测试了~
3、 使用request+Pytest编写测试
创建一个自动化测试工程并为其搭一个虚拟环境
虚拟环境的优点:
1. 不同的虚拟环境相互独立,不会影响到其他应用。
2. 防止出现包管理混乱和版本冲突。
3. 不会影响全局的python环境
如何搭建虚拟环境:
python 多环境隔离搭建(mac)_Mars'Ares的博客-CSDN博客_python环境隔离
request使用入门:requests - 廖雪峰的官方网站
搞定这些以后,我们就可以写第一个测试方法了
def test_tasks():
r = requests.get(baseURL + '/todo/api/v1.0/tasks')
assert r.json()['tasks'][0]['done'] == False
然后第二个
def test_inster():
body = {"name": "test", "ID": "101010", "class": "Gradetest", "birthday": "2020-02-10"}
r = requests.post(baseURL + '/insert/information', json=body)
assert str(r).find('successfully')
这两个测试分别对应上边两个API,非常简单就完成了,注意以test开头或结尾哦。
接下来我们会运行测试
pytest是动态编程语言Python专用的测试框架,它具有易于上手、功能强大、可扩展性好、兼容性强、效率高、第三方插件丰富等特点。
功能特征:
- 完整的文档,包括安装,教程和PDF文档
- 简单而又详细的断言模式(使用纯assert语句)
- 自动发现测试模块和功能(以test为标识)
- 可以运行unittest和nose框架的测试用例
- 灵活的固件,用于管理小型或参数化的长期测试资源
- 丰富的插件架构,拥有三百多个外部插件和丰富的社区
编写规则:
- 测试文件以test_开头(以_test结尾也可以)
- 测试类以Test开头,并且不能带有 init 方法
- 测试函数以test_开头
- 断言使用基本的assert即可
执行pytest,会得到一个简易的测试结果
4、集成到pipeline
在本地搭建Jenkins,推荐安装blue ocean,可以傻瓜式操作:
把本地代码推到github, 注意密码验证于2021年8月13日不再支持,也就是不能再用密码方式去提交代码。请用使用 personal access token 替代
搭建好pipeline后,我们新建一条流水线
在配置页面编写脚本,拉取我们的工程,并执行测试
点击立即构建触发流程,就可以看到成功或失败的结果啦,console中可以看到更详细的信息
还可以给我们的运行结果加上测试报告,进一步优化流程,大家可以自行摸索啦