跨越边界: 在集成框架中进行测试,第2部分

超越单元测试的扩展

在这由两部分组成的迷你系列的 第 1 部分 中,了解了如何用动态语言促进单元测试。本文将展示集 成环境在功能测试和集成测试中的优势。单元测试包括对小的代码片断(例如方法)的测试,而且经常要 把它们与周围的元素隔离开。功能测试和集成测试所测试的应用程序部分越来越多。功能测试用于测试单 一特性(通常涉及一个接口)、执行任务的业务代码,以及与中间件服务交互的代码(例如数据库)。集 成测试用于测试应用程序的多个不同特性。(功能测试在不太严谨的情况下通常也被称为集成测试。)

Java 开发人员在解决单元测试问题上已经获得了令人注目的成果,但在集成测试上则没有带来太多令 人兴奋的消息。多数 Java 测试框架(如 JUnit 或 TestNG)主要侧重于单元测试。Java 编程中缺乏集 成测试框架的一个原因是缺乏集中的架构或开发哲学。在后面的小节中,我将继续使用 Ruby on Rails 示例,这次的重点放在功能测试和新的 Rails 集成测试框架上。您将看到,在使用集成测试框架时,进 行测试要容易得多。

运行测试

如果还没有阅读 第 1 部分,那么请先阅读它。然后,如果想跟随这篇文章一起编写代码,那么请确 保您已经获得一个可工作的 Rails 应用程序。在第 1 部分中,实现了一个简单的单元测试和几个 fixture。如果您跟随第 1 部分一起编写了代码,但是记不清是否使应用程序处于工作状态,那么您可以 利用测试用例,先切换到项目目录,然后运行 rake 即可。清单 1 显示了我的结果:

清单 1. 用 rake 运行所有测试

> bruce-tates-computer:~/rails/trails batate$ rake
(in /Users/batate/rails/trails)
/usr/local/ror/bin/ruby -Ilib:test
  "/usr/local/ror/lib/ruby/gems/1.8/gems/rake-0.7.0/lib/rake/rake_test_loader.rb"
  "test/functional/trails_controller_test.rb"
Loaded suite /usr/local/ror/lib/ruby/gems/1.8/gems/rake- 0.7.0/lib/rake/rake_test_loader
Started
EEEEEEEEEEEEEEEE
Finished in 0.070797 seconds.
  1) Error:
test_create(TrailsControllerTest):
Errno::ENOENT: No such file or directory - /tmp/mysql.sock
   /usr/local/ror/lib/ruby/gems/1.8/gems/activerecord-1.14.0/
    lib/active_record/vendor/mysql.rb:104:in 'initialize'
   /usr/local/ror/lib/ruby/gems/1.8/gems/activerecord-1.14.0/
    lib/active_record/vendor/mysql.rb:104:in 'real_connect'
   /usr/local/ror/lib/ruby/gems/1.8/gems/activerecord-1.14.0/
    lib/ active_record/connection_adapters/mysql_adapter.rb:331:in 'connect'

...results deleted...
8 tests, 0 assertions, 0 failures, 16 errors
/usr/local/ror/bin/ruby -Ilib:test "/usr/local/ror/lib/ruby/gems/1.8/gems/rake-0.7.0/
  lib/rake/rake_test_loader.rb" 
rake aborted!
Test failures
(See full trace by running task with --trace)

可以看到有一些问题存在:rake 生成了 16 个错误。跟踪显示,Rails 无法建立连接。我忘记启动数 据库引擎了。我将启动数据库引擎,然后再次运行 rake。这次我得到了清单 2 所示的结果:

清单 2. 在 rake 内通过测试

rake
(in /Users/batate/rails/trails)
/usr/local/ror/bin/ruby -Ilib:test
  "/usr/local/ror/lib/ruby/gems/1.8/gems/rake-0.7.0/lib/rake/rake_test_loader.rb"
  "test/unit/trail_test.rb"
Loaded suite /usr/local/ror/lib/ruby/gems/1.8/gems/rake- 0.7.0/lib/rake/rake_test_loader
Started
...
Finished in 0.09541 seconds.
3 tests, 5 assertions, 0 failures, 0 errors
/usr/local/ror/bin/ruby -Ilib:test
  "/usr/local/ror/lib/ruby/gems/1.8/gems/rake-0.7.0/lib/rake/rake_test_loader.rb"
  "test/functional/trails_controller_test.rb"
Loaded suite /usr/local/ror/lib/ruby/gems/1.8/gems/rake- 0.7.0/lib/rake/rake_test_loader
Started
........
Finished in 0.169756 seconds.
8 tests, 28 assertions, 0 failures, 0 errors

这样就好多了。测试正常运行,而我们准备构建更多测试用例。如果仔细查看清单 2 就会发现,rake 生成了两组结果。第一组(第 1 部分的单元测试)看起来应当熟悉。下一组是从框架中自动生成的功能 测试。

时间: 2024-09-20 00:03:11

跨越边界: 在集成框架中进行测试,第2部分的相关文章

跨越边界: 在集成框架中进行测试,第1部分

