用接口数据生成词云与关系图
2017-10-15 本文已影响319人
c4a1d989518e
Python是非常适合用来处理数据的,当我在写我的接口框架的适合,我看着那些测试用例的数据,忽然想换个玩法。
接口数据生成词云
词云看起来好看,也直观,会根据不同词汇出现的比重大小,来在图片中呈现不同的大小。我的数据来自于我自己用yaml编写的yaml文件,里面有许多接口数据的字段。

有一点值得注意的是,我把所有接口字段拼接为一个list,然后用WordCloud是不能解析成功的。WordCloud解析的是一个完整的字符串,如一篇文章中出现的某个词的出现的频率。
bb=""
for i in Atest:
bb=bb+str(i)+" "
wordcloud=WordCloud().generate(bb)
用上面这种方法可以把list中的接口字段,拼接成个彼此用空格
隔开的字符串
绘制生成的词云可以用
plt.imshow(wordcloud,interpolation='bilinear')
plt.axis("off")
plt.show()
这样可以直接绘制出图片,显示出来,而我想要保存下图片来
wordcloud.to_file(os.getcwd()+"/myfiles/static/img/word.jpg")
生成接口依赖关系图
生成关系图,是用的graphviz。Graphviz 是基于 DOT 语言的绘图工具,可以绘制有向图、无向图、关系图、目录图、流程图等图形。

至于graphviz的用法,直接看这篇教程Python 使用 Graphviz 绘制关系图
这里的技术点,也是分两部分,一个是找出所有节点,另一个是找出节点之间的传递数据。
#生成接口关系list表
def cmp_hh(file_chart):
file_chart=file_chart
AD=cmp_relation(file_chart)
#print AD
list_have=[]
for i in AD:
list_a=AD[i][0]
for a in AD:
if a!=i:
list_b=AD[a][1]
list_c=[k for k in list_a if k in list_b]
if list_c!=[]:
#a to i
list_has=[]
list_has.append(a)
list_has.append(i)
list_has.append(list_c)
list_have.append(list_has)
return list_have
我就把所有元素都便利了一遍,通过一个for循环,找出对应关系。其中AD的的元素是啥?
{“接口名称”:[['入参‘],['响应数据'],“接口名称”:[['入参‘],['响应数据']}
最后处理出来后的list_have的数据格式是啥?
[ [”接口名称“,”接口名称“,[”接口传递的数据“] ] , [ ”接口名称“,”接口名称“,[”接口传递的数据“] ] ]
这一部分是造数据,接下来就调用下面的生成图像的函数
#用graphviz生成关系表
import graphviz as gv
import functools
graph=functools.partial(gv.Graph,format='svg')
digraph=functools.partial(gv.Digraph,format='svg')
def add_nodes(graph, nodes):
for n in nodes:
if isinstance(n, tuple):
graph.node(n[0], **n[1])
else:
graph.node(n)
return graph
def add_edges(graph, edges):
for e in edges:
if isinstance(e[0], tuple):
graph.edge(*e[0], **e[1])
else:
graph.edge(*e)
return graph
def mkgraph(list_one,list_two):
root_note=os.getcwd()
add_edges(
add_nodes(digraph(),list_one),list_two
).render(root_note+'/myfiles/static/img/g4')
这一部分,在graphviz的文档中有示例,改改就行,然后在想办法调用
#list_one为去重,将接口元素去重,list_two是用来表示接口传递关系
list_one=[]
for i in a:
list_one.append(i[0])
list_one.append(i[1])
list_one=list(set(list_one))
list_two=[]
for b in a:
bet=""
for c in b[2]:
bet=bet+"+"+c
list_two.append(((b[0],b[1]),{'label':bet}))
mkgraph(list_one,list_two)
return render(request,'chart.html')
参考文章:
Python 使用 Graphviz 绘制关系图