繁体   English   中英

如何在Java中测试宁静的Web服务

[英]How to test a restful web service in java

我已经在工作中编写了Web服务,现在我想编写一些测试。 我对如何测试它们感到怀疑,但是我知道我需要哪些工具:JUnit 4以及嵌入式应用程序容器,例如Tomcat,以及Jersey Client。 不过,这是我的方法:

  1. 创建一个测试类,在其中启动嵌入式应用程序容器(Tomcat)。 然后,将Web服务部署到其中,并使用Jersey客户端进行测试调用。 到目前为止,这就是我这样做的方式。 问题来了:要部署Web服务,必须先创建WAR。 这是一个问题,因为在使用Maven构建应用程序时,首先执行测试,然后构建WAR; 我认为这实际上是一个循环。 是否可以在无需战争的情况下部署我的Web应用程序? 这是我的测试课:

     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"); } } 
  2. 另一种方法是直接执行Web服务方法,而无需应用程序容器。 我不确定,因为我不会测试Web服务本身。

有什么想法吗?

先感谢您

如果要编写单元测试,则只需创建模拟对象并仅测试方法。

但是,如果您的要求是整体测试Web服务,则可以进行集成测试或使用Postman插件。

如果您使用的是Jersey,则可以使用内置的测试框架。

参见https://jersey.java.net/documentation/latest/test-framework.html

有多个选项不是互斥的:

  • 组件测试。 无需HTTP流量就可以编写测试。 通过直接调用服务方法或通过使用Jersey的内存提供程序(其他框架通常具有其自身的功能,例如MockMVC附带的Spring MVC):

    org.glassfish.jersey.test-framework.providers:球衣测试框架-provider-内存

  • 系统测试。 这将需要调用实际的HTTP请求。 Java世界中的事实上的标准库是RestAssured-它很好并且与框架无关(尽管对Spring MVC也有一些特殊的支持)。 您必须以某种方式运行应用程序-通过启动内存中的Jetty / Tomcat或通过使用外部脚本单独部署应用程序。 您也可以尝试Arquillian ,它是专门为部署测试应用程序而创建的(尽管没有尝试过)。

通常,最好用单元和组件测试检查大多数逻辑,而将一些粗粒度的检查留给系统测试。 不希望进行许多系统测试,因为它们运行起来会慢得多,维护起来也会更加困难。

我认为使用嵌入式Web服务器运行该服务是正确的。 没错,您尚未验证打包到WAR / docker-image /其他文件中的内容是否正确,但是测试必须在各个级别进行,并且在Web Service API级别上进行功能测试可以快速周转,从而为您提供宝贵的反馈。

至于工具,我建议保持简单。 使用JUnit + http-matchers( https://github.com/valid4j/http-matchers

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM