单元测试冰面

Posted

技术标签:

【中文标题】单元测试冰面【英文标题】:Unit testing icefaces 【发布时间】:2010-12-19 13:57:41 【问题描述】:

您能否分离 IceFaces 应用程序的组件,以便可以单独测试它们,而不是在组装的应用程序上使用 Selenium 或 HttpUnit 之类的东西?

支持 bean 可以很容易地隔离(如果编写为可测试的话),但我有兴趣测试应用程序的模板/显示部分,同时尽可能少地使用应用程序的其余部分。这可以做到吗?怎么样?

有没有办法使用“虚拟数据”将 IceFaces 对象呈现为文本,然后我可以通过传统的单元测试运行?

我可以想办法完成所有这些,但它们涉及创建多个应用程序(我希望测试的每个组件一个)。然而,这似乎是一种次优的做事方式。

【问题讨论】:

致所有有抱负的框架设计师...请考虑如何最好地适应设计阶段的测试。 :-P 阿门!这绝对是一个需要考虑的设计约束。 【参考方案1】:

这并不是您所要求的,但JSFUnit(使用 JUnit、Cactus、htmlUnit 和 HttpUnit)似乎是在 JSF 领域进行测试的重要候选者。你考虑过这个选项吗?也许看看JSFUnit Wiki 和它的Getting Started Guide。

请注意,FAQ 报告了 IceFaces 的一些问题,但它已经很老了(2009 年初),并且从那时起情况可能已经改变(在 JBoss 存储库中有一些演示项目,如 jboss-jsfunit-examples-icefaces 或 icefaces-demo-address,因此它可能值得在 JSFUnit 或 IceFaces 邮件列表上询问确切状态。

编辑:正如评论中提到的,OP 正在寻找不那么“高级”的东西。也许看看Shale Test Framework:

Shale 测试框架提供模拟 对象库,加上基类 用于创建您自己的 JUnit TestCases。

模拟对象在包中提供 org.apache.shale.test.mock 为 以下容器 API:

JavaServer Faces 小服务程序

免责声明:Apache Shale 于 2009 年 5 月进入Attic(即它已经到了生命的尽头),但我不知道任何其他“成熟”的 JSF 模拟框架,所以我还是要提到它(the代码还在)。我会以对其他解决方案非常感兴趣的方式关注此线程:)

【讨论】:

是的,我确实看过。可悲的是,这对我的需求来说太“高水平”了。我想像 JSFUnit 那样单独测试每个部分而不是整个堆栈。【参考方案2】:

如果我正确理解您的问题,那么为您的页面创建特殊的虚拟支持 bean,然后创建将这些 bean 映射到 .jspx 文件的测试 JSF 配置文件应该是一件简单的事情。当然,虚拟 bean 不会涉及任何业务逻辑或后端服务——它们只是简单的数据集,在您的测试中很容易验证。

创建一个 ant 脚本来替换您的虚拟支持 bean 和测试配置文件。运行你的测试。如果您不想要像 HTTPUnit 这样繁重的东西,并且如果您在应用程序中使用 Spring,请查看 this blog post 以获得在没有 Web 服务器的情况下模拟完整 Web 上下文的绝佳方法。您的测试可能需要嗅探原始 HTML 输出以验证结果。这会很棘手,因为 IceFaces 喜欢处理 DIV ID 和 DOM 树的其他相关部分,您可能想要嗅探这些部分。 (仅此一项可能就是很少有 JSF 开发人员尝试对 JSF 输出进行单元测试的原因。)

一旦您的测试得到验证,将常规 bean 和配置文件交换回应用程序。

瞧!您刚刚对 JSF 组件进行了单元测试。

请注意,交换 bean 和配置文件的整个业务是一团糟。如果 IceFaces 使用 Spring 将支持 bean 与 JSF 页面匹配会容易得多——然后您可以简单地在 application.xml 中定义带有相关测试类的测试 bean。但这就是生活。

祝你好运,让我知道你的效果如何!

【讨论】:

以上是关于单元测试冰面的主要内容,如果未能解决你的问题,请参考以下文章

.NET 单元测试的艺术&单元测试之道C#版

什么是单元测试?如何做好单元测试?

测试篇——初探单元测试

单元测试

Java单元测试介绍

Android如何进行单元测试(转)