SoapUI API - 设置TestCase属性

时间:2014-05-23 11:03:19

标签: properties jython soapui

我试图在jython中使用SoapUI API(修改SoapUILibrary for Robot Framework),不知怎的,我无法找到任何方法来设置Property TestStep的属性。

使用

轻松设置项目,全局和系统属性

SoapUITestCaseRunner.setProjectProperties()

from com.eviware.soapui.tools import (SoapUITestCaseRunner)
from com.eviware.soapui.tools import (SoapUIMockServiceRunner)

from robot.api import logger

class SoapUILibrary2:
    """ The main class of the library """

    ROBOT_LIBRARY_SCOPE = 'TEST CASE'
    ROBOT_LIBRARY_VERSION = '0.2'

    def __init__(self):
        self.__runner = None
        self.__mockrunner = None
        self._project_properties = []

    def soapui_project(self, prj):
        """ Initialize the runner and set the project string """
        self.__runner = SoapUITestCaseRunner()
        self.__runner.setProjectFile(prj)

    def soapui_suite(self, s):
        """ Set the suite string """
        self.__runner.setTestSuite(s)

    def soapui_case(self, c):
        """ Set the test case string """
        self.__runner.setTestCase(c)

    def soapui_set_project_property(self, *properties):
        """ Sets project properties for the current test run. (...)
        """
        for prop in properties:
            if len(prop.split('=')) == 2:
                self._project_properties.append(prop)
            else:
                logger.warn("Skipping property: '%s'. Properties must be specified as: key=value" % prop)
        try:
            self.__runner.setProjectProperties(self._project_properties)
        except AttributeError:
            logger.warn('No project set. Cannot set project properties.')

SoapUITestCaseRunner类不包含任何访问testSteps的方法......

我找到了一些如何在groovy中解决这个问题的例子,但是可以使用SoapUI API设置这样的属性吗?

编辑:

添加库的完整代码。它被导入到机器人框架中并用作关键字。

http://tny.cz/34882261

1 个答案:

答案 0 :(得分:0)

在SOAPUI中,您可以定义project,testCase和testSuite的属性,也可以生成特殊类型的testStep(Properties TestStep),但是您无法在特定的testStep上定义属性(即on SOAP TestStep)。您可以查看有关here

的更多信息

但是,您可以在testSteps中使用project,testCase或testSuite中的属性,这样您就可以在项目级别定义属性,然后在testStep中使用它。我无法提供更具体的信息,因为我不确切知道您要实现的目标。

编辑:

我不知道具体的jython语法但是如果您有项目文件(我在您的示例中看到)您可以通过com.eviware.soapui.impl.wsdl.WsdlProject访问特定的testStep,我给您一个groovy脚本作为示例:

import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.WsdlTestSuite;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep

def prj = new WsdlProject(path_prj_file,null);
def tsuite = prj.getTestSuiteByName("TestSuiteName");
def tcase = tsuite.getTestCaseByName("TestCaseName");
def tstep = tcase.getTestStepByName("TestStep");

编辑2:

我下载了jython独立版本2.5.3并使用soapui 5.0.0并且适用于我:

<强> hw.py

from com.eviware.soapui.tools import (SoapUITestCaseRunner)
from com.eviware.soapui.tools import (SoapUILoadTestRunner)
from com.eviware.soapui.tools import (SoapUIMockServiceRunner)

from com.eviware.soapui.impl.wsdl import (WsdlProject)
from com.eviware.soapui.impl.wsdl import (WsdlTestSuite)
from com.eviware.soapui.impl.wsdl.testcase import (WsdlTestCase)
from com.eviware.soapui.impl.wsdl.teststeps import (WsdlTestRequestStep)

import thread

