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

如何在命令行中使用SoapUI testrunner在另一个项目中运行testStep?

景宏盛
2023-03-14
  • Groovy测试步骤,用于设置WS特定属性并从testwsscript-soapui-project.xml调用通用脚本
  • 请求测试步骤调用webservice并执行断言
  • 正在结束Groovy测试步骤。

这可以在SoapUI中运行,但我希望从Windows命令行(用于自动化目的的批处理文件)运行测试。这里我遇到了一个问题:当从命令行调用testrunner时

set "SOAPUI_FOR_TEST_DIR=..\..\..\programs\SoapUI-5.6.0"    
"%SOAPUI_FOR_TEST_DIR%\bin\testrunner.bat" -sAutoTest -r -a -j -I "..\resources\WS1-soapui-project.xml"

它不会用所有的SoapUi项目加载整个工作区。因此,以下脚本(在ws1-soapui-project.xml/autotest suite/test TestCase中)应该从项目testwsscript-soapui-project.xml/autotest suite/test TestCase运行testStep返回Null(更具体地说,“不能对Null对象调用方法getProjectByName()”)

import com.eviware.soapui.model.project.ProjectFactoryRegistry
import com.eviware.soapui.impl.wsdl.WsdlProjectFactory

def workspace = testRunner.testCase.testSuite.project.workspace
def testProject = (workspace==null) ? 
  ProjectFactoryRegistry.getProjectFactory(WsdlProjectFactory.WSDL_TYPE).createNew("TestWSScript.xml") :
  workspace.getProjectByName("TestWSScript")
if(!testProject.open && workspace!=null) workspace.openProject(testProject)


// Connect to the test step in another project.
def prj = testRunner.testCase.testSuite.project.workspace.getProjectByName('TestWSScript')
tCase = prj.testSuites['AutoTest'].testCases['Test']
tStep = tCase.getTestStepByName("Run")

// Call the test runner and check if it can run the specified step.
def runner = tStep.run(testRunner, context)

有没有办法实现我们想要的?我们使用的是SOAPUI-5.6.0的免费版本。提前谢了。

共有1个答案

宇文念
2023-03-14

以下是我对你的建议。

  • 与其为一个groovy脚本创建一个单独的项目,不如从中创建一个库。
  • 根据需要创建类和方法。如果从调用方传递数据,请使用方法参数或类成员。
  • 使用现有脚本,将它们转换为类、方法。
  • 根据需要创建类。
  • 它可以被编程为JavaGroovy
  • 编译类并创建库
  • 将此库复制到%SOAPUI_HOME%\bin\ext目录下
  • 现在您可以在任何项目中调用这些方法。不需要更多的虚拟项目。
  • 好在所有的项目都是独立的。

以下是由Rupert Anderson创建的博客内容,他是SoapUI的导出者和作者之一。

Steps

1.Create the following directory structure

soapuilib/src/main/groovy/custom

2.Get some Groovy code

For this example, I have knocked together a simple script to generate sequential ids. It may be of little practical use, but I wanted something with a simple public static method to call. Since the method is static, there will be no need to instantiate the class before calling it in step #8.

[groovy title=”SequentialIdGenerator.groovy”]
package custom

import java.util.concurrent.atomic.AtomicLong

public class SequentialIdGenerator {
public static final long counterSeed = 1000
public static final String prefix = "id"
private static AtomicLong counter = new AtomicLong(counterSeed)

public static String nextId() {
return prefix + counter.incrementAndGet()
}
}
[/groovy]

    create the above script as a text file called SequentialIdGenerator.groovy
    copy it to soapuilib/src/main/groovy/custom

3.Create Gradle build script

For this part, there are plenty of options to build the code and package it, such as Maven, Ant or just running the right shell commands! The following minimal Gradle script allows us to compile and package the code as a jar in one easy statement.

[code language=”groovy”]
apply plugin: ‘groovy’

version = ‘1.0’

jar {
classifier = ‘library’
manifest {
attributes ‘Implementation-Title’: ‘SoapUI Sample Groovy Library’, ‘Implementation-Version’: version
}
}

repositories {
mavenCentral()
}

dependencies {
compile ‘org.codehaus.groovy:groovy:2.1.7’ //Matches Groovy in SoapUI 5.2.1
}

