场景:需要做个初步的接口自动化测试,所以需要对每个接口进行命名的url拼接
接口命名需要有中文注释了url
这个中文注释呢,在Xcode的pch里,且格式不太一样,看了下weex的url的文件,注释还比较统一
/**
* 这里是这个接口的中文描述
*/
exports.someString = "someString"
目标是生成这样的格式的
{"这里是这个接口的中文描述 someString" : "someString" }
初步写了个简单的脚本getApisFromWeexJSFile.py
,目前可以 实现,有问题再逐步完善
# coding=utf-8
import json
import sys
import linecache
import json
import re
reload(sys)
# sys.setdefaultencoding('utf8')
urlStringJsFilePath = '/Users/mac/Desktop/companyProj/weex-qylc/src/include/urlconstant.js'
urls = []
file_object = open(urlStringJsFilePath, 'rU')
try:
for lineIdx,line in enumerate(file_object):
#判断是否是空行或注释行
if not len(line) or line.startswith('#') or line.startswith('/*') or line.startswith(' *') or line.startswith('>>>'):
continue
elif line.startswith('exports.'):
# 去除/t空格之类的
rightLine = "".join(line.split())
lineStrings = rightLine.split('=');
if len(lineStrings) > 1:
sub1Str = lineStrings[1]
sub2Str = sub1Str.replace("\"", "")
sub3Str = sub2Str.replace('\";', "")
sub4Str = sub3Str.replace('\'', "")
sub5Str = sub4Str.replace(';', "")
urlString = sub5Str.replace('\';', "")
findIdx1 = lineIdx -1
findStr2 = linecache.getline(urlStringJsFilePath,findIdx1)
urlKeyString = "".join(findStr2.split())
urlKey = urlKeyString.replace('*','')+ ' ' + urlString
urls.append({urlKey : urlString})
print json.dumps(urls, ensure_ascii=False, encoding='UTF-8')
finally:
file_object.close()
针对Xcode里的pch文件又写了个getApisFromXcodePchFile
# coding=utf-8
import json
import sys
import linecache
import json
import re
reload(sys)
# sys.setdefaultencoding('utf8')
urlStringJsFilePath = '你们项目的pch位置'
urls = []
file_object = open(urlStringJsFilePath, 'rU')
try:
for lineIdx,line in enumerate(file_object):
isNotBaseURLStringLine = \
line.count('requestIP') > 0 or \
line.count('H5BaseIP') > 0 or \
line.count('swiftidIP') > 0 or \
line.count('URL_TRACE_MONITOR') > 0 or \
line.count('codeNum') > 0 or \
line.count('WeexBase') > 0 or \
line.count('dynamicMaint') > 0 or \
line.count('gatewayRequestUrl') > 0 or \
line.count('dcRequestUrl') > 0 or \
line.count('baseMessage_MONITOR')>0 or\
line.count('CFBundleDisplayName') > 0 or\
line.count('CFBundleShortVersionString') > 0 or\
line.count('CFBundleVersion') > 0 or\
line.count('CFBundleDisplayName') > 0 or\
line.count('WJExceptionHandler_crash') > 0 or\
line.count('__FUNCTION__') > 0 or\
line.count('__FILE__') > 0 or \
line.count('#pragma mark') > 0 or \
line.count('/') <= 0
#判断是否是空行或注释行
if not len(line) or line.startswith('/*') or line.startswith(' *') or line.startswith('>>>'):
continue
elif (line.startswith('#define ') or line.startswith('static')) and not isNotBaseURLStringLine :
# 去除/t空格之类的
rightLine = "".join(line.split())
lineStrings = rightLine.split('@');
if len(lineStrings) > 1:
sub1Str = lineStrings[1]
sub2Str = sub1Str.replace("\"", "")
sub3Str = sub2Str.replace('\";', "")
sub4Str = sub3Str.replace('\'', "")
sub5Str = sub4Str.replace(';', "")
urlString = sub5Str.replace('\';', "")
findIdx1 = lineIdx -1
findStr2 = linecache.getline(urlStringJsFilePath,lineIdx)
if findStr2.strip()=="" or findStr2.count('#define') >0:
firstStr = rightLine.split('@')[0];
findStr2 = firstStr.replace('#define', '')
urlKeyString = "".join(findStr2.split())
urlKeyString2 = urlKeyString.replace('/**','')
urlKeyString21 = urlKeyString2.replace('/*','')
urlKeyString212 = urlKeyString21.replace('-','')
urlKeyString3 = urlKeyString212.replace('*/','')
urlKey = urlKeyString3+ ' ' + urlString
urls.append({urlKey : urlString})
print json.dumps(urls, ensure_ascii=False, encoding='UTF-8')
finally:
file_object.close()
将上述两个文件生成的json放在一起,然后拼接最基本的postman的200断言
apiToPostman.py
# coding=utf-8
import json
import sys
reload(sys)
sys.setdefaultencoding('utf8')
apiDicts = \
[上面两个脚本生成的字典合集]
outputFilePath = "/Users/mac/Desktop/allTest.postman_collection.json"
itemDicts = []
for apiDict in apiDicts:
firstKey = apiDict.keys()[0]
urlString = apiDict[firstKey]
rawString = "{{base}}" + urlString
paths = urlString.split('/')
itemDict = { "name": firstKey,
"event": [
{"listen": "test",
"script": {
"id": "14d7825c-fef1-4d4a-a7b1-bdce259f7b41",
"type": "text/javascript",
"exec": [
"pm.test(\"接口返回 200\", function () {",
" pm.response.to.have.status(200);",
"});"
]
}
}
],
"request": {
"method": "POST",
"header": [],
"body": {},
"url": {
"raw": rawString,
"host": [
"{{base}}"
],
"path": paths
}
},
"response": []
}
itemDicts.append(itemDict)
postmanDict = {
"info": {
"_postman_id": "bb6f7282-9c68-4b73-a463-d2087e3301c5",
"name": "PythonTest",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item":itemDicts
}
jsonStr = json.dumps( postmanDict, ensure_ascii=False, encoding='UTF-8')
with open(outputFilePath, 'wt') as f:
f.write(jsonStr)
那么问题又来了,之前我接了两百个接口,里面的断言逻辑已经写好了,除了判断HTTP本身的200,还有我们服务器内部定义的成功的状态,或者某种我认为的成功的状态。
然后,这上面的脚本又生成了新的。这里面新的会有之前写好的里面的,也会有没有,怎么判断这个没有呢。
于是我又对上面的脚本进行了更改,加入了一个bool值用于判断是否需要进入merge之前的老json文件
# coding=utf-8
import json
import sys
reload(sys)
sys.setdefaultencoding('utf8')
isNeedMergeOldJSON = False
if isNeedMergeOldJSON:
with open("/Users/mac/Desktop/companyProj/QYD_InterfaceAutomationTest/QYDWithParameter.postman_collection.json",'r') as load_f:
oldPostmanDict = json.load(load_f)
apiDicts = \
[xcode和weexulr生成的url串]
outputFilePath = "/Users/mac/Desktop/postman.json"
itemDicts = []
if isNeedMergeOldJSON:
itemDicts = oldPostmanDict['item']
oldURLStrings =[]
for itemDic in itemDicts:
oldURLStrings.append(itemDic['request']['url']['raw'])
for apiDict in apiDicts:
firstKey = apiDict.keys()[0]
urlString = apiDict[firstKey]
rawString = "{{base}}" + urlString
paths = urlString.split('/')
itemDict = { "name": firstKey,
"event": [
{"listen": "test",
"script": {
"id": "14d7825c-fef1-4d4a-a7b1-bdce259f7b41",
"type": "text/javascript",
"exec": [
"pm.test(\"接口返回 200\", function () {",
" pm.response.to.have.status(200);",
"});"
]
}
}
],
"request": {
"method": "POST",
"header": [],
"body": {},
"url": {
"raw": rawString,
"host": [
"{{base}}"
],
"path": paths
}
},
"response": []
}
if isNeedMergeOldJSON:
wantJoinURLString = itemDict['request']['url']['raw']
value = wantJoinURLString.replace('{{base}}','')
if wantJoinURLString in oldURLStrings:
pass
else:
itemDicts.append(itemDict)
else:
itemDicts.append(itemDict)
postmanDict = {
"info": {
"_postman_id": "bb6f7282-9c68-4b73-a463-d2087e3301c5",
"name": "PythonTest",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item":itemDicts
}
jsonStr = json.dumps( postmanDict, ensure_ascii=False, encoding='UTF-8')
with open(outputFilePath, 'wt') as f:
f.write(jsonStr)
网友评论