我的测试自动化策略听起来很荒谬吗?

时间:2012-07-01 20:27:27

标签: web-services testing soap automated-tests

我正在开发一个用于测试Web服务的自动化测试框架。 Web服务是SOAP并用Java实现(通过Apache Axis2),但是,我们的测试是用Python实现的,并使用suds库向服务器发出请求。这些测试是高级测试,用于测试备份用户数据等场景。

现在这个Web服务很复杂,因为某些方法需要传递大量不同类型的对象,并且通常需要调用其他方法来获取某些对象。例如,我们要求备份pre-reqs如下所示的用户:

  1. 调用方法getUser()以检索对象用户
  2. 调用方法getDataset()来检索对象Dataset
  3. 调用方法getXService()来检索对象XService
  4. 调用方法doBackup(User,Dataset,XService)开始备份
  5. 这只是我们的一个呼叫的简单示例,它可以在进行主要呼叫之前进行许多其他先决条件呼叫。由于这些场景需要经常在测试中执行,我想抽象一组调用以便执行上面的备份,我只需要调用一个方法,只为我调用其他方法。

    我的问题是,我是否应该以面向对象的方式执行此操作,并且几乎创建映射到Java版本对象的Python类的一对一映射?所以我的测试框架只包含类,所以我可以这样做:

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

    所以我所要做的就是调用backup()而不是每次都发出3种不同的方法。

    这样做的缺点是我必须为服务器上的每个Type创建一个对象。此外,测试端的对象可能会变得陈旧,因为它们不与服务器上的数据同步。

    我的另一个想法是不使用面向对象的路由,只使用backupUser()或restoreBackupToUser()等方法创建一个模块,然后只提供从服务器返回的实际数据对象。这种方法可以解决陈旧的数据问题,但也会创建难以维护的大量模块。

    任何遇到此问题的人都可以对我的方法提出一些提示或批评。也许我在想太多,有更好的方法来测试Web服务方法。

1 个答案:

答案 0 :(得分: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)

我们在这里有几个其他脚本用于身份验证,还有一个测试包装器来运行所有测试。但你应该在这里得到一般的想法。

希望这个帮助是你的决定。