【问题标题】:SoapUI: Pass property values to called test caseSoapUI:将属性值传递给被调用的测试用例
【发布时间】:2014-09-02 22:14:33
【问题描述】:

我是 soapui 测试的初学者。希望你能帮我解决这个问题。

在我的测试项目中,我有一个包含多个测试用例的测试套件。多个测试用例将启动同一个测试用例。为了运行这个测试用例,我需要将一些属性值转移到这个测试用例中。

我尝试通过两种方式实现这一目标。但我都失败了。

  1. 我尝试调用测试用例并在测试用例中设置所需的属性。我从 Groovy 脚本开始测试用例。但是我找不到如何在被调用的测试用例中设置属性的好例子。

  2. 我试图在被调用的测试用例中获取调用父测试用例的属性值。看起来调用测试用例的父测试用例在正在运行的测试用例的上下文中不可用。

将调用相同测试用例的测试用例将并行运行。所以,我认为首先设置属性值然后启动测试用例不是解决方案,因为它们会被同时运行的其他测试用例覆盖。由于并行运行测试用例,因此对这些值使用测试套件属性也不起作用。

我的测试项目是这样的。

MyProject
    TestSuite_APLtests
      TestCase_user_01
      Properties test step
      Run_test <groovy script>
      Step_01
      …..
    TestCase_user_02
      Properties test step
      Run_test <groovy script>
      Step_01
      …..
    TestCase_General
      Properties test step
      POST sessions
      Step_01
      …..

每个“TestCase_user_”的“属性测试步骤”包含测试用例“TestCase_General”所需的用户和密码,并且每个测试用例都不同。 在每个“TestCase_user_”的“Run_test”常规脚本中,测试用例“TestCase_General”通过以下方式启动:

def myTestSuite = testRunner.testCase.testSuite.project.getTestSuiteByName("TestSuite_APLtests")
def myTestCase = myTestSuite.getTestCaseByName("TestCase_General")
myTestCase.run(null, false)

如何将属性用户和密码添加到启动测试用例的运行注释中?

如果我尝试在测试用例“TestCase_General”中使用 groovy 脚本获取属性值,我不知道如何确定哪个测试用例调用了“TestCase_General”。我在互联网上发现了一些建议使用:context.getProperty("#CallingRunTestCaseStep#") 来确定调用测试用例的帖子。但是这个值是空的。当我尝试使用以下方法检查调用测试用例在上下文中是否可用时:context.hasProperty("#CallingRunTestCaseStep#") 这是错误的,因此无法找到调用测试用例。

谁能告诉我解决方案是什么才能让它工作。

谢谢,

【问题讨论】:

  • 只是为了澄清......你想知道如何在你的 groovy 脚本中运行它之前设置你的 testCase 的属性吗?
  • 我在每个测试用例的属性测试步骤中设置了属性“用户”和“密码”的值。在这些测试用例的 Groovy 脚本中,我将测试用例称为“TestCase_General”。在我启动测试用例时,需要将属性“用户”和“密码”的值传递给测试用例“TestCase_General”中的属性。我不知道如何将属性从调用测试用例传递给被调用测试用例。

标签: groovy soapui


【解决方案1】:

您可以使用 setPropertyValue(name,value) 方法从 groovy 脚本中设置测试用例属性,但是如果您并行运行测试用例,则您所说的这些属性将被每个调用 TestCase_General 的测试用例覆盖。因此,您可以通过run(StringToObjectMap properties, boolean async) 类中的run(StringToObjectMap properties, boolean async) 方法传递context 属性,而不是使用setPropertyValue。您调用TestCase_General 的常规代码可能是:

import com.eviware.soapui.support.types.StringToObjectMap

// get test suite
def myTestSuite = testRunner.testCase.testSuite.project.getTestSuiteByName("TestSuite_APLtests")
// get your test case
def myTestCase = myTestSuite.getTestCaseByName("TestCase_General")
// set the user and password properties in the context
context.setProperty("user","userTestCaseN")
context.setProperty("password","passwordTestCaseN")
// run the testCase passing the context
def contextMap = new StringToObjectMap( context )
myTestCase.run(contextMap,false);

要访问TestCase_General 的常规脚本中的context 属性,请使用以下代码:

context.getProperty("userPassword")

或者,如果您更喜欢使用context.expand

context.expand('${#user}')

请注意,# 的使用取决于您访问属性的方式。

如果您还需要在 TestCase_General 的 SOAP 测试请求中使用 context 属性,请使用这种方式 ${#propetryName} 即:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
   <Header/>
   <Body>
    <request>
        <user>${#user}</user>
    </request>
   </Body>
</Envelope>

希望这会有所帮助,

【讨论】:

  • 谢谢。我可以这样试试。但是如果我并行运行测试用例,我担心它不会起作用。如果我在运行测试之前在测试用例中设置属性值,这些值会被另一个测试用例覆盖吗?例如测试用例 1 和测试用例 2 同时运行。他们使用不同的用户名和密码并启动 TestCase_General。我认为在另一个测试用例设置值之后,这些测试用例之一将更改这些值。还是我错了,这不会发生?我会试试看,如果它会以这种方式工作。但也许有人知道一个很好的其他解决方案。
  • 嗨@Deddur,一开始很抱歉,我没有意识到您想要并行执行测试,因为您说每个调用TestCase_General的TestCase的属性都将被覆盖。为了并行正确运行,您必须使用问题中建议的上下文属性。我更新了我的答案以适应这个要求。试试看:)
  • 嗨@albciff 谢谢你的解释。我离开了几天,所以我花了一些时间才可以尝试你的建议。我已经在互联网上发现我必须使用上下文来解析属性。但是在这些解释中,我错过了我必须首先在上下文中设置属性。我错误地假设测试用例中使用的属性已经是上下文的一部分。按照您解释的方式,它完美无缺(Y)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2014-11-19
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多