Web サービスをテストするための自動テスト フレームワークを開発しています。Web サービスは SOAP であり、Java で (Apache Axis2 経由で) 実装されていますが、テストは Python で実装されており、suds ライブラリを使用してサーバーに要求を発行します。テストは、ユーザーのデータのバックアップなどのシナリオをテストする高レベルのテストです。
現在、この Web サービスは、特定のメソッドが多数の異なるタイプのオブジェクトを渡す必要があり、多くの場合、特定のオブジェクトを取得するために他のメソッドを呼び出す必要があるという点で複雑です。たとえば、前提条件が次のようなユーザーをバックアップするための呼び出しがあります。
- メソッド getUser() を呼び出して、オブジェクト User を取得します
- メソッド getDataset() を呼び出して、オブジェクト Dataset を取得します
- メソッド getXService() を呼び出して、オブジェクト XService を取得します
- メソッド doBackup(User, Dataset, XService) を呼び出してバックアップを開始します
これは、主要な呼び出しを行う前に、他の多くの前提条件呼び出しがある呼び出しの 1 つの単純な例です。これらのシナリオはテストで頻繁に実行する必要があるため、呼び出しのセットを抽象化し、上記のバックアップを実行するには、他のメソッドを呼び出すメソッドを 1 つ呼び出すだけでよいようにします。
私の質問は、オブジェクト指向の方法でこれを行い、オブジェクトの Java バージョンにマップする Python クラスの 1 対 1 のマッピングをほとんど作成する必要があるかということです。したがって、私のテスト フレームワークにはクラスが含まれているだけなので、次のことができます。
# User, XService, and Dataset are classes that correspond with
# types implemented in the SOAP web service
from lib import XService, Dataset
class User():
def __init__(self, **kwargs):
self.id = kwargs.get('id', None)
def create(self):
soap_client.call('createClient', self.id)
def backup(self):
dataset = Dataset.get(1234)
service = XService.getInstance()
soap_client.call('doBackup', self, dataset, service)
したがって、毎回 3 つの異なるメソッドを発行するのではなく、backup() を呼び出すだけです。
これの欠点は、サーバー上のすべての Type に対してオブジェクトを作成する必要があることです。さらに、テスト側のオブジェクトはサーバー上のデータと同期しないため、古くなる可能性があります。
私のもう1つのアイデアは、オブジェクト指向のルートに行かず、backupUser()やrestoreBackupToUser()のようなメソッドだけでモジュールを作成し、サーバーから返された実際のデータオブジェクトをそれらに供給することでした。このアプローチは、古いデータの問題を解決しますが、保守が困難な大規模なモジュールも作成します。
この問題に遭遇した人は誰でも、私のアプローチについてヒントや批評を与えることができますか? おそらく私は考えすぎており、Web サービスのメソッドをテストするためのより良い方法があります。