容器对象模式。 一种新的测试模式。

如果您搜索什么是页面对象的描述,就会发现页面对象模式为我们提供了一种以可重用和可维护的方式对内容建模的常识方法。

还要指出:在Web应用程序的UI中,您的测试与某些区域交互。 Page Object只是将它们建模为测试代码中的对象。

这减少了重复代码的数量,并且意味着如果UI更改,则仅需要在一个地方应用此修复程序。

如您所见, Page Object适用于UI元素。 我们( Arquillian社区)在Page Object模式逻辑之后创造了一种新模式,称为Container Object模式。

您可以将“ 容器对象”视为您的测试可能与之交互的容器区域(现在为Docker容器)。 例如,其中一些领域可能是:

  • 获取运行容器的主机IP。
  • 给定暴露端口的有界端口。
  • 在配置文件(Dockerfile)中配置的任何参数,例如用于访问容器公开的服务的用户或密码。
  • 容器的定义。

一个容器对象内部可能包含多个容器对象的集合。 这有效地在容器之间建立了关系船(链接)。

例如,在容器中运行MySQL数据库的情况下,配置参数的示例可能是访问数据库的用户和密码。

请注意,没有什么可以阻止您生成用于从测试访问服务的正确URL,或阻止针对容器执行命令,例如检索内部文件。

当然,就像Page Object一样, Container Object为您提供了一种构建模型内容的方法,该模型内容可用于多个项目。

在研究如何在Arquillian Cube中实现此模式之前,我们先来看一个示例:

假设您所有的应用程序都需要将文件发送到FTP服务器。 要编写集成/组件测试,您可能需要一个FTP服务器来发送文件并检查文件是否已正确发送。

一种方法是在执行测试之前使用Docker启动FTP服务器,然后使用该Docker容器用于FTP服务器执行测试,然后再停止容器以检查文件是否存在,最后停止容器。

因此,所有涉及FTP服务器和容器的所有操作都可以在Container Object中加入。 该容器对象可能包含以下信息:

  • 使用哪个图像
  • 运行此FTP服务器的主机的IP和绑定端口
  • 访问FTP服务器的用户名和密码
  • 断言文件存在的方法

然后从测试的角度来看,它仅与该对象通信,而不是直接对测试内部的所有信息进行硬编码。

再次与Page Object中一样 ,容器上的任何更改都只会影响Container对象,而不会影响测试本身。

现在,通过一个非常简单的示例,看看Arquillian Cube如何实现Container Object模式:

Arquillian多维数据集和容器对象

让我们看一个简单的示例,说明如何在Cube中实现Container Object 。 假设您要创建一个容器对象,该对象封装了在Docker内部运行的乒乓服务器。

容器对象将类似于带有特殊注释的简单POJO:

@Cube(value = "pingpong", portBinding = "5000->8080/tcp") // <1>
@CubeDockerFile
public class PingPongContainer {@HostIp // <2>String dockerHost;@HostPort(8080) // <3>private int port;public URL getConnectionUrl() { // <4>try {return new URL(“http://” + dockerHost + “:” + port);} catch (MalformedURLException e) {throw new IllegalArgumentException(e);}}
}

在前面的示例中,您必须注意以下几行:

  1. @Cube注释配置Container Object
  2. 容器对象可以使用Arquillian浓缩器进行浓缩。
  3. 为给定的裸露端口注入有界端口。
  4. 容器对象隐藏了如何连接到PingPong服务器。

@Cube批注用于配置此Container对象 。 最初,您将启动的容器命名为pingpong,并设置容器实例的端口绑定信息,在本例中为5000→8080 / tcp

请注意,这可以是一个数组,用于设置多个端口绑定定义。

下一个注释是@CubeDockerFile ,它配置如何创建容器。 在这种情况下,请使用位于默认类路径位置的Dockerfile 。 默认位置是package + classname ,因此例如在以前的情况下, Dockerfile应该放置在org / superbiz / containerobject / PingPongContainer目录中。

当然,您可以通过将注解作为值传递来设置任何其他类路径位置。 CubeDockerFile批注设置找到Dockerfile的位置,而不是文件本身。

同样,该位置应该可以从ClassLoader到达,因此这意味着应该从类路径中加载它才能找到它。

