-
前書き
-
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コードをスキャンしてください。
注意を向けて、一緒に成長しましょう!