[/code]

    Create the above Gradle script as soapuilib/build.gradle

INFO: Groovy Version – (At time of writing) The current version of Groovy is v2.4.6, but SoapUI 5.2.1 ships with Groovy 2.1.7. If you try to compile with a Groovy version 2.3+ and use it with SoapUI, you will see an error popup and log message in like ‘org/codehaus/groovy/runtime/typehandling/ShortTypeHandling‘ – see http://glaforge.appspot.com/article/groovy-2-3-5-out-with-upward-compatibility for more details and options. Basically, you can still use the latest Groovy version, but will need to include an additional groovy-backports-compat23 dependency!

5.Compile it & Create jar file

Now we’re ready to use the Gradle script to compile the sample script from step #2 and package it as a jar file.

    Open a shell/command prompt at soapuilib/
    gradle clean build jar

You should then see output like:

[bash]

tests-MacBook-Pro:soapuilib test$ gradle clean build jar
:clean
:compileJava UP-TO-DATE
:compileGroovy
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestGroovy UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 5.499 secs

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.12/userguide/gradle_daemon.html

[/bash]

and our new library jar file created under the directory:

soapuilib/build/soapuilib-1.0-sample.jar

6.Add jar file to SoapUI

To make our new Groovy library jar available for use in SoapUI, it should be added in SoapUI Home under the following external library directory:

SoapUI ext Directory

Or the Windows equivalent e.g. C:\Program Files\SmartBear\SoapUI-5.2.1\bin\ext

7.Verify jar file is imported

When SoapUI is restarted, you should see the following log entry indicating that the jar file has been successfully added to the SoapUI classpath:

SoapUI ext Lib Loaded
8.Call the code

Our SequentialIdGenerator has a public static method nextId() that we can call, so to do this we can either import the class (Example 1)  or just prefix the class with its package (Example 2). See below:

    Example 1 – Call from Groovy TestStep:

[code]
import custom.*

log.info SequentialIdGenerator.nextId()
[/code]

Gives output like:

[code]

Thu May 12 16:49:20 BST 2016:INFO:id1001

[/code]

    Example 2 – Call from Property Expansion:

[code]

${= custom.SequentialIdGenerator.nextId()}

[/code]
<script src="https://gist.github.com/nmrao/c489a485bbe3418cf49d8442f9fb92eb.js"></script>
 类似资料:
  • 问题内容: 我有一个Java项目,可以在Eclipse上正常运行。现在,我需要使用命令行来运行它,例如java classpath …如何在Eclipse中基于存储的类路径来设置该类路径。 问题答案: 只需导航到类文件所在的目录并使用 编辑:您可以将替换为任何类路径。例如,要查找您的类路径,可以使用 编辑:看起来像有相当多的信息,可以帮助你在这里。

  • 我这里有一个小问题:使用MAVEN和Cucumber运行这个项目。 在我的MAVEN项目中,我采用以下结构: 类如下所示: 类类似于以下内容: 我试着跑: 而且它不起作用。 我想使用Maven运行这些测试,并知道是否有可能设置cucumber测试的执行顺序。 我试图在@CucumberOptions中定义功能参数,但它不起作用! 和 并尝试这样做(如其他帖子所建议的): 在surefire插件配置

  • 我在一个laravel项目中意外地运行了命令,该命令显然删除了autoload_real.php 我得到这些错误消息时,运行: “PHP警告:require(C:\xampp\htdocs\e-commerce\vendor\composer/。/symfony/polyfill ctype/bootstrap.PHP):无法打开流:第66行的C:\xampp\htdocs\e-commerce\

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。

  • 在阅读了多篇关于这个主题和Gradle手册的文章后,我正在尝试运行下面的代码块。我运行下面的命令并得到以下错误:execCommand==null! 关于我在下面的代码块中做错了什么有什么想法吗?

  • 问题内容: 我创建了一个独立的Java应用程序,试图在Ubuntu 10.04终端中使用“ cd”命令更改目录。我使用了以下代码。 但是上面的代码给出了以下错误 谁能告诉我如何实施? 问题答案: 没有称为的可执行文件,因为它 不能 在单独的进程中实现。 问题在于,每个进程都有自己的当前工作目录,将其实现为一个单独的进程只会更改 该 进程的当前工作目录。 在Java程序中,您 不能 更改当前的工作目