一、思路
1.读取服务器配置文件信息,获取服务信息及数据库信息
2.初始化数据库信息
3.利用pandas 读取测试用例
4.执行测试用例,写用例比对,实际结果与预期结果比对
5.验库
二、代码分析
apitest.sql 数据库操作SQL文件
apites_liear_v2.py 自动化测试代码
login_case.xlsx 测试用例
server.conf 服务器配置信息
三、apites_liear_v2.py代码
import configparser, pymysql, pandas, requests
#获得接口服务器信息
conf=configparser.ConfigParser()
conf.read('server.conf', encoding='utf-8')
which_server='api_server'
ip=conf.get(which_server, 'ip')
port=conf.get(which_server, 'port')
base_url=f'http://{ip}:{port}'
# print(base_url)
#获得数据库服务器信息
which_db='db_server'
host=conf.get(which_db, 'host')
db=conf.get(which_db, 'db')
user=conf.get(which_db, 'user')
passwd=conf.get(which_db, 'passwd')
dbinfo={'host':host, 'db':db, 'user':user, 'passwd':passwd}
# print(dbinfo)
#初始化数据库
# conn=pymysql.connect(host='', db='', user='', passwd='') #老写法
conn=pymysql.connect(**dbinfo) #**字典表示把字典变成关键字参数形式,也就是变成host='', db='', user='', passwd=''
cursor=conn.cursor()
file=open('apitest.sql', encoding='utf-8')
for sql in file:
if sql.strip() and sql.strip()[:2]!='--':
cursor.execute(sql)
conn.commit()
file.close()
conn.close()
#读取并处理登录用例
data=pandas.read_excel('api_login.xlsx', usecols=['用例编号', '用例标题', '接口路径', '请求方法', '请求类型', '参数', '预期结果'])
case_info=data['用例编号']+'-'+data['用例标题']
url=base_url+data['接口路径']
data.insert(0, '用例信息', case_info)
data.insert(1, '接口地址', url)
data.drop(['用例编号', '用例标题', '接口路径'], axis=1, inplace=True)
data['参数']=data['参数'].apply(eval) #eval不能加引号,不能加括号
data['预期结果']=data['预期结果'].apply(eval)
cases=data.values.tolist()
# print(cases)
#执行登录用例、比对测试结果
for case in cases: #cases是所有的用例,case代表一条用例
case_info, url, method, send_type, args, expect=case
send=f"requests.{method}('{url}', {send_type}={args})"
res=eval(send)
actual=res.json()
if actual==expect:
print(f'{case_info}==响应结果比对通过')
else:
print(f'{case_info}==响应结果比对失败,预期结果:{expect},实际结果:{actual}')
#读取并处理注册接口用例
data=pandas.read_excel('api_signup.xlsx', usecols=['用例编号', '用例标题', '接口路径', '请求方法', '请求类型', '参数', '预期结果', '验库表名', '验库sql', '数据库预期行数'])
case_info=data['用例编号']+'-'+data['用例标题']
url=base_url+data['接口路径']
data.insert(0, '用例信息', case_info)
data.insert(1, '接口地址', url)
data.drop(['用例编号', '用例标题', '接口路径'], axis=1, inplace=True)
data['参数']=data['参数'].apply(eval) #eval不能加引号,不能加括号
data['预期结果']=data['预期结果'].apply(eval)
data['数据库预期行数']=data['数据库预期行数'].apply(eval)
cases=data.values.tolist()
# print(cases)
#执行注册用例、比对测试结果
for case in cases: #cases是所有的用例,case代表一条用例
case_info, url, method, send_type, args, expect, tables, check_sql, db_expect=case
send=f"requests.{method}('{url}', {send_type}={args})"
res=eval(send)
actual=res.json()
if actual==expect:
print(f'{case_info}==响应结果比对通过')
else:
print(f'{case_info}==响应结果比对失败,预期结果:{expect},实际结果:{actual}')
#注册接口验库
conn=pymysql.connect(**dbinfo)
cursor=conn.cursor()
cursor.execute(check_sql)
db_actual=cursor.fetchone()
if db_actual==db_expect:
print(f'{case_info}==验库通过')
else:
print(f'{case_info}==验库失败,检查表{tables}中的数据{args},预期行数:{db_expect},实际行数:{db_actual}')
conn.close()
#优点:按步骤、按顺序,相对简单,数据与代码分离;缺点:初始化数据和验库的时候连接数据库代码重复,读取并处理用例的代码重复,循环执行用例代码重复,不容易实现多人代码分工/合作编程
四、apitest.sql文件代码
--登录接口
--测试成功登录,test01、姓名"成功登录用户"写库
delete from info where id=4
delete from users where id=4
insert into users(id, username, password) values(4, 'test01', md5('123456'))
insert into info(id, name) values(4, '成功登录用户')
--测试密码为空,test02、姓名"登录密码为空用户"写库
delete from info where id=5
delete from users where id=5
insert into users(id, username, password) values(5, 'test02', md5('123456'))
insert into info(id, name) values(5, '登录密码为空用户')
--测试用户名错误,删test03、姓名"登录用户名错误用户"
delete from info where name='登录用户名错误用户'
delete from users where username='test03'
--测试密码错误,test04、姓名"登录密码错误用户"写库
delete from info where id=6
delete from users where id=6
insert into users(id, username, password) values(6, 'test04', md5('123456'))
insert into info(id, name) values(6, '登录密码错误用户')
--测试用户名与密码均错误,删test05、姓名"登录用户名与密码均错误用户"
delete from info where name='登录用户名与密码均错误用户'
delete from users where username='test05'
--注册接口
--测试成功注册,删:test06、姓名"成功注册用户"
delete from info where name='成功注册用户'
delete from users where username='test06'
--测试用户名为空,删姓名"注册用户名为空用户"
delete from info where name='注册用户名为空用户'
--测试密码为空,删test07、姓名"注册密码为空用户"
delete from info where name='注册密码为空用户'
delete from users where username='test07'
--测试确认密码为空,删test08、姓名"注册确认密码为空用户"
delete from info where name='注册确认密码为空用户'
delete from users where username='test08'
--测试姓名为空,删test09
delete from users where username='test09'
--测试两个密码不一致,删test10、姓名"注册两个密码不一致用户"
delete from info where name='注册两个密码不一致用户'
delete from users where username='test10'
--重复注册,写test11、姓名"注册用户名被占用用户"
delete from info where id=7
delete from users where id=7
insert into users(id, username, password, regtime) values(7, 'test11', md5('123456'), '2022/01/01')
insert into info(id, name) values(7, '注册用户名被占用用户')
五、login_case.xlsx用例信息
六、server.con配置信息
#此配置文件用于存储测试时需要使用的所有服务器信息
[api_server] ;api_server叫节点,相当于服务器代号/服务器名字
ip=x.x.x.x
port=80
[db_server]
host=x.x.x.x
db=数据库
user=用户名
passwd=密码