"Cannot get property 'testCase' on null object" 在 SoapUI REST 项目中

"Cannot get property 'testCase' on null object" in SoapUI REST project

我遇到了相当奇怪的行为。首先是一些背景: 我在一组项目上使用批处理文件 运行 SoapUI test运行ner,这样调用它们(参数是测试的 web 服务的名称、测试环境的名称、soapui 的类型 运行ner, endpoint base url and directory for output of results):

for /D %%a in ("\TestRequests\soap\*") do (
    call ..\..\Run\runSoapUITest.bat %%~nxa environ test http://test.endpoint.com ../outputDir/
)


for /D %%a in ("\TestRequests\rest\*") do (
    call ..\..\Run\runSoapUITest.bat %%~nxa environ test http://test.endpoint.com ../outputDir/
)
    

“\TestRequests\soap”包含子目录(每个测试的 Web 服务一个),每个子目录包含 xml 个测试请求。 调用的 runSoapUITest.bat 看起来像这样:

set WSname=%1
set environementName=%2
set runner=%3
set endpoint=%4%
set output=%5%
   
...

"%SOAPUI_FOR_TEST_DIR%\bin\%runner%runner.bat" -sAutoTest -r -a -j -I -Pendpoint=%endpoint% -Penvironement=%environementName% -PoutputDir=%output% "%current_dir%\..\resources\TestProjects-Auto\%WSname%-soapui-project.xml"

如您所见,共有三个项目级自定义属性,分别是 endpointenvironmentoutputDir。每个被调用的项目都包含一个名为 AutoTest 的测试套件和一个名为 Test 的测试用例以及三个测试步骤:

  1. Groovy 脚本从我的库中调用脚本,遍历 \TestRequests\soap[WSname] 目录中的 xml 文件并将它们提供给步骤 2。这脚本还加载项目属性以了解在哪里可以找到测试请求 xmls 以及在哪里输出结果。这个脚本在所有 soap web 服务项目中都是通用的,并且非常相似的脚本用于我使用的一个 rest 服务项目。主要区别在于其余版本显式填充它从 json 文件中读取的查询参数。这是使用外部库完成的,因此此步骤如下所示:

    进口wstests.RunTests

    def RT = new RunTests(上下文:上下文,日志:日志)

    RT.Cycle()

    testRunner.gotoStep(2)

对于 soap 项目,对于其余项目,像这样:

import wstests.RunTests

def RT = new RunTests(context: context, log: log)
    
RT.CycleRest()
    
testRunner.gotoStep(2)
  1. 请求测试步骤 - 基本为空 shell,由步骤 1 中的脚本填充。
  2. 结束。

所以,问题是,当 运行使用 soap 网络服务版本时,一切正常。但是当我 运行 其余 Web 服务版本时,我遇到异常:java.lang.NullPointerException:无法在下面突出显示的行的空对象上获取 属性 'testCase':

def CycleRest() {

    --> def environement = testRunner.testCase.testSuite.project.getPropertyValue( "environement" )
        def endP = testRunner.testCase.testSuite.project.getPropertyValue( "endpoint" )
        def outRoot = testRunner.testCase.testSuite.project.getPropertyValue( "outputDir" )

        def projectName= testRunner.testCase.testSuite.project.getName();
        context.projectName = projectName
...

奇怪的是,脚本的这个开头部分与 soap 项目完全相同,工作正常:

def Cycle() {

        def projectDir = context.expand('${projectDir}');

        def environement = context.testCase.testSuite.project.getPropertyValue( "environement" )
        def endP = context.testCase.testSuite.project.getPropertyValue( "endpoint" )
        def outRoot = context.testCase.testSuite.project.getPropertyValue( "outputDir" )

        def projectName= context.testCase.testSuite.project.getName();
        context.projectName = projectName
...

为什么 soap 项目(基于 WSDL)的行为应该与 rest 项目(基于 WADL)不同?

一些评论: 只有当我 运行 使用我的库的脚本时才会发生这种情况。如果我将脚本直接粘贴到 Groovy 测试步骤中,它就可以工作。 似乎在批处理文件 runSoapUITest.bat 中设置项目参数有问题,但 rest 和 soap 的调用是一样的。我一定是忽略了什么,我就是找不到什么。

提前致谢。

好的,经过仔细检查,我发现了关键区别 - 尽管您可以 运行

def environement = testRunner.testCase.testSuite.project.getPropertyValue( "environement" )

从 SoapUI 客户端内部,当 运行仅通过测试运行ner 时,testRunner 丢失。您必须将其交换为 context - 这甚至可以从我的工作代码片段中看出。

当我将 'testRunner' 的所有实例替换为 'context' 时,它按预期工作。我猜你每天都在学习。甚至您显然已经知道但忘记的事情。