接口测试 扫描 soa 并输出所有服务方法

异彩飞天 · 2016年10月26日 · 最后由 taurusbb 回复于 2016年10月27日 · 2226 次阅读

现在,大多公司都采用 soa 架构。那么我们怎么知道 soa 提供哪些服务方法呢?是通过浏览器不断的点击尝试?还是通过 wcf?还是通过阅读 soa 接口文档,在软件开发行业,总会有文档落后于代码的情况?这些手法都太拙劣了。其实我们可以通过一些更快捷高效的手段达到目的。

  萌生这个想法的背景是,我们公司部署了几个 soa 服务。然后我们测试自动化非常分散,形式各种各样,五花八门,简直就是八仙过海各显神通,非常不易于统计自动化覆盖率统计。于是乎,就想到了使用脚本扫描统计的办法。不多说了,直接上代码,脚本如下:

#coding=utf-8
import requests
from lxml import etree
from suds.client import Client
import csv



preSoa = r"http://192.168.1.20:8085/"

soaurl =requests.get(preSoa)

detail_html = etree.HTML(soaurl.content)

links =detail_html.xpath(ur"//a")
hrefs = [preSoa +x.attrib["href"] for x in links if ".config" not in x.text and "bin" not in x.text and "Demo" not in x.text and ".asax" not in x.text ]

svclinks =[]

def getsvcurl(templink):
    tempsoaurlcontent = requests.get(templink).content
    temphtml = etree.HTML(tempsoaurlcontent)
    temphtmllink =temphtml.xpath(ur"//a/text()")
    svclink = [templink + x + "?singleWsdl" for x in  temphtmllink  if ".svc" in x]
    [svclinks.append(x) for x in svclink]

[getsvcurl(x) for x in hrefs]

getsvcurl(preSoa)

print "svc count:{0}".format(len(svclinks))


client = Client(svclinks[0])

svcfuns =[]

def dealsvcmethods(svclink):
    methods=[x[0] for x in Client(svclink).sd[0].ports[0][1]]
    [svcfuns.append({"funcname":x,"svc":svclink}) for x in methods]

[dealsvcmethods(x) for x in svclinks]


with open(ur"E:\主站soa2016-10-25.csv", 'ab+') as csvfile :
    writer = csv.DictWriter(csvfile,fieldnames = ["funcname","svc"])
    writer.writeheader()
    writer.writerows(svcfuns)

当然,使用这种方式是有前提条件的。首先,soa 站点必须要公开服务。有了这个,我们能够很容易找出前后版本新增的服务方法。

共收到 4 条回复 时间 点赞

赞思路. 写的少了点. 就不加精了.

首先,你没写具体的实现逻辑,其次我本人确实连 soa 是啥都不懂。最后难道现在 testerhome
就我一个不是 pythoner?一点注释和说明都没有真的合适吗

其实就是理解成以 xml+WebService 的方式吗?代码中看下来 requests 在处理 url 请求相关,然后 suds 模块操作 webservice 相关,lxml 解析 xml。

支持,大鹏厉害~😁

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册