2010-01-25 30 views
13

Chúng tôi viết ứng dụng khách cho dịch vụ từ xa để hiển thị các dịch vụ web SOAP và xuất bản định nghĩa WSDL cho các dịch vụ đó.Tạo dịch vụ web mô phỏng từ tệp WSDL trong Python

Chúng tôi không có quyền truy cập vào hệ thống trong khi thử nghiệm, vì vậy chúng tôi muốn viết một dịch vụ giả. Chúng tôi đang sử dụng Python cho khách hàng, vì vậy, lý tưởng nhất là chúng tôi muốn sử dụng Python cho máy chủ giả, mặc dù tôi cho rằng nó không thực sự cần thiết.

Ước mơ sẽ có thể tạo ra các tệp từ tệp WSDL mà chúng ta có thể điền vào, sau đó phục vụ chúng bằng cách sử dụng Paste Deploy làm máy chủ WSGI, mặc dù nó không phải là Paste Deploy hoặc WSGI quá lâu vì nó hoạt động đáng tin cậy. Điều chính là chúng ta cần phải tạo ra các sơ khai từ tệp WSDL "thực" để chúng ta không vô tình viết một máy chủ giả không tuân thủ.

Chúng tôi đang sử dụng thư viện cho thư viện phía máy khách và đã xem xét soaplib và ZSI. Tuy nhiên, các công cụ wsgi2py trong soaplib nói "không sử dụng" ở đầu và ZSI có vẻ như rất nhiều để nuốt. Mọi người thường sử dụng cái gì cho loại điều này?

Martin

Trả lời

8

Là máy chủ giả tôi thực sự khuyên bạn nên soapUI (http://www.soapui.org).

Mất một WSDL và tự động tạo các dịch vụ và phương pháp dịch vụ. Sau đó bạn có thể tiếp tục và định nghĩa các trả về tĩnh hoặc các giá trị động bằng cách sử dụng các kịch bản lệnh Groovy. Hãy xem here để biết tài liệu về chế nhạo dịch vụ web.

soapUI có phiên bản chuyên nghiệp miễn phí và trả phí. Tôi đã sử dụng phiên bản miễn phí với thành công lớn.

+0

Cảm ơn cả hai. Từ một thử nghiệm nhanh chóng, SoapUI (miễn phí) trông tuyệt vời. – optilude

6

Tôi khuyên bạn nên sử dụng soapUI để tạo dịch vụ giả. Nó rất dễ cài đặt. Nó chỉ là dễ dàng để tạo ra một dịch vụ giả lập WS. Nó lấy tệp WSDL từ vị trí mong muốn của bạn, nó tạo cấu trúc cho các yêu cầu và nếu bạn muốn, nó cũng tạo ra dịch vụ web giả với cấu trúc dự định được rút ra từ tệp WSDL. Khi bạn tạo dự án soapUI mới, hãy chọn tùy chọn hộp kiểm thứ ba để tạo dịch vụ web giả.

Nếu tệp lược đồ xsd là bắt buộc, hãy đảm bảo chúng được tham chiếu tốt từ tệp WSDL.

Nó không sử dụng python nhưng nếu tất cả những gì bạn cần là môi trường thử nghiệm mà bạn có thể gửi yêu cầu và nhận phản hồi, điều đó sẽ là quá đủ.

Tôi hy vọng điều đó sẽ hữu ích.

3

Bạn có thể sử dụng mã này để tạo ứng dụng khách suds.

from suds.client import Client 

class AlwaysCallable(object): 
    """ 
    Represents a chainable-access object and proxies calls to ClientMock. 
    """ 

    name = None 

    def __init__(self, client_cls): 
     self._client_cls = client_cls 

    def __call__(self, *args, **kwargs): 
     try: 
      hook = object.__getattribute__(self._client_cls, self.name) 
     except AttributeError: 
      pass 
     else: 
      return hook(self._client_cls, *args, **kwargs) 

    def __getattr__(self, item): 
     new = object.__getattribute__(self, '__class__')(self._client_cls) 
     new.name = item 
     return new 


class ClientMock(Client): 
    """ 
    Abstract mock suds client. 
    """ 

    def __init__(self, url, **kwargs): 
     pass 

    def __getattr__(self, item): 
     return AlwaysCallable(self.__class__) 

    def __unicode__(self): 
     return 'Client mock' 

    def __str__(self): 
     return 'Client mock' 

Và tiếp theo xác định ClientMock cụ thể.

class UserCredentialsServiceClientMock(ClientMock): 
    """ 
    Mock object that implements remote side services. 
    """ 

    def GetUserInfo(cls, user_id): 
     """ 
     Stub for remote service. 
     """ 
     return UserInfo(id=user_id, name='Adam Smith') 

Bây giờ bạn có thể sử dụng thư viện giả để mã hóa mã, sử dụng suds.client.Client.

from unittest import TestCase 
from mock import patch 
from project.api import get_user_credentials 

class UserCredentialsClientTestCase(TestCase): 
    def test_getting_user_credentials(self): 
     with patch('project.api.Client', new=UserCredentialsServiceClientMock): 
      self.assertEquals(get_user_credentials(1), 'Adam Smith') 
Các vấn đề liên quan