登录后测试主页的 Jersey 客户端策略

Jersey client side strategy to test main page after login

我正在使用 Jersey 创建 Web 应用程序。目前有两个页面:登录页面和主页面。当用户输入正确的用户名和密码时,登录页面将被重定向到主页面(否则警告会在弹出窗口中显示 window,没有重定向)。

在主页中,某些内容从服务器检索并在页面上更新。

由于主页上没有用户名和密码,在用户登录成功后,如何编写客户端代码来验证是否将正确的内容呈现到主页?

一种方法是使用 HTML 解析库,例如 jsoup. Here's a complete example, using Jersey Test Framework。您可以 运行 它就像任何其他单元测试一样

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import org.junit.Test;
import static junit.framework.Assert.*;

public class HtmlParserTest extends JerseyTest {

    @Path("login")
    public static class LoginController {

        @POST
        @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
        @Produces(MediaType.TEXT_HTML)
        public String doLogin(MultivaluedMap<String, String> formParams) {
            boolean valid = false;
            valid = "user".equals(formParams.getFirst("username"));
            valid = "pass".equals(formParams.getFirst("password"));

            String message = valid ? "You Win!" : "You Lose!";
            String html
                    = "<html>\n"
                    + "    <body>\n"
                    + "        <h1 id=\"message\">" + message + "</h1>\n"
                    + "    </bod;y>\n"
                    + "</html>";
            return html;
        }
    }

    @Override
    public Application configure() {
        return new ResourceConfig(LoginController.class);
    }

    @Test
    public void youWinMessageWithValidCredentials() {
        String message = handleRequest("pass");
        assertEquals("You Win!", message);
    }

    @Test
    public void youLoseMessageWithBadCredentials() {
        String message = handleRequest("wrong");
        assertEquals("You Lose!", message);
    }

    private String handleRequest(String password) {
        Form form = new Form();
        form.param("username", "user");
        form.param("password", password);
        String html = target("login").request()
                .accept(MediaType.TEXT_HTML)
                .post(Entity.form(form), String.class);
        return getMessageContent(html);
    }

    /* jsoup code */
    private String getMessageContent(String html) {
        Document document = Jsoup.parse(html);
        Element messageElem = document.getElementById("message");
        return messageElem.text();
    }
}

这是测试的依赖项

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <scope>${jersey2.version}</scope>
</dependency>
<dependency>
    <!-- jsoup HTML parser library @ http://jsoup.org/ -->
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

您可以使用 Arquillian 框架进行此类测试。除了 Arquillian Core 之外,还有很多扩展可用。 对于您的用例,我会使用 Arquillian Drone Extension and the REST Extension(如果您在登录后使用 restful 服务)。 Arquillian Drone 允许您为网站编写客户端测试,其余扩展 restful 可以测试网络服务。

Here 是使用 Arquillian Drone 测试登录页面的示例。