如果测试场景变得越来越复杂,您可能希望在不同的TestCases之间共享一些TestSteps,也许可以设置一些先决条件(登录等)或在不同的上下文中执行某些步骤。和往常一样,在SoapUI中有几种方法可以实现这一点;
- 通过使用“Run TestCase”TestStep来执行其他TestCases
- 通过创建脚本并使用SoapUI API来执行所需的TestSteps,TestCases等。
The "Run TestCase" TestStep
Run TestCase TestStep提供了一种灵活的模块化方法;它执行配置的目标TestCase可选地在执行之前和之后传递和检索属性,例如您可以使用它来调用复杂的TestSteps序列来执行和验证登录过程,传递所需的凭据并接收结果的sessionid。当配置TestStep时,它将如下所示:
前两个选项用于选择实际目标TestCase,其余选项与属性/会话管理和线程执行相关。让我们详细看看这些
Property Management
Run TestCase TestStep将包含与所选目标TestCase相同的属性,允许您同时指定将在执行时传递给目标TestCase的值(非常类似于方法参数),并将属性选择为“返回属性”,其值将在执行后从目标TestCase中提取(非常像返回值)。选择“Ignore Empty Properties”选项将确保调用TestStep中不包含任何值的属性将不会覆盖目标TestCase中的任何值。
现在当运行Run TestCase TestStep(使用其工具栏中的Run按钮)时,它会将用户名和密码属性的值复制到目标TestCase并执行它。目标TestCase依次执行登录并将生成的sessionid复制到相应的TestCase属性中,后者又被复制回调用TestStep;
您可以查看这个,就像我们调用Login TestCase一样,它是一个采用输入参数并返回的方法。
设置运行模式
执行目标TestCase时,可以通过几种不同的方式配置Run TestCase TestStep的模式:
- 每次执行通过在内存中创建目标TestCase的副本。这具有支持多个同时呼叫的优点,例如,如果运行调用TestCase作为LoadTest。缺点是在执行TestCase之后,任何属性更改都会丢失,并且需要更多的内存来执行新的副本。
- 通过执行现有的TestCase,只要您不需要同时从多个源调用相同的TestCase即可正常工作,在多线程情况下,调用Run TestCase Teststep将失败,除非您将其配置为等待为目标TestCase首先完成
当运行包含Run TestCase TestStep作为LoadTest的TestCase时,上述情况变得尤为重要;在这种情况下,第一个选项是唯一可以顺利运行的选项,否则LoadTest中的所有线程都将调用TestCase的同一个实例,否则将导致它失败。
使用脚本进行模块化
与往常一样,SoapUI API允许您通过脚本TestStep完成此操作。让我们快速了解一下如何使用脚本来实现上述方案;
import com.eviware.soapui.model.testsuite.TestRunner.Status
// get TestCase
def tc = testRunner.testCase.testSuite.project.testSuites["Sample Simple TestSuite"] .testCases["Simple Login and Logout w. Properties Steps"]
// set login properties
tc.setPropertyValue("Username", "ole" ) tc.setPropertyValue("Password", "nomoresecrets" )
// run test synchrouously
def runner = tc.run( null, false )
// show that it worked out ok
log.info "Status: $runner.status, time taken for TestCase was: $runner.timeTaken ms"
// assert that it didn‘t fail
assert runner.status != Status.FAILED : runner.reason
这里检索和执行目标TestCase;如果失败,抛出异常(通过assert语句),这也将导致Groovy Script TestStep失败