Webサービスインターフェイスのテストを自動化する方法

  • 前書き

  • Webサービスとは

  • Webサービスの構成と呼び出しの原則

  • WebサービスインターフェースとAPI(アプリケーションプログラムインターフェース)の違い

  • Webサービスインターフェイスの戦闘

    • 1.suds-SOAPクライアント

    • 2.Zeep-SOAPクライアント

    • 3.ジープと泡の比較

  • 総括する

 

前書き

HTTPリクエストに基づくAPIとUIの自動化テストに関する多くの記事を共有しました。

実際、インターフェイスにはさまざまな形式があります。一般的なHTTP RESTFULインターフェイスに加えて、WebサービスタイプのインターフェイスとRPCインターフェイスもあります。さまざまなタイプのインターフェイステスト方法が異なります。

今日共有されるトピックは次のとおりです。Webサービスタイプのインターフェイスをテストする方法。

 

 

Webサービスとは

Webサービスは、クロスプログラミング言語およびクロスオペレーティングシステムプラットフォームのリモートコールテクノロジです。

素人の言葉で言えば、Webサービスは、Webを介して呼び出すことができるAPIを公開することにより、外部にサービスを提供するアプリケーションです。WebServiceは、プログラミング言語とオペレーティングシステムを交差させることができます。つまり、クライアントプログラムとサービスを提供するサーバープログラムは、異なるプログラミング言語を使用し、異なるオペレーティングシステムを使用できます。

例:WebServicesを介して、Windowsプラットフォームで実行されているC ++で記述されたクライアントプログラムは、Linuxプラットフォームで実行されているJavaで記述されたサーバープログラムと通信できます。

 

Webサービスの構成と呼び出しの原則

Webサービスプラットフォームの構成は、次のテクノロジに依存しています。

  • UDDI: Universal Description、Discovery、Integrationを意味します。これは、企業がWebサービスを登録および検索できるディレクトリサービスです。XMLに基づくクロスプラットフォームの記述仕様です。

  • SOAP:は、アプリケーションがHTTPを介して情報を交換できるようにする単純なXMLベースのプロトコルです。

  • WSDL: XMLに基づく言語あり、WebサービスとWebサービスへのアクセス方法を説明するために使用されます。

Webサービスの呼び出し原理は次のとおりです。画像

 

ステップ1:クライアントはサービスを呼び出したいが、どこから呼び出すかわからないため、UDDIレジストリへの照会を開始します。

ステップ2: UDDI登録センターで検索したところ、クライアントが必要とするサービスを提供できるWebサービスAという名前の人がいることがわかりました。

ステップ3:クライアントはWebサービスAにメッセージを送信し、提供するサービスを呼び出す方法を尋ねます。

ステップ4: WebサービスAは要求を受信し、WSDLファイルをクライアントに送信します。WebサービスAが提供できるさまざまなメソッドインターフェイスがここに記録されています。

ステップ5:クライアントはWSDLを介してSOAPリクエストを生成し(Webサービスによって提供されるxml形式のインターフェイスメソッドはSOAPプロトコルを使用してHTTPリクエストにカプセル化されます)、それをWebサービスAに送信して必要なサービスを呼び出します。

ステップ6: WebサービスAは、SOAP要求に従って対応するサービスを実行し、結果をクライアントに返します。

 

WebサービスインターフェースとAPI(アプリケーションプログラムインターフェース)の違い

Webサービスインターフェイスと一般的に使用されるAPI(アプリケーションプログラミングインターフェイス)の違いは何ですか?次の表に違いを示します
画像。私たちの日常業務では、インターフェイスがWebサービス、API、またはRESTFUL APIの形式でテスト用に提供されるかどうかは、多くの場合、ビジネスの実際の状況によって異なります。

 

Webサービスインターフェイスの戦闘

前の説明から、WSDLは、クライアントによって呼び出されるWebサービスによって生成されるインターフェースサービス記述であることがわかります。クライアントはWSDLを介して、正しい要求を作成し、それをサーバーに送信できます。

これは実際の作業にも当てはまります。Webサービス形式のインターフェースの場合、開発は多くの場合、WSDL形式のリンクです。たとえば、次のリンクはパブリックWebサービスサービスインターフェイスです。

# IP地址服务
http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

 

1.suds-SOAPクライアント

Pythonでは、クライアントはsudsライブラリを使用してWebサービスを呼び出すことができます。suds Clientクラスは、Webサービスを使用するための統合APIオブジェクトを提供します。このオブジェクトには、次の2つの名前空間が含まれています。

  • service:サービスオブジェクトは、消費されたWebサービスによって提供されるメソッドを呼び出すために使用されます。

  • factory:WSDLで定義されたオブジェクトとタイプのインスタンスを作成するために使用できるファクトリを提供します。

