Web services 我的测试自动化策略听起来可笑吗?

Web services 我的测试自动化策略听起来可笑吗?,web-services,testing,soap,automated-tests,Web Services,Testing,Soap,Automated Tests,我正在开发一个用于测试web服务的自动化测试框架。web服务是SOAP,用Java实现(通过ApacheAxis2),但是,我们的测试是用Python实现的,并使用suds库向服务器发出请求。这些测试是高级测试,用于测试备份用户数据等场景 现在这个web服务很复杂,因为某些方法需要传递许多不同类型的对象,并且通常需要调用其他方法来获取某些对象。例如,我们有一个用于备份其pre-req如下所示的用户的调用: 调用方法getUser()以检索对象用户 调用方法getDataset()检索对象数据集

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

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

  • 调用方法getUser()以检索对象用户
  • 调用方法getDataset()检索对象数据集
  • 调用方法getXService()来检索对象XService
  • 调用方法doBackup(用户、数据集、XService)开始备份
  • 这只是一个简单的例子,其中一个调用在主调用之前有许多其他先决条件调用。由于这些场景需要在测试中经常执行,因此我想抽象调用集,以便执行上述备份,我只需要调用一个方法,该方法只需为我调用其他方法

    我的问题是,我是否应该以面向对象的方式来实现这一点,并创建一个1对1的Python类映射,映射到对象的Java版本?因此,我的测试框架将只包括类,以便我可以:

    # 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个不同的方法

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

    我的另一个想法不是走面向对象的路线,而是用backupUser()或restoreBackupToUser()之类的方法创建一个模块,然后直接向它们提供从服务器返回的实际数据对象。这种方法将解决陈旧的数据问题,但也将创建难以维护的大量模块


    任何遇到过这个问题的人都可以对我的方法提出一些建议或批评吗。也许我想得太多了,有更好的方法来测试web服务方法。

    不久前,我不得不为测试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)
    
    我们这里还有几个用于身份验证的脚本和一个用于运行所有测试的测试包装器。但是你应该在这里了解一下基本情况


    希望这有助于您做出决定。

    当有多个web服务调用来准备测试中的web服务的数据时,您可能需要后退一步,询问执行web服务功能测试的最佳方法是什么。谢谢您的回答。听到你的成功故事给了我一些信心。看起来是的。