任何多维数据集都可以使用任何客户端扩展器进行扩展 ,在这种情况下,可以使用@HostIp 优化器进行扩展 ,但是也可以使用@ArquillianResource通过DockerClient进行扩展

最后, @ HostPort用于将公开的端口转换为绑定的端口。

因此,在此示例中,端口值将为5000 。 您将简要了解为什么此批注很重要。

然后,您可以在测试中开始使用此容器对象:

@RunWith(Arquillian.class)
public class PingPongTest {@CubePingPongContainer pingPongContainer;@Testpublic void shouldReturnOkAsPong() throws IOException {String pong = ping();assertThat(pong, containsString("OK"));assertThat(pingPongContainer.getConnectionPort(), is(5000));}
}

这里最重要的是,您需要将Container Object设置为类的字段,并使用@Cube进行注释。

Cube注释字段非常重要,因此Arquillian在运行测试之前,可以检测到它需要启动一个新的Cube (Docker容器),创建Container Object并将其注入测试中。

请注意,此批注与定义Container Object时使用的批注完全相同。

之所以这样,是因为您可以从测试端覆盖Container Object的任何属性。 这就是@HostPort批注很重要的原因,因为可以从测试定义中更改端口,所以您需要找到一种在容器对象内部注入正确端口的方法。

在这篇文章中,我介绍了容器对象模式以及如何在Arquillian Cube中使用 。 但这只是一个小尝试,您可以在以下位置阅读有关Arquillian CubeContainer Object集成的更多信息:

  • https://github.com/arquillian/arquillian-cube#arquillian-cube-and-container-object

还可以在以下位置找到运行示例:

  • https://github.com/arquillian/arquillian-cube/tree/master/docker/ftest-docker-containerobject

翻译自: https://www.javacodegeeks.com/2016/01/container-object-pattern-new-pattern-tests.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串工具类,随机生成字符串

字符串工具类&#xff0c;随机生成字符串package main.java.utils;import java.util.Map; import java.util.Random;public class StrUtil {/*** 定义一个字符串&#xff08;A-Z&#xff0c;a-z&#xff09;*/private static final String STR_ONE "abcdefghijklmnopqrs…

css与网页制作

百度&#xff1a;常用DIVCSS命名大全集合转载于:https://www.cnblogs.com/Tpf386/p/7100017.html

Oracle修改密码文件_转载:Oracle修改用户密码

转载一位大佬的博文&#xff0c;用于帮助常忘记密码的我和某些同道。1. 通过系统管理员(system)修改密码修改普通用户密码相对来说简单很多。1.1 登录系统管理员账户。一般为system。1.2 查询当前系统存在的用户。这一步属于辅助性查找&#xff0c;可以不执行。select username…

爬虫突破IP封锁

爬虫突破IP封锁 爬取网站最常出现的问题就是IP封锁的问题,较为简单的方法就是购买有效IP,免费IP虽然不花钱,但是不好用,做爬取测试的时候还勉强能用。 我从快代理购买付费的IP,把自己的电脑的IP加入白名单,再使用其提供的Api获取有效IP进行爬取。 package com.zhq.crawle…

Python异常处理和进程线程

写在前面 最坏的结果&#xff0c;不过是大器晚成&#xff1b; 一、异常处理 - 1.语法错误导致的异常 - 这种错误&#xff0c;根本过不了python解释器的语法检测&#xff0c;必须在程序运行前就修正&#xff1b; - 2.逻辑上的异常 - 即逻辑错误&#xff0c;例如除零错误&#xf…

在Oracle中使用JDBC插入功能

介绍 在本文中&#xff0c;我将显示一个示例&#xff0c;说明如何使用Oracle支持的JDBC批量插入功能&#xff0c;这些功能特定于Oracle。 有关为什么可能希望一般使用批量插入的更多详细信息&#xff0c;例如&#xff0c;在某些情况下需要考虑性能&#xff0c;请参阅Joormana …

css语法和规则

语法&#xff1a; Selector{sRule!important;} 说明&#xff1a; 提升指定样式规则的应用优先权。 IE6及以下浏览器有个比较显式的支持问题存在&#xff0c;!important并不覆盖掉在同一条样式的后面的规则。请看下述代码&#xff1a; 示例代码&#xff1a; div{color:#f00!impo…

