如何使用Java开始测试RESTful Web服务?

时间:2016-02-11 16:05:40

标签: java eclipse testing

我想要测试此网络服务http://qa-takehome-creyzna.dev.aetion.com:4440。我有身份验证详细信息(用户名和密码),该服务具有以下端点:/login, /user/, /user/{id} and /user/search。对于除/ login之外的所有端点,需要将授权令牌作为HTTP头传递。

该服务公开一个登录端点(/ login),该端点接受带有两个参数的POST请求:用户名和密码。成功登录后,将返回一个身份验证令牌,该令牌必须用于向服务发出其他请求。例如,如果请求如下,

{
  "username": "admin",
  "password": "admin"
}

它可能会返回{ "token": "1234-0009-999" }并且此令牌将需要提出额外请求。

我需要对Web服务进行身份验证,创建10个用户,然后检索该信息以验证用户是否已正确创建。我想在Eclipse中开发一个测试计划并实现。我该如何开始?

2 个答案:

答案 0 :(得分:2)

Web服务基本上是Java Servlet的扩展,其中输入处理得更多,输出很少是HTML页面。

Netbeans有一个关于如何建立Web服务的优秀教程,如果您遵循它,您可以在一小时内运行基本的Web服务。

https://netbeans.org/features/java-on-server/web-services.html

不要被认为必须使用一个IDE(我喜欢netbeans,但其他人没有)或其他IDE。花哨的GUI工具只是编写可能使用其他普通Java工具的普通Java类(如果使用XML等,则使用JAXB)。

Web服务不仅仅是接受特定类型请求的Web服务器,而是响应特定类型的响应。在Java中,通过利用Servlet使Web服务器更易于使用。 Servlet的内部内容看起来像

Unpack the request
Validate the request is complete, report an error response if not
Act on the reqeust
Generate a response in the appropriate format
Send the response back as the reply.

---根据要求编辑---

对不起,对我来说这似乎太明显了。让我填补空白。很抱歉对细节进行了修饰。

public class MockHttpServletRequest implements HttpServletRequest {
   @Override
   public String getAuthType() {
      throw new UnsupportedOpertationException("unexpected method use");
   }

   @Override
   public String getContextPath() {
      throw new UnsupportedOpertationException("unexpected method use");
   }

   ... repeat for all methods ....
}

public class ItemRequestWithBadEncoding extends MockHttpServletRequest {

   @Override
   public String getMethod() {
      return "GET";
   }

   @Override
   public String getHeader(String name) {
      if ("content-type".equals(name)) {
         return "text/plain-ish"; // this is not a mime-type
      }
      throw new IllegalArgumentException(String.format("this mock doesn't support %s", name);
   }

   ... fill out the rest of the required request details ...
}

public class CapturingServletResponse implements HttpServletRespose {
   private final ArrayList<Cookie> cookies = new ArrayList<Cookie>();

   @Override
   public void addCookie(Cookie cookie) {
      cookies.add(cookie);
   }

   public List<Cookie> getCookies() {
      return Collections.unmodifiableList(cookies);
   }

   ... override other methods and capture them into per-instance fields
       with ability to return unmodifiable references or copies to them ...
}

现在回到测试框架

@Test
public void testItemFetch() {
    try {
       MockRequest request= ItemRequestWithBadEncoding();
       CapturingServletResponse response = new CapturingServletResponse();

       Servlet itemRequestServlet = new ItemRequestServlet();
       itemRequestServlet.service(request, response);

       Assert.assertEquals("unexpected cookies in response", 0, response.getCookies().size());
       ... other asssertations ....
    } catch (Exception e) {
       Assert.assertFail(String.format("unexpected exception: %s", e.getMessage());
    }
}

根据您关注的项目以及您需要投入多少工作,您可以充实所需的捕获部分,并可能参数化和优化构建输入处理的方式。

答案 1 :(得分:-1)

研究spring框架。 它们与Mockito和Junits等其他测试框架配合得很好。 使用类似SpringMVCTest或SpringRestAssured的东西,注意RestAssured会让你编写集成测试。

阅读thisthis