我正在尝试为 JSF 找到一个实用的单元测试框架。
我知道 JSFUnit,但这对我来说非常不切实际。我需要在我的项目中包含大约 10 个 JAR,并跳过许多其他的环节来让它运行。
我意识到——由于需要模拟平台和客户端——对 Web 应用程序进行单元测试是很困难的。但是有更好的方法吗?
我正在尝试为 JSF 找到一个实用的单元测试框架。
我知道 JSFUnit,但这对我来说非常不切实际。我需要在我的项目中包含大约 10 个 JAR,并跳过许多其他的环节来让它运行。
我意识到——由于需要模拟平台和客户端——对 Web 应用程序进行单元测试是很困难的。但是有更好的方法吗?
您是否考虑过使用Selenium或其他工具进行集成测试?Selenium 允许您直接在浏览器中记录和运行测试。您还可以使用Selenium Remote Control在多个浏览器和多个平台上运行测试。
编写单元测试是好的,但它可能会提供更多来创建一些功能集成测试,而不是对表示层代码进行单元测试。
在我们涉足使用硒的那一刻,我正在从事的项目。实际上,我们花了很多时间编写这些 selenium 测试,但发现它们没有增加任何价值,因为 UI 变化很大,而您最终只会加倍努力而获得很少的投资回报。
selenium 的另一个问题是它需要部署您的代码,这意味着它不能很好地与单元测试框架(例如 maven)配合使用。
我想说的是,为托管 bean 编写真正好的单元测试是非常宝贵的。
您是否看过 jsfunitwar Ant 任务或 JSFUnit 提供的 Maven 插件?两者都大大降低了生成要测试的 .war 文件的复杂性。我在当前项目中使用 JSFUnit,发现白盒和黑盒测试功能的组合非常强大。因为 JSFUnit 在幕后使用 HtmlUnit,所以您可以非常轻松有效地检查生成的 HTML,或者反过来验证您的内部 JSF 支持 bean 的状态。我能够将 JSFUnit 测试合并到我的持续集成过程中,并且对结果非常满意。
HttpUnit 也可以作为替代方案。它提供了 api,因此您可以选择自动化测试。
Selenium 是肤浅的, jsfunit 是内向的。如果项目不简单,我建议使用 jsfunit。因为团队成员可以更改 jsf managedbean 名称等,所以您可以使用 jsfunit 来捕捉它。
我和 Paul 一起讨论 Selenium 非常容易设置和开始使用。我在 Firefox 中使用 Selenium IDE,并在该级别进行了一些自定义,然后您可以将它们导出到其他平台,例如 Java JUnit 测试。下载和启动 selenium-server.jar 非常容易,将 selenium-java-client-driver 添加到我现有的 Eclipse Maven POM 驱动程序项目中;然后在 Eclipse 中启动相同的导出 JUnit 测试。我主要想将 Java 用于基本 Selenium IDE 不支持的循环。
我也为我的项目配置了 JSF 单元,这确实需要更多时间来配置......更重要的是,尽管像 JSFUnit 这样的容器内测试对测试的更改需要重建 WAR,在容器中重新部署,然后从 Eclipse 或通过浏览器。因此,为了快速尝试一个小改动,这是非常耗时的。当然,使用 JSFUnit,您可以访问 JSFSession 等的所有内部结构,因此我猜这取决于您需要的测试粒度。
如果有人知道更快的方法来改变 JSFUnit 测试并执行它,我会很感兴趣。在这方面,Selenium 测试肯定更像 JUnit 测试。