登录后测试主页的 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 测试登录页面的示例。
我正在使用 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 测试登录页面的示例。