使用Hoverfly和Java测试第5部分:XML和Xpath匹配器

使用Hoverfly和Java测试第5部分:XML和Xpath匹配器以前,我们使用过一些现有的Hoverfly匹配器,例如regex,glob和精确。每个人都有其目的,但是我们可能需要一些规则来帮助我们通过请求交换数据的格式。在此博客上,我们将重点介绍xml的匹配器。默认的xml匹配器会将提交的xml与预期的xml进行比较。这意味着应逐个节点逐个值地验证提交的xml。只要换行符或其他多余的空格不改变xml携带的内容,就不会阻止请求成功。让…

以前,我们使用一些现有的Hoverfly匹配器,例如regex,glob和精确。每个人都有其目的,但是我们可能需要一些规则来帮助我们通过请求交换数据的格式。

在此博客上,我们将重点介绍xml的匹配器。

使用Hoverfly和Java测试第5部分:XML和Xpath匹配器

使用Hoverfly和Java测试第5部分:XML和Xpath匹配器

默认的xml匹配器会将提交的xml与预期的xml进行比较。 这意味着应逐个节点逐个值地验证提交的xml。 只要换行符或其他多余的空格不改变xml携带的内容,就不会阻止请求成功。

让我们放置将使xml匹配的初始配置。

public static final String SUCCESS_RESPONSE = "<response>"
			+ "<result>success</result>"
			+ "</response>";

	private Hoverfly hoverfly;

	@BeforeEach
	void setUp() {
		var simulation = SimulationSource.dsl(service("http://localhost:8085")
				.post("/xml")
				.body(RequestFieldMatcher.newXmlMatcher("<document type=\"xml\">"
						+ "xml-request"
						+ "</document>"))
				.willReturn(success(SUCCESS_RESPONSE, "application/xml")));

		var localConfig = HoverflyConfig.localConfigs().disableTlsVerification().asWebServer().proxyPort(8085);
		hoverfly = new Hoverfly(localConfig, SIMULATE);
		hoverfly.start();
		hoverfly.simulate(simulation);
	}

	@AfterEach
	void tearDown() {
		hoverfly.close();
	}

因此,在第一个示例中,我们将尝试将请求的xml与预期的xml进行匹配。

@Test
	void testXmlExactMatch() {
		var client = HttpClient.newHttpClient();

		var exactRequest = HttpRequest.newBuilder()
				.uri(URI.create("http://localhost:8085/xml"))
				.POST(HttpRequest.BodyPublishers.ofString("  <document type=\"xml\">\n\n"
						+ "xml-request"
						+ "</document>\t"))
				.build();

		var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
				.thenApply(HttpResponse::body)
				.join();

		Assertions.assertEquals(SUCCESS_RESPONSE, exactResponse);
	}

如您所见,无论新行和选项卡如何,由于xml数据均匹配,所以我们的请求将成功。

现在,让我们尝试将节点添加到xml中。

@Test
	void testXmlNoMatch() {
		var client = HttpClient.newHttpClient();

		var exactRequest = HttpRequest.newBuilder()
				.uri(URI.create("http://localhost:8085/xml"))
				.POST(HttpRequest.BodyPublishers.ofString("  <document type=\"xml\">\n\n"
						+ "xml-request"
						+ "</document>\t<empty-node>ok</empty-node>"))
				.build();

		var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
				.join();

		Assertions.assertEquals(502, exactResponse.statusCode());
	}

xml不匹配,因此将失败。

让我们关注另一个问题。 由于交换的数据是动态的,因此可能无法实现完全匹配。 另外,您可能不必只关注提交的所有信息,而只关注交换信息的特定部分。 因此,XPath匹配器变得很方便。

将使用XPath规则增强初始设置。

@BeforeEach
	void setUp() {
		var simulation = SimulationSource.dsl(service("http://localhost:8085")
				.post("/xml")
				.body(RequestFieldMatcher.newXmlMatcher("<document type=\"xml\">"
						+ "xml-request"
						+ "</document>"))
				.willReturn(success(SUCCESS_RESPONSE, "application/xml"))
				.post("/xpath")
				.body(RequestFieldMatcher.newXpathMatcher("/document/payment[amount=1]"))
				.willReturn(success(SUCCESS_RESPONSE, "application/xml"))
		);

		var localConfig = HoverflyConfig.localConfigs().disableTlsVerification().asWebServer().proxyPort(8085);
		hoverfly = new Hoverfly(localConfig, SIMULATE);
		hoverfly.start();
		hoverfly.simulate(simulation);
	}

如果存在带有付款节点的单据节点,并且金额节点上的值是1,则将存在一个匹配项让我们去一个积极的情况

@Test
	void testXpathMatch() {
		var client = HttpClient.newHttpClient();

		var exactRequest = HttpRequest.newBuilder()
				.uri(URI.create("http://localhost:8085/xpath"))
				.POST(HttpRequest.BodyPublishers.ofString("  <document type=\"xml\">\n\n"
						+ "<payment><amount>142</amount></payment>"
						+ "<payment><amount>1</amount><currency>GBP</currency></payment>"
						+ "<payment>invalid</payment>"
						+ "</document>\t"))
				.build();

		var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
				.thenApply(HttpResponse::body)
				.join();

		Assertions.assertEquals(SUCCESS_RESPONSE, exactResponse);
	}

正如预期的那样,我们进行了比赛。让我们去消极的情况。

@Test
	void testXpathNoMatch() {
		var client = HttpClient.newHttpClient();

		var exactRequest = HttpRequest.newBuilder()
				.uri(URI.create("http://localhost:8085/xpath"))
				.POST(HttpRequest.BodyPublishers.ofString("  <document type=\"xml\">\n\n"
						+ "<payment><amount>142</amount></payment>"
						+ "<payment><amount>no-match</amount><currency>GBP</currency></payment>"
						+ "<payment>invalid</payment>"
						+ "</document>\t"))
				.build();

		var exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
				.join();

		Assertions.assertEquals(502, exactResponse.statusCode());
	}

就是这样,我们确实对基于xml的数据使用了xml和xpath匹配器。 下一个博客将重点介绍基于JSON的匹配器。

翻译自: https://www.javacodegeeks.com/2020/12/testing-with-hoverfly-and-java-part-5-xml-and-xpath-matchers.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34140.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注