在使用 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)中的任何内容,那么我建议您使用该特殊配置创建一个新组件。
我正在使用 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)中的任何内容,那么我建议您使用该特殊配置创建一个新组件。