2016-10-03 97 views
4

背景单元测试AEM 6.1和嘲讽吊带,JCR和OSGi

嗨,

所以我最近在使用AEM 6.1公司开始,我也是一个初级开发。

当我与我的好友(高级开发人员)配对时,他通常会开车。但是不写单元测试,这让我感到困惑。他解释说,单元测试AEM很困难。

我们的项目使用http sling请求和响应,Osgi框架和一个大的Jcr存储库,jsps,servlets和数据库连接。我们使用各种设计模式,创建适配器类......等等。

问题

为什么很难创造AEM单元测试,当有嘲讽的吊带,OSGi和JCR框架?

如何学会单元测试AEM 6.1?

前进...

我正在寻找资源,能够为AEM创建单元测试?如果可能的话,你可以链接下面的任何资源?

回答

2

当我第一次开始在AEM中开发时,我也有同样的感受。随着时间的推移,我推动为我的公司改变这种状况,现在我们有了一个单元测试我们的AEM代码的环境。

为什么测试AEM代码很困难?我认为主要原因归结为2点:

  1. 许多Adobe示例以带有内嵌Java代码(scriptlets)的JSP形式出现。 Scriptlet代码不可测试,也不可重用。我认为你从Adobe看到如此之多的一个原因是,该产品允许开发人员“覆盖”基本功能。内置代码在“libs”下运行,但开发人员可以将代码复制到libs中,并将其放在“apps”中,然后进行更改 - 这些更改将替代现有代码生效。使用包含scriptlet的JSP,可以很容易地替换这样的代码,因为您可以获取标记以及Java代码,并仍然可以对其进行更改。但是如果该Java代码位于其他库中,那么您如何替换它?虽然这是可能的,但会更困难。所以我认为Adobe有很多示例代码在脚本中显示Java代码。但这是不好的做法,不管其原因。如果你想单元测试,你不能这样做。所以不要允许它。要求开发人员将代码放在.java类中,并通过标签(或其他类似的机制)包含它。然后你可以单元测试代码 - 并且更容易重用它。
  2. 您为AEM编写的大部分代码都需要与AEM使用的存储库进行交互。所以你不可避免地对作为基本AEM安装一部分的代码/包有依赖性。当您尝试编写自己的.java类时,您很快就会发现,除非在IDE的类路径中具有这些相同的依赖项,否则将无法编译。对于较老的AEM版本,没有供应商提供的方式来获取这些知识。但最近的版本有它 - 一个“Uber”.jar。我认为依赖性问题阻碍了开发人员。他们在JSP中恢复为它们的Java代码中的scriptlet。如果要单元测试AEM代码,则必须提取AEM提供的代码中的所有依赖关系,并将其作为IDE中项目的一部分。这不是一件容易的事情,但它是能够在IDE中以正常方式进行有效开发和测试以及像在其他Java项目中一样持续集成构建项目的先决条件。

我们通过制作一个“容器”.jar解决了#2问题,该容器包含我们AEM实例中需要编译和单元测试Java代码的所有.jar文件。但是最近的AEM版本在Uber .jar中提供了这个功能,这使得这项任务变得更加容易。我们还使用Mockito进行单元测试Java代码。它允许我们依赖的Sling和AEM类轻松而强大地嘲笑。我们一直使用它。我们偶尔也会使用PowerMockito进行一些嘲讽。

除此之外,测试用于AEM的Java代码是否比测试任何其他Java代码更困难。我们还使用Karma和Jasmine添加了JavaScript单元测试支持 - 所以同样的事情适用于客户端代码。

这里有一些资源,可以帮助:

1

这取决于代码,一个代码,你可以很容易地与其他测试覆盖测试。支持这种“不可测试”代码的单元测试(创建代码时不考虑测试)是一件很痛苦的事情。

在这里你可以找到库的单元测试link与例子。

你也可以测试你的代码,如Mockito(在许多情况下,更容易与Mockito创建模拟,而不是在Sling模拟库中创建JCR fixture from JSON file)。

0

一个主要问题是uber jar被混淆,因此它只包含API接口和类。因此,您必须模拟AEM对象,这非常麻烦。但是,Adobe提供了一个未混淆的超级罐。

0

为AEM编写测试应该不难,Apache Sling社区提供了在不同级别测试的方法,因为AEM基于Sling,我们可以使用相同的工具。

结帐以下链接: