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

标签 web-services testing soap automated-tests

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

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

  1. 调用方法 getUser() 获取对象 User
  2. 调用方法 getDataset() 获取对象数据集
  3. 调用方法 getXService() 获取对象 XService
  4. 调用方法 doBackup(User, Dataset, XService) 开始备份

这只是我们其中一个调用的一个简单示例,在可以进行主要调用之前还有许多其他先决条件调用。由于这些场景需要在测试中经常执行,所以我想抽象调用集,以便执行上述备份,我只需要调用一个方法,该方法只为我调用其他方法。

我的问题是,我是否应该以面向对象的方式执行此操作,并几乎创建一个映射到对象的 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 种不同的方法。

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

我的另一个想法是不走面向对象的路线,而是只使用 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-services - 我的测试自动化策略听起来可笑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11285380/

相关文章:

.net - .NET 的 RESTful Web 服务教程

c# - WCF 服务在每次调用时实例化

java - Web 服务中每个用户的全局变量

php - 不要在 WooCommerce 中显示通知的 Web 服务失败响应中保存订单

ruby-on-rails - 编写 gem 时如何测试虚拟 Rails 应用程序?

javascript - 是否有任何自动化脚本可以让我们快速验证标签?

php - 无法连接到主机 Royal mail shipping api SOAP

web-services - 在 SOAP 协议(protocol)中键入 ="xs:string"或类型 ="xsd:string"

java - 如何使用空的soapAction定义调用Web服务?

testing - 软件测试认证从何入手?