class SoapUI2:
    """ The main class of the library """

    ROBOT_LIBRARY_SCOPE = 'TEST CASE'
    ROBOT_LIBRARY_VERSION = '0.2'

    def __init__(self):
        self.__runner = None
        self.__mockrunner = None
        self._project_properties = []
        self.__prj = WsdlProject('C:\soapui_project.xml', None)
        self.__tsuite = self.__prj.getTestSuiteByName("myTestSuite")
        self.__tcase = self.__tsuite.getTestCaseByName("myTestCase")
        self.__tstep = self.__tcase.getTestStepByName("myTestStep")
        t = self.__tstep.getPropertyValue("Value")
        print "Works ok"


    def soapui_project(self, prj):
        """ Initialize the runner and set the project string """
        self.__runner = SoapUITestCaseRunner()
        self.__runner.setProjectFile(prj)

    def soapui_multiproject(self, prj):
        """ Initialize the runner and set the project string """
        self.__runner = SoapUILoadTestRunner()        
        self.__runner.setProjectFile(prj)

    def soapui_suite(self, s):
        """ Set the suite string """
        self.__runner.setTestSuite(s)

    def soapui_case(self, c):
        """ Set the test case string """
        self.__runner.setTestCase(c)

    def soapui_set_project_property(self, *properties):
        """ Sets project properties for the current test run.
        This assumes that you have already initialized the project via
        the `SoapUI Project` keyword.

        `properies` may contain multiple statements, and each must be specified as: key=value.

        This is useful to data drive your existing SoapUI tests via property expansion.
        For more information see: http://www.soapui.org/Scripting-Properties/property-expansion.html

        Example:
        | SoapUI Project | My Project |
        | SoapUI Set Project Property | ServiceEndpoint=https://staging.company.com | # set a single property |
        | SoapUI Set Project Property | CustomProperty=foo | AnotherProperty=bar | # or set multiple properties |
        """
        for prop in properties:
            if len(prop.split('=')) == 2:
                self._project_properties.append(prop)
            else:
                logger.warn("Skipping property: '%s'. Properties must be specified as: key=value" % prop)
        try:
            self.__runner.setProjectProperties(self._project_properties)
        except AttributeError:
            logger.warn('No project set. Cannot set project properties.')



    def soapui_set_multiproject_threads(self, t):
        """ Sets number of threads to run in load test """
        self.__runner.setThreadCount(long(t))
        logger.info("Running with %s threads at once." % t)

    def soapui_run(self):
        """ Run the runner and report to Robot """
        logger.info("Running with the following project properties set: %s" % self._project_properties)
        if not self.__runner.run():
            raise AssertionError('FAIL: failed to run')

        if self.__runner == SoapUITestCaseRunner():
            n = self.__runner.getFailedTests().size()
            if n != 0:
                raise AssertionError('FAIL: ' + str(n) + ' tests failed')

    def soapui_start_mock_service(self, p, m):
        """ Runs a mock service """
        try:
            self.__mockrunner = SoapUIMockServiceRunner()
            self.__mockrunner.setProjectFile(p)
            self.__mockrunner.setMockService(m)
            self.__mockrunner.setBlock(False)
            self.__mockrunner.run()
        except Exception, e:
            raise AssertionError('FAIL: Error running the mock service ' + m + '. Reason: ' + str(e))

    def soapui_stop_mock_service(self):
        """ Stops the mock service """
        self.__mockrunner.stopAll()

    def soapui_set_step_property(self, s, p,v):
        testStep = self.__runner.testCase.getTestStepByName(s)
        testStep.setPropertyValue(p,v)


if __name__ == "__main__":
    SoapUI2().__init__()

cmd行执行:

java -classpath "jython-standalone-2.5.3.jar;C:\Programari\SoapUI-5.0.0\lib\*;C:\Programari\SoapUI-5.0.0\bin\*" org.python.util.jython hw.py

执行结果:

2014-05-27 12:43:09,058 [main] WARN com.eviware.soapui.SoapUI - Could not find jfxrt.jar. Internal browser will be disabled. 12:43:09,589 WARN [SoapUI] Missing folder [C:\temp\ext] for external libraries 12:43:09,964 INFO [DefaultSoapUICore] initialized soapui-settings from [C:\Documents and Settings\aciffone\soapui-settings.xml] 12:43:09,995 INFO [HttpClientSupport$Helper] Initializing KeyStore 12:43:11,682 INFO [WsdlProject] Loaded project from [file:/C:/soapui_project.xml] Works ok

希望这有帮助,