捕获 bug 我还记得当我第一次得到自动测试的 bug 时的情况.在一次大会上,当我做完叫做 Bitter Java 的 演讲之后,Mike Clark(Java 社区的自动测试大师,性能调整工具 JUnitPerf 的作者(请参阅 参考资 料),现在是 Ruby on Rails 专家)走近我.Mike 告诉我有一种方法可以通过自动测试改进我的演讲. 在那次大会的剩余时间里,我跟着他四处走,看到了我能看到的尽可能多的他的测试会议.我开始使用他 推荐的技术,并对把红条(代表测试失败)变成绿条(代

跨越边界: 活动记录和Java编程中特定于域的语言

DSL 是专门解决特定于域问题的语言.通过更接近问题的操作,DSL 可以提供在通用语言中可能找不 到的好处.Java 世界中充满了 DSL.属性文件.Spring 上下文.标注的某种用法以及 Ant 任务,都是 DSL 的示例. 在开始研究其他像 Ruby 这样的语言的时候,我开始理解到 Java 语言目前对于 DSL 还没有良好的把 握.在这篇文章中,将看到 Ruby 使用的四种集成干净的 DSL 的技巧.然后,将看到在 Java 语言中可 能存在的选项是什么. 隐藏语言的世界 虽然您可能不知

《Metasploit渗透测试手册》—第1章1.8节在Metasploit框架中建立数据库

1.8 在Metasploit框架中建立数据库 Metasploit渗透测试手册 Metasploit的重要特点是包括用于存储渗透测试结果的数据库.渗透测试涉及大量信息,并且持续数天,因此存储中间结果是必要的.因此,好的渗透测试工具应该正确地整合数据库,以便快速高效地存储结果. 准备 默认情况下,Metasploit将自带的PostgreSQL作为基础数据库.在BackTrack上,还有另外一种选择,也就是MySQL数据库.用户可以使用这两种数据库中的任一种.我们先来看一下PostgreSQL数

java-JAVA问题:关于Spring框架中提供的测试框架

问题描述 JAVA问题:关于Spring框架中提供的测试框架 这是教程视频中截的图,备注上说了,这个注解括号里的参数填源码编译后的路径(web中就是classes,普通项目就是bin),而下面的实际操作中,他怎么把Spring配置文件的路径填进去了,不太理解,这是为什么??? 解决方案 spring是一个容器 通过 xml 管理bean 所以 他的路径可以在xml里定义 解决方案二: spring 测试框架Spring TestContext 测试框架

obotium测试框架-在使用Robotium自动测试框架中遇到问题,求大神解答

问题描述 在使用Robotium自动测试框架中遇到问题,求大神解答 我测试一个Activity,想点击最下方id为video_iv的imageview,代码如下: @Before protected void setUp() throws Exception { super.setUp(); this.solo = new Solo( this.getInstrumentation(), this.getActivity() ); } @After protected void tearDown

跨越边界: Ruby on Rails的秘笈是什么?

Ruby on Rails(也叫做 Rails)是一个针对支持数据库的 Internet 应用程序的 Ruby 框架.我现在 已经将 Rails 用于两个不同的应用程序并涉及了另外两个关联的程序.为了即将完成的新书 Java to Ruby(参见 参考资料),我已经采访了很多 Rails 开发人员(那些在该框架上既成功也失败过的人). 框架的创始人和 Rails 书籍的旗舰之作 Agile Web Development with Rails(参见 Resources)的主要 作者.我开始理解为

跨越边界: 闭包

10 年前,我刚刚开始山地自行车运动的时候,我更愿意选用零件尽可能少尽可能简单的自行车.稍后 ,我意识到一些零件(如后减震器)可以保护我的背部和我自行车的框架在德克萨斯州高低起伏的山区中 免受损害.我于是可以骑得更快,出问题的次数也渐少.虽然随之带来了操作上的复杂性和维护需求的增 加,但对于我来说这点代价还是值得的. 关于闭包这个问题,Java 爱好者们现在陷入了类似的争论中.一些人认为闭包带给编程语言的额外复 杂性并不划算.他们的论点是:为了闭包带来的一点点便利而打破原有语法糖的简洁性非常不值

跨越边界: Streamlined,第1部分

我生平首次参加马拉松培训.马拉松培训最有趣的方面--实际上,也是惟一的方面--就是提高不 断叠加所带来的影响.有时,我为了提高效率而进行专门为了改进身体条件而设计的长短跑.有时,在跑 步过程中,我学习避免小的错误,避免重复多余的姿势(多余的姿势对单个步幅没有太大影响,但却会在 整个 26.2 英里的跑步过程中浪费能量或伤害到我).我每周都有提高,可每周之间的区别并不显著.但 是一个训练计划周期过后,我会从最初只能跑 4 英里提高到能跑 26.2 英里.软件开发也与此类似.如 果持续进行小的改进,

跨越边界: JavaScript语言特性

JavaScript 常被人们认为是编程语言中无足轻重的一员.这种观点的形成可以"归功"于 其开发工具.复杂且不一致的面向 HTML 页面的文档对象模型以及不一致的浏览器实现.但 JavaScript 绝对不仅仅是一个玩具这么简单.在本文中,Bruce Tate 向您介绍了 JavaScript 的语言特性. 几乎每个 Web 开发人员都曾有过诅咒 JavaScript 的经历.这个备受争议的语言受累于其复杂的称为 文档对象模型 (DOM)的编程模型.糟糕的实现和调试工具以及不一致的浏