如何根据命令行参数值

时间:2016-07-01 14:30:54

标签: soapui

在我们的组织中,我们使用SOAP UI 5.2.1(开源)。我们有一个soapui-project文件,如下所示

Project1.xml:

  Test Suite 1 (Smoke, Functional, Regression)
  Test Suite 2 (Functional)
  Test Suite 3 (Smoke, Functional)
  Test Suite 4 (Regression)

相同的Project1.xml文件将用于Smoke,Functional和Regression测试。目前,所有套件都适用于所有类型的测试,这非常耗时。

有没有办法从命令行传递参数,并且应该运行相应的测试套件

如果我的运行命令类似于" testrunner Project1.xml",则只运行带有功能标记的测试套件

  1. 如何标记上面提供的每个tets套件
  2. 接受运行模式值的run命令应该是什么。
  3. 我们还能以其他方式实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

在三个位置创建类别标记:每个测试都将使用名为categories的属性中的类别进行标记。然后在项目级别,我们要指定属性includeCategoriesexcludeCategories,它们将分别列出要包括的类别和要排除的类别。其中每个都只是一个以逗号分隔的列表。必须将以下脚本复制为每个测试用例中的启动脚本。如果您为许可证支付500美元,那么您只需要将此脚本作为自定义事件一次 - 我讨论了here

def testCategories = []
def excludeCategories = []
def includeCategories = []

def tstCats = testRunner.testCase.getPropertyValue("categories")
def exCats = testRunner.testCase.testSuite.project.getPropertyValue("excludeCategories")
def inCats = testRunner.testCase.testSuite.project.getPropertyValue("includeCategories")

if(tstCats != null) tstCats.split(',').each { testCategories << it.trim() }
if(exCats != null) exCats.split(',').each { excludeCategories << it.trim() }
if(inCats != null) inCats.split(',').each { includeCategories << it.trim() }

前三行各自定义一个空列表。接下来的三行读取所有属性,最后三行解析它们。上面的代码期望categories属性只指定类似:category1,category2等 - 没有引号,没有括号。

首先让我们处理排除类别。这些的含义通常是,如果测试用其中任何一个标记,请不要运行它。

// exclude categories
excludeCategories.each {
    if(testCategories.contains(it))
        testRunner.cancel("${context.testCase.name} TestCase cancelled; excludeCategory = ${it}!")
}

现在包括类别。这些的含义是,如果未标记测试,请跳过它。只有当测试标记有其中任何一个时,才运行它。

// include categories
if(includeCategories.size() != 0) {
    def cancelTest = true
    includeCategories.each {
        if(testCategories.contains(it))
            cancelTest = false
    }

    if(cancelTest)
        testRunner.cancel("${context.testCase.name} TestCase cancelled; includeCategories = ${includeCategories}!")
}

答案 1 :(得分:0)

以下是我将如何处理它。

使用系统参数(testrunner)通过命令行(对于-Darg="value"实用程序)获取用户输入,并且我们仅根据输入启用套件,并禁用其余的套房。

话虽如此,要仅执行回归,请使用-DEXECUTION_GROUP="Regression"

对于每个测试套件,创建一个自定义属性,比如EXECUTION_GROUP并根据需要定义值。说:

测试套件1:属性名称EXECUTION_GROUP,值为Smoke,Functional,Regression 测试套件2:属性名称EXECUTION_GROUP,值为Functional
测试套件3:属性名称EXECUTION_GROUP,值为Smoke,Functional
测试套件4:属性名称EXECUTION_GROUP,值为Regression

现在,双击项目,您会在下方的右侧找到Load Script按钮。 并将以下脚本添加到其中,然后保存项目。

该脚本有什么作用?

此脚本将System属性称为EXECUTION_GROUP作为命令行选项,并根据用户输入自动切换到测试套件
如果找到列表仅启用那些套件,则禁用其余套件,否则。
如果未在命令行中设置或未传递系统属性,则启用所有套件。

项目加载脚本

/**
* this script reads System property say EXECUTION_GROUP as command line options
* and toggle to test suites according to the user input
* if list is found enable the suite, disable it otherwise.
* if system property is set, then all the suites are enabled
**/ 
//Below closure toggle the suite based on the list of names
def toggleSuite = { suite, list ->
   def groups = suite.getPropertyValue('EXECUTION_GROUP').split(',').collect{it.trim()}
   def isGroupFound = false
   list.each { group -> 
      if (groups.contains(group)) {
          isGroupFound = true
      }
   }
   if (!isGroupFound) {
      suite.disabled = true
   } else {
      suite.disabled = false
   }    
}

//Reads the system property
def userInput = System.getProperty('EXECUTION_GROUP')
log.info "Command line input: $userInput"
def cmdLineOptions = []

//Checks if the user provided value is null i.e., system property not set
if (null != userInput) {
    cmdLineOptions = userInput.split(',').collect{it.trim()}
    if (null != cmdLineOptions) {
        log.info "User has provided the execution group as input"
        log.info cmdLineOptions
        project.testSuiteList.each { suite -> toggleSuite(suite, cmdLineOptions) }
    } else {
        log.info "Receieved empty list of options, so disabling all the suites"
        project.testSuiteList.each { suite -> suite.disabled = true }
    }
} else {
    log.info "All suites are being enabled as no system property input found"
    project.testSuiteList.each { suite -> suite.disabled = false }
}

如何使用命令行?

我相信你知道如何调用项目命令行(基于问题),即使用SOAPUI_HOME / bin的testrunner.bas / .sh。

在调用testrunner实用程序时,最后添加EXECUTION_GROUP作为系统参数。
例如,要执行冒烟和功能组,请在命令末尾添加-DEXECUTION_GROUP="Smoke,Functional"

因此,命令可能如下:
testrunner.bat <options> project.xml -DEXECUTION_GROUP="Smoke,Functional"

您会在日志中看到正在调用哪些组(请参阅上述脚本中的日志语句)。

那么,我如何在SoapUI中测试以上内容?

上述行为仅适用于命令行执行,符合作者问题中的请求。然后你可能会想,当你在SoapUI中运行时会发生什么?你是对的,当你从SoaUI运行时,它的行为不会相同。原因是它没有获得系统参数EXECUTION_GROUP值。通常你可能不需要它,但你如何意识到这是否有效,可能你想在使用前测试它。

但是如果你想在SoapUI中拥有相同的行为,那就有一个技巧。也就是说,只需在顶部添加以下语句(设置系统参数,请注意,此语句应限于测试,否则将失败实际目的并在测试后取消注释System.setProperty('EXECUTION_GROUP', 'Smoke')并运行脚本。

你会看到不需要的测试组被禁用。

enter image description here