vue 代理重定向_关于vue-router,路由重定向的使用分析

看之前的项目&#xff0c;突然发现一个不算bug的bug&#xff0c;之前也是一直没有想到&#xff0c;现在发现之后越来越觉得有必要改掉&#xff0c;项目用的是vue做的&#xff0c;自然切换用的就是路由&#xff0c;一级路由包括&#xff1a;首页、记录和个人中心&#xff0c;二级…

WebMagic爬取58同城租房数据

WebMagic爬取58同城租房数据 1.WebMagic webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。 webmagic的主要特色: 完全模块化的设计,强大…

python xposed_Xposed及类Xposed框架收集

常见xposed框架xposed--原生Cydia for Androidmagisk--挂载magisk.imgvitrualXposed--双开技术EXposed --太极VAEXposedVirtualHook :VirtualHook 修改 VirtualApp 的核心代码&#xff0c;提供 Hook 注入代码的窗口VirtrualApp --多开LEB 的平行空间 --双开大师360的DroidPlugi…

[bzoj3532][Sdoi2014]Lis

来自FallDeram的博客&#xff0c;未经允许&#xff0c;请勿转载&#xff0c;谢谢。 给定序列A&#xff0c;序列中的每一项Ai有删除代价Bi和附加属性Ci。请删除若项&#xff0c;使得4的最长上升子序列长度减少至少1&#xff0c;且付出的代价之和最小&#xff0c;并输出方案。如果…

java静态导入_Java中越来越多地接受静态导入吗?

java静态导入曾经有一段时间&#xff0c;至少在礼貌的社会中&#xff0c;人们普遍认为使用“ 不是 ”一词是不可接受的。 确实&#xff0c;在那个时候&#xff08;也许直到今天&#xff09;&#xff0c;很多人确实&#xff08;也确实&#xff09;不认为这不是一个真实的词。 尽…

Vue+ECharts的小示例

VueECharts做数据可视化1. Vue Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现…

将MongoDB集成到您的Spring项目

本文展示了如何通过注释配置将MongoDB集成到您的spring项目中。 我们将从Gradle配置开始。 group com.gkatzioura.spring version 1.0-SNAPSHOTbuildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugi…

汇编学习笔记(3)-80x86指令集

前言 &#xff08;1&#xff09;指令的一般格式 [标号:] 助记符 [操作数1 &#xff0c; [操作数2]] [; 注释] 一行一条指令 助记符就是指令的名称&#xff0c;每条指定必定有个助记符。 助记符前面的标号是给汇编编译器看的&#xff0c;由我们自己取名&#xff0c;一般取表示本…

osg 三维gis开发_三维GIS平台的可视化应用 (下)

上一篇主要对三维GIS的基础数据和三维模型进行了一点说明&#xff0c;本篇将接着聊剩下的部分&#xff0c;主要是三维GIS平台能够支持什么样的场景展示&#xff0c;并来对平台的应用进行一些介绍。没看过上篇的朋友可以先了解一下再看本篇&#xff1a;MonoLog&#xff1a;三维G…

Servlet拦截器

Servlet拦截器1.LoginFilter package main.java.filter;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;public class LoginFi…

前端HTML介绍

一、HTML简介HTML定义&#xff1a;  超级文本标记语言是标准通用标记语言下的一个应用&#xff0c;也是一种规范&#xff0c;一种标准&#xff0c;它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件&#xff0c;通过在文本文件中添加标记符&#xff…

huffman编码的程序流程图_Huffman编码实现压缩解压缩

这是我们的课程中布置的作业。找一些资料将作业完毕&#xff0c;顺便将其写到博客&#xff0c;以后看起来也方便。原理介绍什么是Huffman压缩Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了&#xff0c;它是一种无损压缩方法&#xff0c;在压缩过程中不会丢失信息熵。并且能…

solr创建索引_Solr:创建拼写检查器

solr创建索引在上一篇文章中&#xff0c;我谈到了Solr Spellchecker的工作原理&#xff0c;然后向您展示了其性能的一些测试结果。 现在&#xff0c;我们将看到另一种拼写检查方法。 与其他方法一样&#xff0c;此方法使用两步过程。 相当快速的“候选单词”选择&#xff0c;然…