1. 做自动化测试的时候,需要模拟一些界面上的操作场景,有时就会碰到需要根据上一步的测试步骤状态选择下一步需要跳转的步骤,这个时候就需要获取上个TestStep的运行状态,个人理解的状态应该有:
Success
Failed
Cancelled
Disabled
于是在SoapUI Groovy Script中注入的三个对象“log”, "context"和“testRunner”中各种尝试,看是否存在一个属性,表示TestStep的状态。
2. 试了很多次,终于在testRunner的方法中看到了一个带有Status的方法“getStatus()”,于是欣喜的想知道这个方法获取到的是什么值:
log.info testRunner.status
log.info testRunner.getStatus()
上面这两条语句都打印了"RUNNING",于是去查了API,发现TestRunner的Status是一个枚举值:
Enum Constants:
CANCELLED
FAILED
FINISHED
INITIALIZED
PENDING
RUNNING
WARNING
但是这个状态的值表示的是当前TestRunner的状态,并不是某个TestStep的状态。
3. 于是查了很多SoapUI API中的其他类,发现TestStepResult这个接口里面有一个方法“getStatus()”,专门用来获取TestStep的运行状态(TestStepStatus)。
这个TestStepStatus也是枚举值:
CANCELLED
FAILED
OK
UNKNOWN
4. 实现这个TestStepResult接口的类很多:
AMFTestStepResult, JdbcTestStepResult, ManualTestStepResult, PropertyTransfersTestStep.PropertyTransferResult, RestRequestStepResult, WsdlMessageExchangeTestStepResult, WsdlSingleMessageExchangeTestStepResult, WsdlTestRequestStepResult, WsdlTestStepResult, XmlRpcTestStepRequestResult
但是Groovy Script中注入的三个对象"log", "context", "testRunner"都不是实现TestStepResult的类的实例。(包括Script Assertion中注入的“messageExchange”也不是以上这些类的实例)
messageExchange属于:RestResponseMessageExchange类的实例
testRunner属于:MockTestRunner类的实例
5. 于是就想着怎样通过"log", "context", "testRunner" 和"messageExchange"这四个对象来获取到一个TestStepResult对象呢?
查了它们四个的API以后,发现:
testRunner.runTestStep(TestStep testStep) 和
testRunner.runTestStepByName(String name)
这两个方法返回的是一个TestStepResult实例。
所以就在Groovy Script里面调用了如下方法:
log.info testRunner.runTestStepByName("GetHoldingsReturn").getStatus()
等这个"GetHoldingsReturn"方法运行完了以后,状态栏输出"OK".
6. 综上所述:
SoapUI在获取某个TestStep的运行状态时有非常大的局限性:
只有在Groovy Script里面调用testRunner的 "runTestStep" 和 "runTestStepByName" 方法去运行某个TestStep,才能获取该TestStep的状态。