gpt4 book ai didi

java - 集成测试期间托管网站

转载 作者:行者123 更新时间:2023-12-02 02:42:54 24 4
gpt4 key购买 nike

我正在开发一个抓取器,我正在尝试为其编写一个集成测试来抓取存储在磁盘上的 HTML。测试应该从 img src 中抓取图像 url。在代码中,这可以归结为 Jsoup.connect(url)其中 url 是一个字符串。我了解模拟,但这不属于集成测试。这就是我认为托管该网站并真正返回图像才是正确选择的原因。当然,欢迎其他选择。

理想情况下,测试运行时会启动一个占用空间较小的 Web 服务器。我应该能够确定或至少知道它发布网站的网址。我还应该能够将 Web 服务器指向 HTML 文件。

抓取项目是一个Spring Boot。我可以静态地提供页面,如 from/static,而不是由 Controller 解析。当我有一个 Controller 返回页面时,它由 Thymeleaf 解析并抛出 org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference 。为了查看这些结果,我运行了整个 Spring Boot 应用程序。

最佳答案

考虑在您的情况下使用WireMock ( http://wiremock.org/ )。 WireMock 帮助您运行 HTTP 服务器并在集成(或单元)测试环境中对其行为进行 stub 。看一下下面的示例(JUnit 测试):

package com.github.wololock;

import com.github.tomakehurst.wiremock.junit.WireMockRule;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;

import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

public final class WireMockHtmlTest {

@Rule
public WireMockRule wireMockRule = new WireMockRule(options().port(8080));

@Before
public void setup() throws IOException {
final InputStream inputStream = getClass().getClassLoader().getResourceAsStream("html/index.html");
final String html = new String(IOUtils.toByteArray(inputStream), Charset.forName("UTF-8"));

wireMockRule.stubFor(get(urlEqualTo("/index"))
.willReturn(aResponse()
.withBody(html)
.withHeader("Content-Type", "text/html; charset=UTF-8")
)
);
}

@Test
public void test() throws IOException, InterruptedException {
//given:
final URLConnection connection = new URL("http://localhost:8080/index").openConnection();
//when:
final String body = IOUtils.toString(connection.getInputStream(), Charset.forName("UTF-8"));
//then:
assertThat(body.contains("Hello world!"), is(equalTo(true)));
}
}

此测试加载存储在src/test/resources/html/index.html中的HTML文件内容,该文件包含:

<html>
<head>
<title>Hello world!</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>

如果您想在集成测试中使用 WireMock,您只需要做几件事:

  1. 使用WireMockRule指定@Rule(它处理正在运行的HTTP服务器)。值得一提的是 - 使用未使用的端口号,否则服务器将无法启动。
  2. @Before 阶段的 stub 服务器行为(您可以在此处找到有关 stub 的更多信息 - http://wiremock.org/docs/stubbing/)
  3. 准备一个连接到正在运行的服务器(在 localhost 上)的测试用例。
  4. 您不必担心关闭 HTTP 服务器 - 当运行测试完成时它将关闭。

我故意粘贴了所有导入,以便您可以看到使用了哪些类。

希望有帮助:)

关于java - 集成测试期间托管网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45123259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com