Хобрук: Ваш путь к мастерству в программировании

Тестирование сервиса Soap 1.2 в RobotFramework с использованием библиотеки suds

Я пытаюсь протестировать сервисы 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


  • Какая у вас версия Python? 05.12.2018
  • Проверка ключевой разницы между 1.1 и 1.2 заключается в том, что значение заголовка HTTP для Content-Type было изменено на 'application/soap+xml'. Это должно быть в центре вашего расследования. Мой опыт работы с SudsLibrary не был хорошим, поэтому я бы предложил попробовать форк или оценить собственную реализацию. 07.12.2018
  • Спасибо за ответ. У нас 2,7. Обновление сейчас не вариант. В целях тестирования Suds до сих пор работал нормально (robotframework-sudslibrary). Я пытался сосредоточиться на изменении заголовка HTTP на application/soap+xml, но до сих пор не понял, как это сделать так, чтобы это работало. На самом деле пользовательская реализация была тем, что я пытался сделать, интегрировав именованный фрагмент. Я просто не знаю, как это сделать. 12.12.2018

Ответы:


1

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

Вот некоторые из отличий, которые я заметил при использовании примера SOAP 1.1/1.2:

  1. HTTP header Content-Type:
    • 1.2 = "application/soap+xml"
    • 1.1 = "text/xml".
  2. HTTP header
    • 1.2 = Action
    • 1.1 = SOAPAction
  3. Envelope Namespace
    • 1.2 = "http://www.w3.org/2003/05/soap-envelope"
    • 1.1 = "http://schemas.xmlsoap.org/soap/envelope/"

Для каждого из них было реализовано отдельное решение в приведенном ниже примере. Тип содержимого может быть перезаписан. Действие можно добавить, но действие 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)
12.12.2018
  • Большое спасибо за ответ! Сервис, над которым мы работали, на данный момент вернулся к версии 1.1. Я попробую решения и обновлю после этого, как только будет доступен следующий сервис soap 1.2 (который должен быть в течение нескольких недель). 18.12.2018
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..