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

对象容器设计模式

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

还要指出:在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批注很重要的原因,因为可以从测试定义更改端口,所以您需要找到一种在容器对象内部注入正确端口的方法。

在这篇文章中,我介绍了Container Object模式以及如何在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/336451.shtml

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

相关文章

php中上传图片怎么显示出来,PHP上传图片类显示缩略图功能

有缩略图功能 但是 感觉不全面&#xff0c;而且有点问题&#xff0c;继续学习&#xff0c;将来以后修改下/*** Created by PhpStorm.* User: Administrator* Date: 2016/6/28* Time: 21:04*/class upload{protected $fileMine;//文件上传类型protected $filepath;//文件上传路径…

LeetCode 1047. 删除字符串中的所有相邻重复项

原题链接 解题思路&#xff1a; 我们可以用栈来维护没有重复项的字母序列&#xff1a; 若当前的字母和栈顶的字母相同&#xff0c;则弹出栈顶的字母&#xff1b; 若当前的字母和栈顶的字母不同&#xff0c;则放入当前的字母。 class Solution { public:string removeDuplica…

javaparser_JavaParser入门:以编程方式分析Java代码

javaparser我最喜欢的事情之一是解析代码并对其执行自动操作。 因此&#xff0c;我开始为JavaParser做出贡献&#xff0c;并创建了两个相关项目&#xff1a; java-symbol-solver和Effectivejava 。 作为JavaParser的贡献者&#xff0c;我反复阅读了一些有关从Java源代码提取信…

prepare的用法 php,PHP中的操作mysqli的预处理prepare

这篇文章主要介绍了关于PHP中的操作mysqli的预处理prepare &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下PHP中的操作mysqli的预处理prepare1、【PHP错误】Cannot pass parameter 2 by reference这个错误的意思是不能按引用传…

wps xml转换表格_这功能WPS卖近百元?教你免费将PDF转成Word

[PConline 应用]PDF文件如何转换成为Word&#xff1f;很多朋友研究这个问题已经很久了&#xff0c;PDF更利于统一格式传播&#xff0c;Word更便于编辑&#xff0c;因此收到PDF文件后、想要修改时要如何将PDF转换成Word可谓是一个刚需。当然&#xff0c;不少办公软件提供了这样的…

junit 预期错误_谨慎使用JUnit的预期异常

junit 预期错误有时&#xff0c;当我们收到对jOOQ或其他库的拉取请求时&#xff0c;人们会将单元测试中的代码更改为更“惯用的JUnit”。 特别是&#xff0c;这意味着他们倾向于更改此代码&#xff08;公认的不是那么漂亮的代码&#xff09;&#xff1a; Test public void tes…

LeetCode 231. 2的幂

原题链接 class Solution { public:bool isPowerOfTwo(int n) {if(n<0)return false;if((n&n-1) 0) return true;return false;} };

睡眠 应该用 a加权 c加权_在神经网络中提取知识:学习用较小的模型学得更好...

在传统的机器学习中&#xff0c;为了获得最先进的(SOTA)性能&#xff0c;我们经常训练一系列整合模型来克服单个模型的弱点。 但是&#xff0c;要获得SOTA性能&#xff0c;通常需要使用具有数百万个参数的大型模型进行大量计算。 SOTA模型(例如VGG16 / 19&#xff0c;ResNet50)…

matlab读txt文件不完整,求助Matlab批量读取TXT文件出错

我用dlmread函数批量读取txt文件中的一个数据&#xff0c;但运行结果1.txt文件中只有一个数据0&#xff0c;调试时报错&#xff1a;错误使用 dlmread (line 147)文件结尾不支持空的格式字符串&#xff0c;文件有128列&#xff0c;78行&#xff0c;下面没有列全文件格式是&#…

面向对象代码_面向对象的代码生成方法

面向对象代码代码生成是减少无聊任务的不健康负担的一种常用方法&#xff0c;这些任务常常使我们急切地对代码苦恼。 我见过的许多代码生成框架都使用模板替换重复方法&#xff0c;在该模板中&#xff0c;您编写了模板&#xff0c;以了解生成的代码文件的外观&#xff0c;然后替…

