aem 渲染_AEM中的单元测试(大声思考)

aem 渲染

如果要在AEM中进行单元测试,这不是任何建议,而是各种思想的总结和一些可供选择的选项。 一段时间之前,我已经为客户进行了一些研究,这篇文章在很大程度上受到了这项工作的影响,但是很多上下文相关的东西已经被淘汰了。 我仍然尽力确保本文的精髓。 我将尝试尽快进行后续处理,并提供更多详细信息。

选项1:使用吊索工具并测试容器内

Apache sling已发布了一组工具http://sling.apache.org/documentation/development/sling-testing-tools.html ,可协助应用程序中的单元测试。 那里的工具提供了几种执行测试的方法,例如a)没有外部依赖关系的老式JUnit,或者b)使用模拟程序–吊索提供了现成的模拟程序,可以减少工作量,或者c)我们可以在CQ盒中部署测试用例(或吊索),然后使用OSGi引用运行。

我在这里建议的方法是,我们将在已经托管的CQ实例中部署JUnit,并远程调用测试用例。 我了解这不是“老学校单元测试,因为我没有抽象任何依赖关系,并且我的单元包括依赖关系”,但是我有这样做的理由。 事实上,如果您一直关注我关于单元测试的文章,您会知道我不是模拟的忠实拥护者,并且如果我可以进行设置,那么实际上我很乐意针对依赖项进行任何单元测试。

为此,我们需要做一些事情,如下所示:

  1. 我们将需要一个托管的CQ实例,可以用作运行测试用例的容器
    1. 我们可以使用嵌入式系统,但是随后我们将不得不花更多的精力来创建内容,而不能创建其他内容。 另外,嵌入式容器将是吊索而不是CQ,我们希望使环境尽可能接近我们使用的环境
  2. CQ实例应具有一组预填充的产品和图像(此设置确实使用了AEM电子商务模块,并且PIM和DAM已与外部系统集成在一起),并且可以作为我们的现成测试数据。 这些可以通过我们的后端集成来实现。 我们可以选择独立执行或自动执行(随着时间的流逝,这些事情的自动化也可能发生,以便我们快速启动)
  3. 为了与任何后端服务(例如订单管理,定价,帐户信息)进行交互,我们需要运行一个后端服务实例(如我所说,如果可能的话,我会选择系统而不是模拟系统),并设置所有变量和部件。 该实例还应该具有各种数据设置,例如用户帐户,产品实例,可用性,价格等,以确保我们的用例能够正常工作。 设置独立的后端服务存在明显的挑战,我们可以探索以下2个选项之一
    1. 捕获特定请求类型的所有请求和响应,并将其序列化到测试数据存储中。 它可以是巨大的XML,可以存储在系统的键值对中,也可以是像mongo这样的数据库(甚至可以使用SQL),也可以在文件系统上序列化;或者
    2. 我们可以使用一个已经存在的后端系统

选项2:使用Selenium作为功能测试工具

在这种方法中,我建议根本不要使用JUnits。 这个想法是使用系统测试的原理,它可以测试代码中的所有单元。 这与模拟所有依赖项的传统单元测试方法大不相同,我们可以快速运行多个测试。 尽管选项1也具有相同的效果,但在这种方法中,我们更进一步,并利用了我们的系统测试套件。 这个想法不是针对每个用例都执行此操作,而是获取关键业务功能,例如结帐,订单管理,帐户管理并使其自动化。 然后可以将Selenium脚本与JUnit运行器集成,在这里我们可以将其与CI工具集成,并可以从Eclipse或Maven运行它,因此可以与CI本身集成。 这为我们节省了编写那些JUnit和独立管理整个套件的时间。 这种方法还需要一个托管的CQ实例,该实例具有产品数据设置,一些内容设置和后端集成,就像在选项1中一样。

当然,这有点棘手,不是真正的单元测试,但是如果做得好,它会有一些巨大的好处。

翻译自: https://www.javacodegeeks.com/2015/01/unit-testing-in-aem-thinking-loud.html

aem 渲染

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

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

相关文章

C语言中#if,#if defined ,#ifdef,extern的用法描述

1、#if 和#ifdef当asd_eee表达式存在而且,值为ture的时候接续向下执行例如#define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call little endina function #else call big endina function #endif上面的今天写的代码&…

java 排序性能_Java8排序–性能陷阱

java 排序性能Java 8带来了lambda的所有优点,使我们能够使用声明式样式进行编程。 但这真的免费吗? 我们是否应该担心必须为新的编程功能付出的代价? 这是一个我们可能要担心的例子。 考虑对这个简单类的实例进行排序: private…

delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...

前言随着Elastic的上市,ELK不仅在互联网大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连"婚庆网站"都开始使用Elasticsearch了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。因…

为什么C语言函数不能返回数组,却可以返回结构体