泡の使用

  • Sudsのインストール
    PythonがPython2.Xバージョンのサポートを正式に停止し、Python 3.Xに完全に切り替えた後、元のsudsプロジェクトの開発は停滞しましたが、これはsudsがPython3.Xをサポートしなくなったことを意味するものではありません。suds-communityは、元のsudsライブラリをフォークし、Python3.Xをサポートするバージョンを開発します。インストールコマンドは次のとおりです。

pip install suds-community
  • 使いやすい

from suds.client import Client

if __name__ == "__main__":
    url = 'http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl'
    # 初始化
    client = Client(url)
    
    # 打印出所有可用的方法
    print(client)

上記のコードを直接実行すると、実行結果は次のようになります。

# 运行结果片段
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

このコードでは、IpAddressSearchWebServiceでサポートされているすべてのメソッドが出力されます。ご覧のとおり、3つのメソッドがあります(Methods(3)は、このWebサービスによって提供されるメソッドとパラメーターを示しています)。

 

  • 実際のケース
    IpAddressSearchWebServiceのWebサービスが3つのメソッドをサポートしていることがわかったので、次のメソッドを適用してみましょう。

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'))

上記のコードを実行すると、次の出力が表示されます。

# 输出结果片段
# 此为getVersionTime这个方法的输出

IP地址数据库,及时更新
# 此为getCountryCityByIp方法的输出
(ArrayOfString){
   string[] = 
      "192.168.0.1",
      "局域网 对方和您在同一内部网",
 }

コードでは、client.serviceメソッドを使用したことに注意してください。これは、サービスオブジェクトが、消費されたWebサービスによって提供されるメソッドを呼び出すために使用されるためです。

 

実際の作業では、遭遇するWSDLインターフェースはこれよりもはるかに複雑になります。したがって、通常の状況では、WSDLインターフェースを使用するクラスにカプセル化し、次に示すように、各クラスメソッドに対応するテストケースを記述します。

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.Zeep-SOAPクライアント

Zeepは、Pythonの最新のSOAPクライアントです。Zeepは、WSDLドキュメントをチェックし、対応するコードを生成することにより、WSDLドキュメントのサービスとタイプを使用します。このメソッドは、SOAPサーバーに使いやすいプログラミングインターフェイスを提供します。

以下は、Zeepの使用に関する具体的な説明です。

  • Zeepインストール
    インストールコマンドは次のとおりです。 python pip install zeep

  • ZeepはWSDLで利用可能なメソッドを照会します

sudsと比較して、WSDL記述で使用可能なメソッドを確認したい場合、Zeepは初期化アクションを実行する必要はありません。コマンドラインに次のコマンドを入力するだけです。

python -mzeep http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl

実行後、次のような出力が表示されます。

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

結果からわかるように、IpAddressSearchWebServiceは、getCountryCityByIp、getGeoIPContext、およびgetVersionTimeの3つのメソッドを提供します。

 

  • 簡単な使用
    方法使用可能なメソッドがわかったら、使用可能なメソッドを直接呼び出すことができます。

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'))

 

  • 実際のケース

ここで、上記のsudsで実装されたテストIpAddressSearchWebServiceのコードを変更して、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"])

ご覧のとおり、Zeepを使用してWebサービスサービスを呼び出すことも非常に簡単です。

 

3.ジープと泡の比較

sudsは古いSOAPクライアントであり、Zeepは非常に人気のあるSOAPクライアントです。では、どのように選択すればよいのでしょうか。参考までに、2つの違いをいくつか示します。
画像

要約すると、Zeepは最新バージョンのPythonをより適切にサポートし、パフォーマンスの問題はありません。プロジェクトが新しく確立された場合は、Webサービスクライアントを選択するときにZeepを直接使用することをお勧めします。

 

総括する

今日の共有は、WebサービスとWebサービスのインターフェース、特にWSDL形式で提供されるインターフェースをテストする方法に焦点を当てています。

また、Webサービスをテストするための2つのPythonライブラリsudsとZeep、および日常業務でWebサービスインターフェイスをカプセル化するためにsudsまたはZeepを使用する方法についても紹介します。

[The Way of Infinite Testing]パブリックアカウントへようこそ、返信[Receive Resources]
Pythonプログラミング学習リソース乾物、
Python + AppiumフレームワークAPPUI自動化、
Python + Seleniumフレームワーク
WebUI自動化、Python + UnittestフレームワークAPI自動化、

リソースとコードは無料で送信されます〜
記事の下部に公式アカウントのQRコードがあります。WeChatでスキャンしてフォローするだけです。

備考:私の個人公開アカウントが正式に開設され、ビッグデータテスト、機能テスト、テスト開発、APIインターフェイスの自動化、テストの運用と保守、UI自動化テストなどのテストテクノロジーの共有に専念しています。WeChat検索パブリックアカウント:「WuliangThe Way of Testing」、または以下のQRコードをスキャンしてください。

 注意を向けて、一緒に成長しましょう!

おすすめ

転載: blog.csdn.net/weixin_41754309/article/details/113887319