我在工作中写了一个Web服务,现在我想写一些测试。我很怀疑如何测试它们,但我知道我需要哪些工具:JUnit 4,也许是嵌入式应用程序容器,例如Tomcat,还有Jersey Client。不过,在这里你是我的方法:
创建一个启动嵌入式应用程序容器(Tomcat)的测试类。然后,将Web服务部署到它并使用Jersey Client进行测试调用。到目前为止,这是我做到的方式。问题出在这里:要部署Web服务,我必须先创建WAR。这是一个问题,因为在使用Maven构建应用程序时,首先执行测试,然后构建WAR;我认为这实际上是一个循环。是否可以在不需要战争的情况下部署我的webapp?在这里,您是我的测试班:
public class TestAutenticacionService {
private final String mWorkingDir = "C://Users//Asasa//workspace//myWebApp//";
private Tomcat tomcat = null;
private WebTarget webTarget = null;
private ObjectMapper mapper = new ObjectMapper();
private Long idClienteCorrecto = 787538L;
@Before
public void setUp() throws Exception {
tomcat = new Tomcat();
tomcat.setPort(9090);
tomcat.setBaseDir(mWorkingDir);
tomcat.getHost().setAppBase(mWorkingDir);
tomcat.getHost().setAutoDeploy(true);
tomcat.getHost().setDeployOnStartup(true);
tomcat.getServer().addLifecycleListener(new VersionLoggerListener());
tomcat.getHost().addLifecycleListener(new HostConfig());
try {
tomcat.addWebapp("/bidegiWsCli", "C:/Users/Asasa/workspace/myWebApp/myWebApp.war");
tomcat.start();
System.out.println("Tomcat iniciado en " + tomcat.getHost());
webTarget = buildClientWs();
} catch (LifecycleException e) {
System.err.println("Tomcat no se pudo iniciar.");
e.printStackTrace();
}
}
@After
public void tearDown() throws Exception {
if(tomcat != null){
try {
tomcat.stop();
System.out.println("Tomcat parado.");
} catch (LifecycleException e) {
System.err.println("Error al intentar parar Tomcat.");
e.printStackTrace();
}
}
}
@Test
public void test() {
WebTarget loginTgt = webTarget.path("login");
// Probamos un login correcto:
WebTarget loginTgtOk = loginTgt.queryParam("Aus", "764577676t").queryParam("Pass", "****");
Response respOk = loginTgtOk.request(MediaType.APPLICATION_JSON).get();
String strLrOk = (String) respOk.readEntity(String.class);
try {
LoginResponse lrOk = mapper.readValue(strLrOk, LoginResponse.class);
Long idClienteOk = lrOk.getIdCliente();
assertEquals(idClienteOk, idClienteCorrecto);
} catch (Exception e) {
try {
mapper.readValue(strLrOk, ExceptionResponse.class);
assertTrue(true);
} catch (JsonParseException e1) {
System.err.println("Error JsonParseException: " + e1.getMessage());
e1.printStackTrace();
} catch (JsonMappingException e1) {
System.err.println("Error JsonMappingException: " + e1.getMessage());
e1.printStackTrace();
} catch (IOException e1) {
System.err.println("Error IOException: " + e1.getMessage());
e1.printStackTrace();
}
}
// Probamos un login incorrecto:
WebTarget loginTgtWrong = loginTgt.queryParam("Aus", "764577676t").queryParam("Password", "***");
Response respWrong = loginTgtWrong.request(MediaType.APPLICATION_JSON).get();
String strLrWrong = (String) respWrong.readEntity(String.class);
try {
LoginResponse lrWrong = mapper.readValue(strLrWrong, LoginResponse.class);
Long idClienteWrong = lrWrong.getIdCliente();
assertNotEquals(idClienteWrong, idClienteCorrecto);
} catch (Exception e) {
try {
mapper.readValue(strLrWrong, ExceptionResponse.class);
assertTrue(true);
} catch (JsonParseException e1) {
System.err.println("Error JsonParseException: " + e1.getMessage());
e1.printStackTrace();
} catch (JsonMappingException e1) {
System.err.println("Error JsonMappingException: " + e1.getMessage());
e1.printStackTrace();
} catch (IOException e1) {
System.err.println("Error IOException: " + e1.getMessage());
e1.printStackTrace();
}
}
}
private WebTarget buildClientWs(){
Client client = ClientBuilder.newClient();
return client.target("http://localhost:9090").path("myWebApp").path("resources").path("Auth");
}
}
另一种方法是直接执行Web服务方法,而不需要应用程序容器。我不确定这一点,因为我不会测试Web服务本身。
对此有何想法?
提前谢谢
答案 0 :(得分:2)
如果您正在尝试编写单元测试,那么只需创建模拟对象并仅测试您的方法。
但如果您的要求是测试整个webservice,那么您可以进行集成测试或使用Postman插件。
答案 1 :(得分:2)
如果您使用的是Jersey,那么您可以使用内置的测试框架。
请参阅https://jersey.java.net/documentation/latest/test-framework.html
答案 2 :(得分:0)
有多个选项不相互排斥:
组件测试。可以在没有HTTP流量的情况下编写测试。通过直接调用服务方法或使用Jersey的内存提供程序(其他框架通常具有自己的功能,如MockMVC附带的Spring MVC):
org.glassfish.jersey.test-framework.providers:球衣测试框架提供商-inmemory
系统测试。这将需要调用实际的HTTP请求。 Java世界中事实上的标准库是RestAssured - 它很好并且与框架无关(尽管对Spring MVC也有一些特殊的支持)。您必须运行应用程序一些方法 - 通过启动内存中的Jetty / Tomcat或通过外部脚本单独部署应用程序。此外,您可以尝试Arquillian专门为部署测试应用程序而创建(尽管我们已尝试过)。
使用单元和组件测试检查大多数逻辑通常是一个好主意,对系统测试留下一些粗粒度检查。你don't want进行了很多系统测试,因为它们运行起来要慢得多,而且难以维护。
答案 3 :(得分:0)
我认为您使用嵌入式Web服务器正确运行该服务。没错,您还没有验证包装到WAR / docker-image /中是否正确,但测试必须在级别上完成,并且在Web服务API级别上进行功能测试可以为您提供快速周转的宝贵反馈。
作为工具,我建议保持简单。 使用JUnit + http-matcher(https://github.com/valid4j/http-matchers)