0

Web サービスをテストするための自動テスト フレームワークを開発しています。Web サービスは SOAP であり、Java で (Apache Axis2 経由で) 実装されていますが、テストは Python で実装されており、suds ライブラリを使用してサーバーに要求を発行します。テストは、ユーザーのデータのバックアップなどのシナリオをテストする高レベルのテストです。

現在、この Web サービスは、特定のメソッドが多数の異なるタイプのオブジェクトを渡す必要があり、多くの場合、特定のオブジェクトを取得するために他のメソッドを呼び出す必要があるという点で複雑です。たとえば、前提条件が次のようなユーザーをバックアップするための呼び出しがあります。

  1. メソッド getUser() を呼び出して、オブジェクト User を取得します
  2. メソッド getDataset() を呼び出して、オブジェクト Dataset を取得します
  3. メソッド getXService() を呼び出して、オブジェクト XService を取得します
  4. メソッド 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 サービスのメソッドをテストするためのより良い方法があります。

4

1 に答える 1

1

しばらく前に、Web サービスをテストするための自動テスト スイートを作成する必要がありました。各テストで共通して使用されるメソッドが多数あったため、すべてをオブジェクト指向で記述しました。また、これにより、ネガティブ テストなどに関して多くの時間を節約できました。時間をかけてテストを書いている場合は、この方法で保守するのが早くなり、呼び出されるすべての初期メソッドを記述したら、多くの時間を節約できます。テスト中の時間のほとんどは、ロジックがほとんどまたはまったくないいくつかの関数呼び出しです。これが私たちが行ったことの例です:

import suds, unittest, pexpect, re, os,time, sys, random
from random import randrange
from setauth import Authentication

####################################################################
#
#                 Add/Get Profile Function Tests
#
####################################################################

class TestAddGetProfile(unittest.TestCase):

    def setUp(self):
        project = testvars[0]
        media_address = testvars[5]
        mgmt_address = testvars[4]
        self.profile = testvars[7]

        # connects to WSDL file and stores location in variable 'client'
        self.client = testvars[15]
        self.client.options.location = media_address
        self.mgmtclient = testvars[14]
        self.mgmtclient.options.location = mgmt_address

        self.getProfileToken = self.client.factory.create('ns4:ReferenceToken')
        self.getProfileToken.value = self.profile

        self.createProfileToken = self.client.factory.create('ns4:ReferenceToken')
        self.createProfileToken.value = self.profile

        self.createProfileName = self.client.factory.create('ns4:Name')
        self.createProfileName.value = self.profile

        self.deleteProfileToken = self.client.factory.create('ns4:ReferenceToken')
        self.deleteProfileToken.value = self.profile

        self.auth = Authentication()
        self.auth.setAuth('Administrator', self.client, self.mgmtclient)
        self.auth.makeUsers(self.mgmtclient)


    def sudsCreateProfile(self):

        create_result = self.client.service.CreateProfile(self.createProfileName, self.createProfileToken)

    def tearDown(self):
        self.auth.deleteAllUsers(self.mgmtclient)
        self.client = None

class AdminCreateProfile(TestAddGetProfile):

    def runTest(self):
        self.auth.setAuth('Administrator', self.client, self.mgmtclient)
        try:
            self.sudsGetProfile()
            self.sudsDeleteProfile()
        except:
            pass
        try:
            self.sudsCreateProfile()
            self.assertTrue(True)
        except:
            self.assertFalse(True)

ここには、認証用の他のスクリプトがいくつかあり、すべてのテストを実行するためのテスト ラッパーがあります。しかし、ここで一般的な考え方を理解する必要があります。

このヘルプがあなたの決定であることを願っています。

于 2012-07-03T11:40:15.313 に答える