"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"
如您所见,共有三个项目级自定义属性,分别是 endpoint、environment 和 outputDir。每个被调用的项目都包含一个名为 AutoTest 的测试套件和一个名为 Test 的测试用例以及三个测试步骤:
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)
- 请求测试步骤 - 基本为空 shell,由步骤 1 中的脚本填充。
- 结束。
所以,问题是,当 运行使用 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' 时,它按预期工作。我猜你每天都在学习。甚至您显然已经知道但忘记的事情。
我遇到了相当奇怪的行为。首先是一些背景: 我在一组项目上使用批处理文件 运行 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"
如您所见,共有三个项目级自定义属性,分别是 endpoint、environment 和 outputDir。每个被调用的项目都包含一个名为 AutoTest 的测试套件和一个名为 Test 的测试用例以及三个测试步骤:
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)
- 请求测试步骤 - 基本为空 shell,由步骤 1 中的脚本填充。
- 结束。
所以,问题是,当 运行使用 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' 时,它按预期工作。我猜你每天都在学习。甚至您显然已经知道但忘记的事情。