Cómo automatizar las pruebas de la interfaz del servicio web

  • 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:imagen

 

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:
imagenEn 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:
imagen

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!

Supongo que te gusta

Origin blog.csdn.net/weixin_41754309/article/details/113887319
Recomendado
Clasificación