C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void[8]{ char ret;// ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10];obj_a f(); }不可以编写这样的代码这其实就是不能…

oracle迁移mysql_从自建Oracle迁移至RDS MySQL

#本示例以名称为dtstest的数据库账号为例介绍授权命令,需要对PDB和CDB同时授权#PDB授权示例:create user dtstest IDENTIFIED BY rdsdt_dtsacct;grant create session to dtstest;grant connect to dtstest;grant resource to dtstest;grant select on a…

2015年传智播客java_2015年Java 8强势开始

2015年传智播客javaJDK 8从2015年开始,其博客文章和文章的受欢迎程度将激增。 这与本月将 Java 自动升级到JDK 8恰好吻合。 在这篇文章中,我列出并简要描述了2015年已经发布的许多有关JDK 8的文章和帖子。 JDK 8 Streams在最近的帖子中理所当然地受欢迎…

python文件运行哪一个_如何使一个python文件运行另一个?

本问题已经有最佳答案,请猛点这里访问。 如何创建一个python文件来运行另一个? 例如,我有两个.py文件。我想运行一个文件,然后让它运行另一个.py文件。 docs.python.org / / modules.html教程 所以我execfile()模块通常是更好的。…

C语言printf()函数具体解释和安全隐患

程序员都知道,也都会使用printf函数,但你知道它也有“安全隐患”吗?下面就来举例我说说:嵌入式专栏1问题描述打印输出的数据并不是理论值,如下图(右边):嵌入式专栏2进一步描述问题请…

brew search mysql_brew mysql

1、homebrew安装/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2、命令使用安装软件:brew install 软件名,例:brew install wget搜索软件:brew search 软件名&a…

spring 请求转码_Spring请求级备忘录

spring 请求转码介绍 备注化是一种方法级别的缓存技术,用于加快连续调用的速度。 这篇文章将演示如何仅使用Spring AOP实现任何数据源的请求级可重复读取。 Spring缓存 Spring提供了非常有用的缓存抽象 ,允许您将应用程序逻辑与缓存实现细节分离。 Sp…

java map 如何根据key获得对象_ThreadLocal:Java中的影分身

关于ThreadLocal,你有哪些疑问?ThreadLocal是用来解决什么问题的?如何使用ThreadLocal?ThreadLocal的实现原理是什么?可否举几个实际项目中使用ThreadLocal的案例?基础知识ThreadLocal是线程局部变量&#…

【C语言】你可能对 sizeof() 有点误解。。。

各位,今天还是按照惯例给大家分享一个C语言容易出现的小错误,这也是跟sizeof有关的,问题虽小,却可管中窥豹,话不多说,代码先行:#include int main() { int i; i 8; printf("%d\…

mysql cluster 设置单向复制_mysql单向主从配置

1.环境要求操作系统:centOS6.5或以上Mysql版本:mysql5.5主机配置:4核CPU、4G内存2.主从复制的方式mysql5.6开始主从复制有两种方式:基于日志(binlog)、基于GTID(全局十事务标示符),下面主要介绍基于日志(binlog)的复制…

java处理注释_如何处理Java注释

java处理注释Java 8的一项很酷的新功能是对lambda表达式的支持。 Lambda表达式在很大程度上依赖于FunctionalInterface 注释 。 在本文中,我们将介绍注释以及如何处理它们,以便您可以实现自己的出色功能。 注解 Java 5中添加了注释 。Java语言附带了一…

nginx tcp转发_Nginx学习(九):负载均衡服务

介绍对于请求而言,负载均衡能很好的均摊请求,提高服务端吞吐率和整体性能,多个服务节点部署的方式,也提高了容灾和服务高可用。一、负载均衡分类负载均衡分为:GSLB和SLB。1. GDLB全局负载均衡,往往按照国家…

控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序

前言在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动。具体在 [管理过程](https://12factor.net/admin-processes)中也已经列出了原因。创建控制台应用打开命令…

C语言函数为什么不能返回数组?

C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void)[8] {char ret; // ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10]; obj_a f(); }不可以编写这样的代码这其实就是不…

mockito_书评:Mockito Essentials

mockitoSujoy Acharya的Mockito Essentials副标题( Packt出版 ,2014年10月)是:“实用指南,可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。 前言 在序言中…

python3 byte 字面值_bytearray() Python 内置函数

转载须注明出处:简书Orca_J35 | GitHuborca-j35 class bytearray([source[, encoding[, errors]]]) 该内置函数本质上是 bytearray 类的构造函数,用于创建一个 bytearray 实例。bytearray 实例是一个由字节(8-bits 无符号)构成的可变序列,并拥…

python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...

之前小编给大家介绍了用python去返回了一个值,立马就有小伙伴跟小编留言说道“能都执行多个内容?”于是,小编就给大家整理最细致,也是最简单的实现方法,方便大家理解学习,一起来看下吧~直接上代码&#xff…