接口测试实战训练预热
接下来我们一起开始开发一个接口自动化测试的小框架,我暂且将其命名为Panda,相信你一定能快速掌握并且有所启发
一. 环境和数据的准备:
1. mysql数据库安装(快速查看
)、建表和插入数据
2. mysql-connector-python驱动安装
3. 实战:用python完成一个mysql访问器 (本章仅对"查询"功能进行开发)
4. 实战:用python完成一个很简单的http请求发起器
『mysql-connector-python-8.0.11-py3.6-windows-x86-64bit.msi (2.8MB)』 官网下载链接 |
---|
点我下载 |
『SQLyog_12.5.1+Ultimate (7.91MB)』MySQL可视化工具——小海豚 下载链接 |
---|
点我下载 |
1. 在PyCharm里新建一个Project (或者直接在你的任意目录新建一个Panda文件夹,按以下结构放置文件,再用IDE的"File"-"Open"选中Panda工程包)图中有一些还没讲到但已经开发完成的组件,暂时先不要管,后续博客会逐步贴上,只需要关注本章的2个py文件和环境部署相关的文件即可。
2. 确保你的mysql服务成功启动后,用mysql连接工具登录后 (如果你还没装数据库访问工具,可以下载上面的SQLyog 解压即可使用),复制下面整段的数据库脚本到你的工具里执行,这样就完成了建表和插入数据。
/*
SQLyog Ultimate v12.5.1 (64 bit)
MySQL - 8.0.11 : Database - panda
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`panda` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `panda`;
/*创建测试用例储存表*/
DROP TABLE IF EXISTS `case`;
CREATE TABLE `case` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用例id',
`module_name` varchar(200) NOT NULL COMMENT '功能模块名称',
`request` char(20) NOT NULL COMMENT '请求方法',
`url` varchar(200) NOT NULL COMMENT '请求地址',
`sign` tinyint(1) NOT NULL COMMENT '是否需要KEY验证',
`headers` json DEFAULT NULL COMMENT '接口请求头',
`body` json NOT NULL COMMENT '接口参数',
`run_notes` varchar(500) DEFAULT NULL COMMENT '接口执行备注',
`create_auth` varchar(50) NOT NULL COMMENT '接口创建者',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
INSERT INTO `case`(`module_name`,`request`,`url`,`sign`,`headers`,`body`,`run_notes`,`create_auth`,`create_time`,`update_time`) VALUES
('get登录测试','get','http://127.0.0.1:7777/get_mysql_data_login',0,'{\"Content-Type\": \"application/json\"}','{\"loginId\": \"TerryJay\", \"password\": \"admin123\"}',NULL,'TerryJay',NOW(),NOW());
INSERT INTO `case`(`module_name`,`request`,`url`,`sign`,`headers`,`body`,`run_notes`,`create_auth`,`create_time`,`update_time`) VALUES
('post登录测试','post','http://127.0.0.1:7777/post_mysql_data_login',0,'{\"Content-Type\": \"application/x-www-form-urlencoded\"}','{\"loginId\": \"TerryJay\", \"password\": \"admin123\"}',NULL,'TerryJay',NOW(),NOW());
/*创建用户表`user`,登录接口的用户名和密码都依赖于此表的数据,以此来判断能否登录成功*/
CREATE TABLE `panda`.`account`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '账户id',
`user` VARCHAR(50) NOT NULL COMMENT '账户名',
`password` VARCHAR(50) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) CHARSET=utf8;
INSERT INTO
`account`(`user`,`password`) VALUES
('TerryJay','12345');
INSERT INTO
`account`(`user`,`password`) VALUES
('Peppa','66666');
INSERT INTO
`account`(`user`,`password`) VALUES
('panda','10086');
INSERT INTO
`account`(`user`,`password`) VALUES
('panda','12345');
-----以上脚本执行成功后,可以看到account表的数据是这样子的:
3. mysql访问器的代码实现 [ 运行前请确保mysql服务正常运行且数据已插入成功 ]
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: TerryJay
@license: Apache Licence 2.0
@file: panda_connect_mysql.py
@time: 2018/6/1 22:14
"""
import mysql.connector as my_connector
import sys
class SQL(object):
def __init__(self, **panda_config):
self.cnx = None
self.cursor = None
self.check = None
# self.connect_config = panda_config
if panda_config == {}:
self.panda_config = {
'user': 'root',
'password': 'TerryJay123',
'host': '127.0.0.1',
'port': '3306',
'database': 'panda',
'charset': 'utf8',
'raise_on_warnings': True,
# 'raw': True
}
else:
self.panda_config = panda_config
print(self.panda_config)
# 创建数据库游标,用它来执行增删改查等操作
def create_connect(self):
try:
self.cnx = my_connector.connect(**self.panda_config)
self.cursor = self.cnx.cursor()
except my_connector.Error:
print('\033[1;35;47m', '骚年,你的SQL连接参数错了 ~~(╬▔▽▔) ┴─┴ ︵', '\033[0m')
sys.exit()
else:
return self.cursor
# 查询多个,返回多个 [以二维数组 list类型返回]
def sql_select_all(self, sql_script):
a = self.create_connect()
a.execute(sql_script)
# 使用fetchall()直接获取所有execute结果作为一个list
all_row = a.fetchall()
if all_row:
return all_row
else:
self.check = False
# 关闭游标
a.close()
# 关闭数据库连接
self.cnx.close()
# 查询单个,返回单个 [以数组 tuple类型返回]
def sql_select_one(self, sql_script):
a = self.create_connect()
# print(self.DATA)
a.execute(sql_script)
one_row = a.fetchone()
if one_row:
return one_row
else:
self.check = False
# 关闭游标
a.close()
# 关闭数据库连接
self.cnx.close()
if __name__ == '__main__':
# 可以将数据库连接参数config 以传参的方式放入SQL类,它将以你指定的config来连接MySQL,避免了每次都找SQL类去手动改默认参数panda_config
# 下面是一个自定义的连接参数示例
# config = {
# 'user': 'root',
# 'password': 'TerryJay123',
# 'host': '127.0.0.1',
# 'port': '3306',
# 'database': 'panda',
# 'charset': 'utf8',
# 'raise_on_warnings': True,
# }
#
# sql = " SELECT * FROM `account` WHERE `user`='panda'"
# test = SQL(**config)
""" 组件测试:访问器读取mysql的指定数据是否正常 """
sql = " SELECT * FROM `account` WHERE `user`='panda'"
test = SQL()
# 只返回第一条(就算有多个符合条件的数据,也只返回第一条)
print('单条用户数据查询:', test.sql_select_one(sql))
# 返回全部符合where条件的结果
print('多条用户数据查询:', test.sql_select_all(sql))
执行结果:
单条用户数据查询: (3, 'panda', '10086')
多条用户数据查询: [(3, 'panda', '10086'), (4, 'panda', '12345')]
4. 再创建一个简单的http请求发起组件,仅2个方法
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: TerryJay
@license: Apache Licence 2.0
@file: panda_http_request.py
@time: 2018/6/2 22:22
"""
import requests
# get请求方法
def auto_get(get_url, get_body, get_headers):
panda_get = requests.get(url=get_url, params=get_body, headers=get_headers)
return panda_get.json()
# post请求方法
def auto_post(post_url, post_data, get_headers):
# 将传入的3个参数组装成一个完整的请求
panda_post = requests.post(url=post_url, params=post_data, headers=get_headers)
return panda_post.json()
"""
本组件留作下一章教程里的【run组件】调用,敬请期待~
"""
传送门:渐入佳境——python接口自动化测试之登录接口的测试实战(4)
版权归作者@TerryJay所有,转载请注明出处