当前位置: 首页 > 知识库问答 >
问题:

在SoapUI REST项目中“无法在空对象上获取属性'testCase'”

佴阳辉
2023-03-14

我遇到了相当奇怪的行为。首先介绍一些背景:我正在使用批处理文件在一组项目上运行SoapUI testrunner,像这样调用它们(参数是被测试的web服务的名称、测试环境的名称、soapui runner的类型、endpoint基本url和输出结果的目录):

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。蝙蝠看起来像这样:

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的测试用例,包含三个测试步骤:

> < li>

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

导入wstests. Run测试

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

RT.循环()

testRunner.gotoStep(2)

对于肥皂项目,像这样对于其余项目:

import wstests.RunTests

def RT = new RunTests(context: context, log: log)
    
RT.CycleRest()
    
testRunner.gotoStep(2)

所以,问题是,当运行soap web服务版本时,一切都正常。但是当我运行rest 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
...

奇怪的是,脚本的开头部分与肥皂项目完全相同,它们工作正常:

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的调用相同。我一定是忽略了什么,我就是找不到什么。

提前感谢。

共有1个答案

班宏毅
2023-03-14

好的,经过仔细检查,我发现了关键的区别——尽管你可以跑

def环境=testRunner.testCase.testSuite.project.get属性值("环境")

在SoapUI客户端内部,当仅由testrunner运行时,testRunner会丢失。你必须把它换成上下文——这甚至可以从我的工作代码片段中看出。

当我用“context”替换“testRunner”的所有实例时,它按预期工作。我猜你每天都在学习。甚至是那些你显然已经知道,但却忘记了的事情。

 类似资料:
  • 问题内容: 基本上,我有一个带有的表单,用于选择要使用的数据集(值分别为“ m”,“ f”和“ c”)。然后,我有一个字典/对象,其数据位于: 现在我需要/ / 但我不知道如何使用语法-我已经试过: 什么是正确的语法/方法? 问题答案: 由于您是通过变量引用属性,因此需要使用括号表示法。 …这与您传递字符串时使用的表示法相同。

  • 问题内容: 这个问题很简单,但是由于我是python的新手,所以我从php过来了,因此遇到了一些错误。 我有以下简单的课程: 在PHP中,我可以执行以下操作: 我该如何在python中做到这一点? 问题答案: 要访问对象的字段或方法,请使用dot : 如果将在运行时定义字段名称,请使用内置函数:

  • 我有一个包含如下值的对象 这些都在变量autossuggest中。现在我只想获得值 谢谢你的小费

  • 问题内容: 我有一个与此对象类似的对象: 我试图得到它的长度,问题是返回5而不是3(这是它的总项目数)。该数组相对较长(有1000x2000个项目),并且必须每秒执行很多次。我如何才能更有效地获取商品数量? 问题答案: 显然,除了kieran的回答外,现代浏览器还具有功能。在这种情况下,您可以这样做:

  • 我试图建立一个具有以下依赖关系的应用程序。 这是我在红帽网站上找到的一个例子-http://www.jboss.org/quickstarts/eap/helloworld-jms/ 我正在使用Netbeans 8.0.2。(还在dos和eclipse中使用Maven命令进行了尝试)我在构建时遇到了一个错误,下面是相同的日志: 我可以在以下路径找到文件: https://maven.reposit

  • 问题内容: 我遇到的烧瓶SQLAlchemy的一个问题,我可以设置对象的属性 place_collections ,但是当我想设置为对象属性 的地方 ,发生了错误: 如何设置联接搜索对象的属性,有人可以帮助我吗? 它们都是 “ flask_sqlalchemy.BaseQuery” 类。 模型 问题答案: 将返回您的对象集合。这类似于普通的香草SQLAlchemy。 但是,从SQLAlchemy