【问题标题】:How to start testing a RESTful web service using Java ? [duplicate]如何开始使用 Java 测试 RESTful Web 服务? [复制]
【发布时间】:2016-02-11 16:05:39
【问题描述】:

我有这个网络服务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 中实现。我该如何开始?

【问题讨论】:

标签: java eclipse testing


【解决方案1】:

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

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

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

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

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());
    }
}

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

【讨论】:

  • 天哪,老家伙别吓唬小伙子了,我相信用户只想知道如何用“java”“测试”而不是实现休息服务(理论:+1。
  • 我没有得到答案,所以这很有用。如何开始编写上述测试计划?
  • @Arefe 我举了一个例子来向你展示如何在不需要 servlet 容器的情况下对 servlet 进行单元测试。这有点打字,但它是相当容易的工作。享受
  • @ Edwin Buck,感谢您的回答,非常感谢。我的测试经验为零,我想开始。 1. 我应该把 URL 信息放在哪里以及如何使用用户名和密码来验证它们? 2.您使用哪个框架来完成这项工作?我可能会通过他们的教程。 3. 我知道这是打字,对于有多年编程经验的人来说可能很明显。我想做什么我在问题的最后一段中提供。如果可能,您可以提供更多代码用于学习目的。
  • @Arefe 对于您想要进行单元测试的每个请求,您将通过扩展 MockHttpServletRequest 来编写一个新的“模拟”请求。您将各种 URL 信息和其他感兴趣的项目放入类中,就像常规 Java 代码一样。但是,这些类代表特定的情况和场景,因此您对数据进行硬编码。这将适用于 JUnit 4.x(不需要额外的库)。您基本上捕获您关心的场景,编写“模拟”(也称为假)请求,并验证您的 servlet 响应正确的信息(由“CapturingResponse”捕获。
【解决方案2】:

查看 Spring 框架。 它们与 Mockito 和 Junits 等其他测试框架配合得很好。 使用 SpringMVCTest 或 SpringRestAssured 之类的东西,注意 RestAssured 可以让你编写集成测试。

阅读thisthis

【讨论】:

  • 我对 Spring MVC 和 Junit 有一些经验,所以,这可能是更好的方法。我会很感激一些示例代码来开始。我的意思是,我有网址,如何使用它进一步进行?我现在正在查看您提供的链接。
  • 你使用 maven 吗?如果是,请启动一个放心的 poc,你会看到它是多么简单......它也是基于 springMVC 构建的,尽管我更喜欢使用 Junit 和 Mockito 编写我的单元测试和一个带有 springmvc mock 或 reassured 的集成套件。
  • 是的,我使用 maven 用 Spring 开发后端,所以熟悉依赖关系、XML 格式,并且对 Junit 有一定的经验。但是,我之前从未做过任何 RESTful Web 服务测试。
  • 如果你想用你的浏览器测试 REST-Web 服务,你必须安装一个插件。如果您使用 Google Chrome,您可以安装 REST Console chrome.google.com/webstore/detail/rest-console/… 对于 Firefox 安装这些 REST-Client addons.mozilla.org/en-us/firefox/addon/restclient REST 客户端也可用于 Safari restclient.net 对于 Opera,您可以查看 Simple REST-Client
  • 建议一个框架来解决问题是相当多的开销。 Spring 引入了许多主要用于解决 IoC 问题的工具;并且使用其中一些工具,您可以构建 Web 服务。但是,您可以在没有 Spring 的情况下轻松构建 Web 服务,而且通常比想象的要容易(因为您只是在解决手头的问题)
猜你喜欢
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多