如何在java中测试一个宁静的Web服务

时间:2016-06-17 10:36:31

标签: java web-services testing junit jersey

我在工作中写了一个Web服务,现在我想写一些测试。我很怀疑如何测试它们,但我知道我需要哪些工具:JUnit 4,也许是嵌入式应用程序容器,例如Tomcat,还有Jersey Client。不过,在这里你是我的方法:

  1. 创建一个启动嵌入式应用程序容器(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");
        }
    
    }
    
  2. 另一种方法是直接执行Web服务方法,而不需要应用程序容器。我不确定这一点,因为我不会测试Web服务本身。

  3. 对此有何想法?

    提前谢谢

4 个答案:

答案 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