1、需求场景
接口自动化测试中,需要测试A接口,该接口是获取当前图片的相关图片数据,匹配规则是:相关图片至少有4个指定标签组下的标签,需与主图片(当前图片)的标签相同。
手工测试的步骤是:
1、先到数据库resources_attrs表查询主图片关联的标签属性是哪些:结果1
2、请求相关图片接口,获取到该接口返回的相关图片ID
3、拿相关图片ID,去数据库resources_attrs表查询其的标签属性是哪些:结果2
4、比对结果1和结果2,如果有4个或4个以上标签属性相同,则测试通过
问题来了:该接口返回的数据是瀑布流展示,会返回很多数据,如果是手工测试,拿相关图片ID一个一个的去数据库查询再比对,无疑是重复且费时的,而且做接口自动化时,也需要去断言A接口返回相关图片是否符合匹配规则,显然手工验证是不可能实现的
解决方案:通过Python来测试该接口,然后通过pymysql模块来实现连接数据库查询主图片和相关图片的标签属性,再比对结果进行断言
2、需求实现
import pymysql
import unittest
import requests
# 连接数据库
db = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
passwd='123456',
db='dbname')
cur = db.cursor()
# 查询数据库的resources_attrs表中主图片关联的标签属性
# 定义变量:主图片的id,需要匹配的标签组 的 id
rid,gid1,gid2,gid3,gid4 = 43658600,63,134,152,153
cur.execute (
"SELECT tag_id FROM `resources_attrs` WHERE resource_id = {} AND group_id in({},{},{},{})".format(rid,gid1,gid2,gid3,gid4))
zhutu_attrs = cur.fetchall()
zhutu_attrs_list = []
for item in zhutu_attrs:
zhutu_attrs_list.append(item)
print('主图片{}的标签属性是:{}'.format(rid, zhutu_attrs_list))
class WebDataTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('测试初始化')
# 登录获取token
cls.url = 'http://xxxx.com'
from_data = {'username':'134xxxxxxxx','password':'xxxxxx'}
r = requests.post(cls.url+'/api/login',data=from_data)
response = r.json()
token = 'Bearer '+response['data']
'''设置全局变量'''
global headers
headers = {'Authorization': str(token)} # token
@classmethod
def tearDownClass(cls):
cur.close()
db.close()
print('\n测试结束')
print('数据库连接已关闭')
def test_001_assocPictures(self):
'''测试相关图片是否与主图片标签匹配'''
params_data = {'resource_id':rid,'page':1,'limit':100}
r = requests.get(self.url+'/api/picture/assoc-pictures',params=params_data,headers=headers)
response = r.json()
data_list = response['data']['data']
ids = [item.get('id') for item in data_list]
# ids = [43747900]
print('接口返回的相关图片id是{}'.format(ids))
for id in ids:
# 查询数据库的resources_attrs表中相关图片关联的标签属性
cur.execute(
"SELECT tag_id FROM `resources_attrs` WHERE resource_id = {} AND group_id in({},{},{},{})".format(id,gid1,gid2,gid3,gid4))
xiangguan_attrs = cur.fetchall()
xiangguan_attrs_list = []
nFindCount = 0
string = str(zhutu_attrs_list)
for item in xiangguan_attrs:
xiangguan_attrs_list.append(item)
if str(item[0]) in string:
nFindCount = nFindCount+1
print('相关图片{}关联的标签是:{}'.format(id, xiangguan_attrs_list))
# 断言:相关图片的标签与主图片的标签至少有4个或4个以上相同
# self.assertTrue(nFindCount >= 4,msg='相关图片{}的标签与主图片{}的标签不匹配'.format(id,rid))
self.assertGreaterEqual(nFindCount,4,msg='相关图片{}的标签与主图片{}的标签不匹配'.format(id,rid))
if __name__ == '__main__':
unittest.main()