自动化测试入门(pytest+flask+request)

技能树点亮中,和大家分享一下我的学习之路

思路:在本地搭建数据库,利用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,可以傻瓜式操作:

Mac Jenkins搭建 | Vicの博客

把本地代码推到github, 注意密码验证于2021年8月13日不再支持,也就是不能再用密码方式去提交代码。请用使用 personal access token 替代

搭建好pipeline后,我们新建一条流水线

 在配置页面编写脚本,拉取我们的工程,并执行测试

点击立即构建触发流程,就可以看到成功或失败的结果啦,console中可以看到更详细的信息 

 还可以给我们的运行结果加上测试报告,进一步优化流程,大家可以自行摸索啦


版权声明:本文为qq_42536934原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。