LeetCode 20.有效括号

原题链接 方法一&#xff1a;解题思路&#xff0c;使用栈 模拟法&#xff1b;首先遍历将是左括号形式的部分压入栈中。然后对于右括号形式与栈顶元素进行比对&#xff0c;看是否匹配。如果匹配的话删除栈顶元素&#xff0c;不匹配直接返回false。最后栈为空则全部的括号匹配…

gpu编程如何一步步学习_如何学习贴片机编程

学习贴片机编程首选要对贴片机有所熟悉了解&#xff0c;另外对常用的电脑编辑软件要会使用。目前通常学习贴片机编程有专门的培训学校&#xff0c;或者跟着生产线上现有的贴片机编程师傅学习熟练后再进行编程操作。下面深圳智驰科技就来分享一下如何学习贴片机编程。对贴片机编…

plotcylinder matlab,Matlab在任意两点之间绘制三维圆柱

Matlab在任意两点之间绘制三维圆柱Matlab在任意两点之间绘制三维圆柱此函数可能存在一些不足&#xff0c;请多多指教&#xff01;function plotcylinder(u1,u2,color_a,r)Lnorm(u1-u2);RODu2-u1;[X,Y,Z]cylinder(r,100);x1X*0;y1Y*0;z1Z*0;ZL*Z-L/2;ROD_midpoint(u1u2)/2;xROD_…

简单内存池设计

关键词 内存池 链表 class A { public:static void* operator new(size_t size);static void operator delete(void* phead);static int m_iCout;//分配计数统计&#xff0c;每new一次&#xff0c;就统计一次static int m_iMallocCount;//每次malloc一次&#xff0c;统计一次p…

jdk8和hotspot_HotSpot的-XshowSettings标志的简单性和价值

jdk8和hotspot一个方便的HotSpot JVM标志 &#xff08; 选项为Java启动 java &#xff09;是-XshowSettings选项。 Oracle Java启动器描述页面中对此选项进行了如下描述 &#xff1a; -XshowSettings &#xff1a; category显示设置并继续。 该选项的可能类别参数包括&#xf…

怎样自动提取邮件的内容_这些最新的外贸搜索开发工具(图灵搜、谷歌搜索提取工具、易查查),你会使用吗?...

贸业务开展过程中&#xff0c;搜寻买家信息&#xff0c;开发买家客户&#xff0c;是开展外贸的前提。而掌握B2B、谷歌、搜索引擎、社交网站及众多搜索工具的运用技巧&#xff0c;则是外贸业务人员的基本功。本篇文章将结合图灵搜、谷歌搜索提取工具、易查查&#xff0c;三款工具…

LeetCode 面试题55 二叉树的深度

原题链接 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:int maxDepth(TreeNode* root) {if(rootNULL)…

matlab信号分割与比对,matlab测量计算信号的相似度

本示例说明如何测量信号相似度。将回答以下问题&#xff1a;如何比较具有不同长度或不同采样率的信号&#xff1f;如何确定测量中是否存在信号或仅有噪声&#xff1f;有两个信号相关吗&#xff1f;如何测量两个信号之间的延迟&#xff1f;比较具有不同采样率的信号考虑一个音频…

Spring Bootstrap中具有配置元数据的高级配置

在简要介绍了配置元数据并涵盖了我之前的文章《 在Spring Boot中使用配置元数据Pimp您的配置》中的基础知识之后&#xff0c;现在该看看如何进一步执行此步骤并进一步自定义配置。 在这篇文章中&#xff0c;我计划提出对配置属性的弃用&#xff0c;并讨论各种值提供程序&#x…

ssh 与 telnet 有何不同?_采用创新面料Nike Infinalon的全新瑜珈系列究竟有何不同?...

采用创新面料Nike Infinalon的全新瑜珈系列究竟有何不同&#xff1f;无拘无束自由运动——这是耐克瑜伽系列新品的核心设计理念。全新系列为你提供垫上瑜伽时毫无束缚的舒适感&#xff0c;采用了耐克创新型面料&#xff1a;Nike Infinalon。Nike Infinalon应用于耐克最新瑜伽系…