在使用 TestNg 框架执行 Citrus 测试用例时无法获取 Citrus TestContext 对象

Unable to get citrus TestContext object while to TestNg frame work to execute Citrus test cases

我正在使用 TestNg 框架来执行 citrus 框架测试用例。在下面的代码中,我无法让柑橘文本上下文对象在执行测试用例时出错

import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.consol.citrus.annotations.CitrusResource;
import com.consol.citrus.annotations.CitrusXmlTest;
import com.consol.citrus.context.TestContext;
import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;
public class GenricTest extends TestNGCitrusTestRunner {
    static 
    {
      System.setProperty("citrus.spring.application.context", "file:G:\Citrus\citrus-context.xml");
    }
     @Test @Parameters("context")
    @CitrusXmlTest(packageScan = "file:C:\xitrus")

    public void CitrusTest(@Optional @CitrusResource TestContext context) 
    {

    }
}

在执行上面的代码以获取柑橘文本上下文对象时,出现以下错误

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Unsupported type parameter : class com.consol.citrus.context.TestContext
    at org.testng.internal.Parameters.convertType(Parameters.java:318)
    at org.testng.internal.Parameters.createParameters(Parameters.java:203)
    at org.testng.internal.Parameters.createParameters(Parameters.java:443)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:569)
    at org.testng.internal.Invoker.handleParameters(Invoker.java:1308)
    at org.testng.internal.Invoker.createParameters(Invoker.java:1036)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1126)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

我不知道您在 Citrus 上下文中配置了什么,所以我将发布一个完整的示例。

Citrus 测试 运行 使用 TestNG,但 Citrus 本身是一个 Spring 应用程序。这意味着您可以像在 Spring 应用程序中那样在配置 class 中配置 Bean,然后您可以使用 @Autowired 访问测试中的 bean。

这是一个配置示例 class,我在其中配置了测试所需的 bean:

@Import({})// you can import more configuration classes here
public class CitrusConfiguration {

    @Value("${inbound.service.url}")
    private String serviceUrl;
    @Value("${external.api.mock.port}")
    private int externalApiMockPort;

    @Bean
    public HttpClient inboundClient() {
        return CitrusEndpoints.http()
                .client()
                .requestUrl("http://" + serviceUrl)
                .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .build();
    }

    @Bean
    public HttpServer externalApiMock() {
        return CitrusEndpoints.http()
                .server()
                .port(externalApiMockPort)
                .autoStart(true)
                .timeout(10000)
                .build();
    }
}

之后,我们需要告诉 Citrus 哪个 class 是 属性 文件中的主要配置 class,如下所示:src/test/resources/citrus-application.properties

citrus.spring.java.config=<your.package>.CitrusConfiguration

现在我们可以编写这样的测试:

@Test
public class InboundApiControllerIT extends TestNGCitrusTestRunner {

    @Autowired
    private HttpClient httpClient;

    @CitrusTest
    public void okTest() {

        http(action -> action.client(httpClient)
                .send()
                .post("/inbound")
                .payload("{" +
                        "\"userName\": \"Bruce.Wayne\"," +
                        "\"operation\": \"call-a-pizza\"" +
                        "}"));

        http(action -> action.client(httpClient)
                .receive()
                .response(HttpStatus.OK)
                .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .payload("{" +
                        "\"success\": true" +
                        "}"));
    }
}

请不要使用 static 块来配置 Citrus(或一般的任何东西)并使用如上所述的设置。如果documentation cannot help you, you can always check the samples here.

Citrus 测试组件在测试中非常灵活,因此您不需要动态更改它们的任何配置值。我也不建议这样做。如果您需要更改无法在测试操作中显式配置的测试组件(如 HttpClient)中的任何内容,那么我建议您使用该特殊配置创建一个新组件。