Тестирование сервиса Soap 1.2 в RobotFramework с использованием библиотеки suds - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь протестировать сервисы soap 1.2 с помощью RobotFramework.До сих пор мы тестировали только сервисы soap 1.1 с использованием библиотеки suds для RobotFramework, и suds не совместим с soap 1.2.

Обратная совместимость - это вариант для новых сервисов, но было бы лучше иметь болеедолгосрочное решение.Я не опытный программист, хотя я могу редактировать код, если мне говорят, что и где редактировать.

Что происходит в нашем тесте для мыла 1.2 с использованием suds: suds не может интерпретировать полученный ответиз веб-сервиса и выдает эту ошибку: SAXParseException:: 159: 229: несоответствующий тег

С сообщением мыла все в порядке, нет проблем с его использованием в SoapUI.

Я нашел несколько фрагментов в Интернетеэто говорит о том, что я могу получить библиотеку suds для работы с мылом 1.2 для моих тестов RobotFramework.Но у меня мало опыта программирования, и я не знаю, как включить эти фрагменты в suds.Кто-то прокомментировал этот фрагмент, что это решило его проблему с RobotFramework и suds.

Есть ли кто-нибудь, кто хочет объяснить, как я могу сделать эту работу?Я не могу понять это самостоятельно.Любые предложения будут с благодарностью.

from suds.client import Client
from suds.bindings import binding
import logging


USERNAME = 'username'
PASSWORD = 'password'

# Just for debugging purposes.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

# Telnic's SOAP server expects a SOAP 1.2 envelope, not a SOAP 1.1 envelope
# and will complain if this hack isn't done.
binding.envns = ('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
client = Client('client.wsdl',
        username=USERNAME,
        password=PASSWORD,
        headers={'Content-Type': 'application/soap+xml'})

# This will now work just fine.
client.service.someRandomMethod()

фрагмент от: https://gist.github.com/kgaughan/858851

1 Ответ

0 голосов
/ 12 декабря 2018

Короче, Suds не поддерживает привязки SOAP 1.2.Разработка прекратилась довольно давно.По этой причине SudsLibrary также не поддерживает его.

Некоторые различия, которые я наблюдал при использовании примера службы SOAP 1.1 / 1.2 :

  1. HTTP-заголовок Content-Type:
    • 1.2= "application/soap+xml"
    • 1.1 = "text/xml".
  2. HTTP-заголовок
    • 1.2 = Action
    • 1.1 = SOAPAction
  3. Envelope Namespace

Для каждого из них в приведенном ниже примере было реализовано отдельное решение.Тип содержимого может быть перезаписан.Действие может быть добавлено, но действие SOAPAction не может быть удалено.Пространство имен также может быть перезаписано с использованием библиотеки расширений.Это должно работать для вас, если ваша служба игнорирует атрибут заголовка SOAPaction.

Test Case.robot

*** Settings ***
Library    SudsLibrary
Library    SudsLibraryExtension
Library    Collections    

*** Test Cases ***
TC
    ${BASE_URL}    Set Variable         http://www.holidaywebservice.com
    ${SERVICE}     Create Dictionary    
    ...                                 name=HolidayService_v2    
    ...                                 wsdl=HolidayService2.asmx?WSDL
    ${PORT}        Set variable         HolidayService2Soap12
    ${METHOD}      Set variable         GetCountriesAvailable

    Set Binding     SOAP-ENV    http://www.w3.org/2003/05/soap-envelope
    Create Soap Client     ${BASE_URL}/${SERVICE.name}/${SERVICE.wsdl}
    Set Port    ${PORT}

    Set Headers    Content-Type    application/soap+xml
    Set Headers    Soapaction      ${EMPTY}
    Set Headers    Action          "${BASE_URL}/${SERVICE.name}/${METHOD}"

    ${result}          Call Soap Method     ${METHOD}

SudsLibraryExtension.py

import suds.bindings
from robot.libraries.BuiltIn import BuiltIn, RobotNotRunningError

class SudsLibraryExtension(object):
    """
    Extension on the SudsLibrary

    """
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'    
    ROBOT_LIBRARY_VERSION = 1.0

    def __init__(self, LibraryName='SudsLibrary'):
        """SudsLibraryExtension can be imported with an optional argument.
        - ``LibraryName``:
          Default value for `LibraryName` is SudsLibrary if not given.
          The name can by any Library Name that implements or extends the
          SudsLibraryExtension.
        """        
        try:
            self.SudsLibrary = BuiltIn().get_library_instance(LibraryName)

        # This is useful for when you run Robot in Validation mode or load
        # the library in an IDE that automatically retrieves the documen-
        # tation from the library. 
        except RobotNotRunningError:
            pass

    def set_binding(self, binding, url):
        """Set Binding can be used to add a binding to the message.

        Example    Set Binding     SOAP-ENV    http://www.w3.org/2003/05/soap-envelope
        """
        suds.bindings.binding.envns = (binding, url)
...