0

SoapUI 内で、テスト ランナーの実行時にプロジェクトから環境を選択するためのダイアログ ボックスをユーザーに提示したいと考えています。

のイベントリスナーを追加しましたProjectRunListener.beforeRun。現在、そのイベントが発生すると、projectRunner提供されている次のことを実行するカスタム ライブラリがあります。

public static void SetEndpoints(ProjectRunner projectRunner, Logger log = null){
    if (projectRunner == null) {
        _Log(log, "Parameter 'projectRunner' cannot be null.");
        throw new Exception();
    }

    if (_RunOnce(projectRunner, "SetEndpoints")){
        _Log(log, "Begin - Util.SetEndpoints (Project)");

        def project = (Project)projectRunner.getProject();
        _SetEndpointsForTestSuites(project.getTestSuiteList(), log);

        _Log(log, "End - Util.SetEndpoints (Project - ${project.name})");
    }
}

public static void SetEndpoints(TestSuiteRunner testSuiteRunner, Logger log = null){
    if (testSuiteRunner == null) {
        _Log(log, "Parameter 'testSuiteRunner' cannot be null.");
        throw new Exception();
    }

    if (_RunOnce(testSuiteRunner, "SetEndpoints")){
        _Log(log, "Begin - Util.SetEndpoints (TestSuite)");

        def testSuite = (TestSuite)testSuiteRunner.getTestSuite();
        _SetEndpointsForTestSuites([testSuite], log);

        _Log(log, "End - Util.SetEndpoints (TestSuite - ${testSuite.name})");
    }
}

public static void SetEndpoints(TestCaseRunner testCaseRunner, Logger log = null){
    if (testCaseRunner == null) {
        _Log(log, "Parameter 'testCaseRunner' cannot be null.");
        throw new Exception();
    }

    if (_RunOnce(testCaseRunner, "SetEndpoints")){
        _Log(log, "Begin - Util.SetEndpoints (TestCase)");

        def testCase = (TestCase)testCaseRunner.getTestCase();
        _SetEndpointsForTestCases([testCase], log);

        _Log(log, "End - Util.SetEndpoints (TestCase - ${testCase.name})");
    }
}

private static void _SetEndpointsForProject(Project project, Logger log = null){

    _SetEndpointsForTestCases(project.getTestSuiteList(), log);
}

private static void _SetEndpointsForTestSuites(List<TestSuite> testSuites, Logger log = null){
    def testCases = [] as List<TestCase>;
    testSuites.each{
        testCases.addAll(it.getTestCaseList() as List<TestCase>);
    };

    _SetEndpointsForTestCases(testCases, log);
}

private static void _SetEndpointsForTestCases(List<TestCase> testCases, Logger log = null){
    // Get all test request steps
    //def testSteps = testCase.getTestStepList();
    def testSteps = [] as List<HttpRequestTestStep>;
    testCases.each {
        testSteps.addAll(it.getTestStepsOfType(RestTestRequestStep.class) as List<HttpRequestTestStep>);
    }

    // Loop across test request steps
    def stepMap = [:]
    testSteps.each {
        Interface iface = it.getInterface();
        if (stepMap[iface.name] == null){

            List<String> endpointList = Arrays.asList(iface.getEndpoints()) as List<String>;
            if ((endpointList != null) && (endpointList.size() > 0)) {
                def selection = JOptionPane.showInputDialog(null, "Select an endpoint:",
                    iface.name, JOptionPane.QUESTION_MESSAGE, null,
                    endpointList as String[], endpointList[0]).toString();

                if (selection == null){
                    stepMap.put(iface.name, "IGNORE");
                    _Log(log, "User cancelled endpoint selection for interface ${iface.name}");
                }
                else {
                    stepMap.put(iface.name, selection);
                    _Log(log, "User selected endpoint '${selection}' for interface ${iface.name}");
                }
            }
        }

        // Set endpoint
        if (stepMap[iface.name] != "IGNORE"){
            it.getHttpRequest().setEndpoint(stepMap[iface.name]);
        }
    }
}

private static boolean _RunOnce(TestRunner runner, String methodName){
    def context = runner.getRunContext();
    if (context.getProperty(methodName) != null)
        return false;

    context.setProperty(methodName, methodName);
    return true;
}

private static void _Log(Logger log, Object message){
    if (log != null){
        log.info message;
    }
}

スクリプトは、プロジェクト、TestSuite、または TestCase から TestRunner を指定すると、実行する各テスト リクエスト ステップのすべてのインターフェイスを見つけて、そのテスト ケースに使用するエンドポイントを選択するようユーザーに問い合わせます。インターフェイスごとに 1 回だけユーザーにクエリを実行し、既に実行されている場合はユーザーにクエリを実行しません(チェック対象の実行コンテキスト内にフラグを配置することで判断できます)。

イベント内:ProjectRunListener.beforeRun私はこれを呼び出します:

Util.SetEndpoints(projectRunner, log);

event: 内で、TestSuiteRunListener.beforeRunこれTestRunListener.beforeRun を呼び出します:

Util.SetEndpoints(testRunner, log);

したがって、ユーザーがテスト ランナーを開始するレベルに関係なく、使用する各インターフェイスのエンドポイントを選択するためのダイアログが表示されます。

これは、代わりに環境選択を使用して、より良い方法で実行できると思います。API 内で、プロジェクト レベルで環境を設定できることがわかります。これにより、すべてのインターフェイス エンドポイントが、特定のアクティブな環境に適切な値に設定される可能性があります。ただし、利用可能なすべての環境のリストを取得する方法がわかりません。API 内の Project オブジェクトには がありますが.setActiveEnvironment()、環境のリストの取得については何も言及されていません。

Project オブジェクトが与えられた場合、構成されたすべての Environments のリストを取得する方法を知っている人はいますか?

4

1 に答える 1