-
Introducción
-
¿Qué son los servicios web?
-
Composición de servicios web y principio de llamada
-
La diferencia entre la interfaz de servicios web y la API (interfaz del programa de aplicación)
-
Combate de interfaz de servicios web
-
Cliente 1.suds-SOAP
-
2.cliente Zeep-SOAP
-
3. Comparación de Zeep y espuma
-
-
para resumir
Introducción
He compartido muchos artículos sobre pruebas de automatización de API y UI basadas en solicitudes HTTP.
De hecho, hay muchas formas de interfaces Además de nuestra interfaz HTTP RESTFUL común, también hay interfaces de tipo de servicios web e interfaces RPC. Los diferentes tipos de métodos de prueba de interfaz son diferentes.
El tema compartido hoy es: Cómo probar la interfaz del tipo de servicios web.
¿Qué son los servicios web?
Web Service es un lenguaje de programación cruzado y una tecnología de llamada remota de plataforma de sistema operativo cruzado.
En términos sencillos, un servicio web es una aplicación que proporciona servicios al mundo exterior al exponer una API a la que se puede llamar a través de la web. WebService puede cruzar lenguajes de programación y sistemas operativos, es decir, su programa cliente y el programa servidor que proporciona el servicio pueden usar diferentes lenguajes de programación y usar diferentes sistemas operativos.
Por ejemplo: a través de WebServices, un programa cliente escrito en C ++ que se ejecuta en la plataforma Windows puede comunicarse con un programa de servidor escrito en Java que se ejecuta en la plataforma Linux.
Composición de servicios web y principio de llamada
La composición de la plataforma de servicios web se basa en las siguientes tecnologías:
-
UDDI: significa Descripción Universal, Descubrimiento e Integración. Es un servicio de directorio a través del cual las empresas pueden registrarse y buscar servicios Web. Es una especificación de descripción multiplataforma basada en XML.
-
SOAP: es un protocolo simple basado en XML que permite a las aplicaciones intercambiar información a través de HTTP.
-
WSDL: es un lenguaje basado en XML y se utiliza para describir los servicios web y cómo acceder a los servicios web.
El principio de llamada de los servicios web es el siguiente:
Paso 1: El cliente quiere llamar a un servicio, pero no sabe dónde llamarlo, por lo que inicia una consulta al registro UDDI.
Paso 2: Centro de registro de UDDI, después de algunas búsquedas, encontré que hay un tipo llamado Web Service A que puede brindar el servicio que el cliente desea.
Paso 3: El cliente envía un mensaje al Servicio Web A, preguntando cómo llamar al servicio que brinda.
Paso 4: El servicio web A recibe la solicitud y envía un archivo WSDL al cliente. Aquí se registran las diversas interfaces de método que puede proporcionar el servicio web A.
Paso 5: el cliente genera una solicitud SOAP a través de WSDL (el método de interfaz de formato xml proporcionado por el servicio web se encapsula en una solicitud HTTP mediante el protocolo SOAP) y la envía al servicio web A para llamar al servicio que desea.
Paso 6: El servicio web A ejecuta el servicio correspondiente de acuerdo con la solicitud SOAP y devuelve el resultado al cliente.
La diferencia entre la interfaz de servicios web y la API (interfaz del programa de aplicación)
¿Cuáles son las diferencias entre la interfaz de servicios web y nuestra API (interfaz de programación de aplicaciones) de uso común? La siguiente tabla muestra la diferencia:
En nuestro trabajo diario, si la interfaz se nos proporciona para probar en forma de servicio web, API o API RESTFUL, a menudo depende de la situación real de la empresa.
Combate de interfaz de servicios web
A través de la explicación anterior, entendemos que WSDL es una descripción del servicio de interfaz generado por Web Services a ser llamado por el cliente. A través de WSDL, el cliente puede construir la solicitud correcta y enviarla al servidor.
Esto también es cierto en el trabajo real: para una interfaz en forma de servicios web, el desarrollo suele ser un enlace en formato WSDL. Por ejemplo, el siguiente enlace es una interfaz de servicio de Web Servbice pública:
# IP地址服务
http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl
Cliente 1.suds-SOAP
En Python, el cliente puede usar la biblioteca de espuma para llamar a Web Service. La clase de cliente suds proporciona un objeto API unificado para utilizar el servicio Web. Este objeto incluye los dos espacios de nombres siguientes.
-
servicio: el objeto de servicio se utiliza para llamar a los métodos proporcionados por el servicio web consumido.
-
fábrica: proporciona una fábrica que se puede utilizar para crear instancias de objetos y tipos definidos en WSDL.
Uso de espuma
-
Instalación de Suds
Después de que Python dejó de admitir oficialmente la versión 2.X de Python y se cambió por completo a Python 3.X, el desarrollo del proyecto de espuma original se detuvo, pero esto no significa que la espuma ya no sea compatible con Python 3.X. suds-community bifurca la biblioteca de espuma original y desarrolla una versión compatible con Python 3.X. Los comandos de instalación son los siguientes:
pip install suds-community
-
Fácil de usar
from suds.client import Client
if __name__ == "__main__":
url = 'http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl'
# 初始化
client = Client(url)
# 打印出所有可用的方法
print(client)
Ejecute el código anterior directamente, encontrará que el resultado de la ejecución es el siguiente:
# 运行结果片段
Suds ( https://fedorahosted.org/suds/ ) version: 0.8.4
Service ( IpAddressSearchWebService ) tns="http://WebXml.com.cn/"
Prefixes (1)
ns0 = "http://WebXml.com.cn/"
Ports (2):
(IpAddressSearchWebServiceSoap)
Methods (3):
getCountryCityByIp(xs:string theIpAddress)
getGeoIPContext()
getVersionTime()
Types (1):
ArrayOfString
(IpAddressSearchWebServiceSoap12)
Methods (3):
getCountryCityByIp(xs:string theIpAddress)
getGeoIPContext()
getVersionTime()
Types (1):
ArrayOfString
En este código, se imprimen todos los métodos admitidos por IpAddressSearchWebService. Como puede ver, tiene tres métodos (Métodos (3) muestra los métodos y parámetros proporcionados por este Servicio Web).
-
Caso real
Ahora que veo que el servicio web de IpAddressSearchWebService admite 3 métodos, apliquemos estos métodos:
from suds.client import Client
if __name__ == "__main__":
url = 'http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl'
# 初始化
client = Client(url)
# 打印出所有支持的方法
print(client)
# 调用支持的方法, 使用client.service
print(client.service.getVersionTime())
print(client.service.getCountryCityByIp('192.168.0.1'))
Ejecute el código anterior, encontrará el siguiente resultado:
# 输出结果片段
# 此为getVersionTime这个方法的输出
IP地址数据库,及时更新
# 此为getCountryCityByIp方法的输出
(ArrayOfString){
string[] =
"192.168.0.1",
"局域网 对方和您在同一内部网",
}
Tenga en cuenta que en el código, utilicé el método client.service, porque el objeto de servicio se usa para llamar a los métodos proporcionados por el servicio web consumido.
En el trabajo real, la interfaz WSDL que encontrará será mucho más complicada que esto. Por lo tanto, en circunstancias normales, encapsularemos la interfaz WSDL en clases para su uso y luego escribiremos los casos de prueba correspondientes para cada método de clase, como se muestra a continuación:
import pytest
from suds.client import Client
@pytest.mark.rmb
class WebServices(object):
WSDL_ADDRESS = 'http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl'
def __init__(self):
self.web_service = Client(self.WSDL_ADDRESS)
def get_version_time(self):
return self.web_service.service.getVersionTime()
def get_country_city_by_ip(self, ip):
return self.web_service.service.getCountryCityByIp(ip)
class TestWebServices:
def test_version_time(self):
assert WebServices().get_version_time() == "IP地址数据库,及时更新"
@pytest.mark.parametrize('ip, expected', [('10.10.10.10', '10.10.10.10')])
def test_get_country_city_by_ip(self, ip, expected):
assert expected in str(WebServices().get_country_city_by_ip(ip))
if __name__ == "__main__":
pytest.main(["-m", "rmb", "-s", "-v"])
2.cliente Zeep-SOAP
Zeep es un cliente SOAP moderno en Python. Zeep utiliza los servicios y tipos en el documento WSDL comprobando el documento WSDL y generando el código correspondiente. Este método proporciona una interfaz de programación fácil de usar para el servidor SOAP.
La siguiente es una explicación específica del uso de Zeep:
-
Instalación de Zeep El
comando de instalación es el siguiente:python pip install zeep
-
Zeep consulta métodos disponibles en WSDL
En comparación con la espuma, si desea ver qué métodos están disponibles en una descripción WSDL, Zeep no necesita realizar acciones de inicialización. Simplemente ingrese el siguiente comando en la línea de comando:
python -mzeep http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl
Después de la ejecución, encontrará el resultado de la siguiente manera:
Prefixes:
xsd: http://www.w3.org/2001/XMLSchema
ns0: http://WebXml.com.cn/
Global elements:
ns0:ArrayOfString(ns0:ArrayOfString)
ns0:getCountryCityByIp(theIpAddress: xsd:string)
ns0:getCountryCityByIpResponse(getCountryCityByIpResult: ns0:ArrayOfString)
ns0:getGeoIPContext()
ns0:getGeoIPContextResponse(getGeoIPContextResult: ns0:ArrayOfString)
ns0:getVersionTime()
ns0:getVersionTimeResponse(getVersionTimeResult: xsd:string)
ns0:string(xsd:string)
Global types:
xsd:anyType
ns0:ArrayOfString(string: xsd:string[])
xsd:ENTITIES
xsd:ENTITY
xsd:ID
xsd:IDREF
xsd:IDREFS
xsd:NCName
xsd:NMTOKEN
xsd:NMTOKENS
xsd:NOTATION
xsd:Name
xsd:QName
xsd:anySimpleType
xsd:anyURI
xsd:base64Binary
xsd:boolean
xsd:byte
xsd:date
xsd:dateTime
xsd:decimal
xsd:double
xsd:duration
xsd:float
xsd:gDay
xsd:gMonth
xsd:gMonthDay
xsd:gYear
xsd:gYearMonth
xsd:hexBinary
xsd:int
xsd:integer
xsd:language
xsd:long
xsd:negativeInteger
xsd:nonNegativeInteger
xsd:nonPositiveInteger
xsd:normalizedString
xsd:positiveInteger
xsd:short
xsd:string
xsd:time
xsd:token
xsd:unsignedByte
xsd:unsignedInt
xsd:unsignedLong
xsd:unsignedShort
Bindings:
HttpGetBinding: {http://WebXml.com.cn/}IpAddressSearchWebServiceHttpGet
HttpPostBinding: {http://WebXml.com.cn/}IpAddressSearchWebServiceHttpPost
Soap11Binding: {http://WebXml.com.cn/}IpAddressSearchWebServiceSoap
Soap12Binding: {http://WebXml.com.cn/}IpAddressSearchWebServiceSoap12
Service: IpAddressSearchWebService
Port: IpAddressSearchWebServiceSoap (Soap11Binding: {http://WebXml.com.cn/}IpAddressSearchWebServiceSoap)
Operations:
getCountryCityByIp(theIpAddress: xsd:string) -> getCountryCityByIpResult: ns0:ArrayOfString
getGeoIPContext() -> getGeoIPContextResult: ns0:ArrayOfString
getVersionTime() -> getVersionTimeResult: xsd:string
Port: IpAddressSearchWebServiceSoap12 (Soap12Binding: {http://WebXml.com.cn/}IpAddressSearchWebServiceSoap12)
Operations:
getCountryCityByIp(theIpAddress: xsd:string) -> getCountryCityByIpResult: ns0:ArrayOfString
getGeoIPContext() -> getGeoIPContextResult: ns0:ArrayOfString
getVersionTime() -> getVersionTimeResult: xsd:string
Port: IpAddressSearchWebServiceHttpGet (HttpGetBinding: {http://WebXml.com.cn/}IpAddressSearchWebServiceHttpGet)
Operations:
getCountryCityByIp(theIpAddress: xsd:string) -> xsd:string
getGeoIPContext() -> xsd:string
getVersionTime() -> xsd:string
Port: IpAddressSearchWebServiceHttpPost (HttpPostBinding: {http://WebXml.com.cn/}IpAddressSearchWebServiceHttpPost)
Operations:
getCountryCityByIp(theIpAddress: xsd:string) -> xsd:string
getGeoIPContext() -> xsd:string
getVersionTime() -> xsd:string
Como se puede ver en los resultados, IpAddressSearchWebService proporciona 3 métodos, a saber, getCountryCityByIp, getGeoIPContext y getVersionTime.
-
Uso simple
Después de saber qué métodos están disponibles, podemos llamar directamente a los métodos disponibles:
import zeep
if __name__ == "__main__":
wsdl = 'http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl'
client = zeep.Client(wsdl=wsdl)
print(client.service.getCountryCityByIp('10.10.10.10'))
-
caso real
Ahora cambiamos el código de la prueba IpAddressSearchWebService implementada con espuma arriba para usar la prueba Zeep:
import pytest
import zeep
@pytest.mark.rmb
class WebServices(object):
WSDL_ADDRESS = 'http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl'
def __init__(self):
self.web_service = zeep.Client(wsdl=self.WSDL_ADDRESS)
def get_version_time(self):
return self.web_service.service.getVersionTime()
def get_country_city_by_ip(self, ip):
return self.web_service.service.getCountryCityByIp(ip)
class TestWebServices:
def test_version_time(self):
assert WebServices().get_version_time() == "IP地址数据库,及时更新"
@pytest.mark.parametrize('ip, expected', [('10.10.10.10', '10.10.10.10')])
def test_get_country_city_by_ip(self, ip, expected):
assert expected in str(WebServices().get_country_city_by_ip(ip))
if __name__ == "__main__":
pytest.main(["-m", "rmb", "-s", "-v"])
Como puede ver, usar Zeep para llamar al servicio Web Service también es muy simple.
3. Comparación de Zeep y espuma
suds es un antiguo cliente SOAP y Zeep es un cliente SOAP muy popular. Entonces, ¿cómo deberíamos elegir? Aquí hay algunas diferencias entre los dos, solo como referencia:
En resumen, Zeep admite mejor la última versión de Python y no tiene problemas de rendimiento. Si su proyecto es de reciente creación, también puede utilizar Zeep directamente al elegir el cliente de servicio web.
para resumir
El intercambio de hoy se centra en cómo probar el servicio web y la interfaz del servicio web, especialmente la interfaz proporcionada en formato WSDL.
También presenta dos bibliotecas de Python, suds y Zeep para probar los servicios web, y cómo usamos suds o Zeep para encapsular la interfaz de los servicios web en nuestro trabajo diario.
Bienvenido a prestar atención a la cuenta pública de [The Way of Infinite Testing], responder [Recibir recursos] Recursos de
aprendizaje de programación de Python productos secos, automatización de la interfaz de usuario de la aplicación del marco Python + Appium , automatización de la interfaz de usuario web del marco Python + Selenium , automatización de la API del marco Python + Unittest,
Los recursos y códigos se envían gratis ~
Hay un código QR de la cuenta oficial en la parte inferior del artículo, puede escanearlo en WeChat y seguirlo.
Observaciones: Mi cuenta pública personal se ha abierto oficialmente, dedicada al intercambio de tecnología de prueba, que incluye: pruebas de big data, pruebas funcionales, desarrollo de pruebas, automatización de la interfaz API, operación y mantenimiento de pruebas, pruebas de automatización de la interfaz de usuario, etc., búsqueda pública de WeChat cuenta: "Wuliang The Way of Testing", o escanee el código QR a continuación:
¡Presta atención y crezcamos juntos!