The  Ruby  Way  (Test) Meet a  Test  world [email_address]
什么是测试? 1. 测试是通过一系列手段检查边界,检查可能出现问题的的地方,对运行数度和并发性进行测试,查找代码的漏洞,向软件设计,开发者和用户展示软件系统的不稳定和不可交付性。 2. 广义的说,测试是通过种种手段收集问题,生成报告,向项目决策...
测试的内容 1. 在测试中,按照测试的时间顺序和目的,分为: 单元测试 , 模块测试 , 集成测试 。 单元测试 :对被测代码每一个函数边界和功能检查。 模块测试 :当软件被按照模块划分开发时,在模块耦合之  前,对每一个模块进行的检查。 集成...
Ruby 中 测试框架 1.Ruby 是一个非常注重测试的语言,提供了一套测试框架,以进行单元测试和集成测试,名称为 RUBY 单元测试框架: ( Ruby Unit Testing Framework) ,保存与 Ruby 的 Runt 目录...
测试框架 1. 通过加载一行代码 require ‘test/unit’. 就给 Ruby 脚本加上了编写测试用例的能力。 一个简单的’ Hello world’ 测试例程( TestCase ): #hello_test require ’t...
Finished in 0.0 seconds. 1 tests,1assertions,0 failures, 0 errors 上面的输出结果: 1 tests,1assertions,0 failures, 0 errors 代表测试组合...
<ul><li>在 Ruby 的测试模块中有 4 个主要的角色,角色如下: </li></ul><ul><li>TestSuite: </li></ul><ul><li>TestCase: </li></ul><ul><li>tests: </...
1.Test Suite( 测试组合 ) :一个测试组合是一大堆测试用例的集合,运行了一个测试组合以后,它将执行该测试组合中的每一个属于它的测试,例如,可以通过创建一个测试组合,来包含每一个测试单元,这有利于小组不断的进行进行编译和打包集成,有...
测试流程 一个简单的测试框架: 在下面测试代码中,  UserVerify 用于表示用户校验模块,测试一个用户密码是否符合客户制定的安全规则,  UserVerify 中的  is_pass_format_ok? 方法将处理这个问题,如果用户的...
def is_pass-format_ok? return  false if @password.nil? return  false if @password.empty? return  false if @password.size <...
使用测试框架示例: require ‘test/unit’ class TC_UserTest < Test::Unit::TestCase def test_hello assert true  end def test_passwords ...
这段程序的输出结果如下所示: Loaded suite userpwd Started . F Finished in 0.016 seconds. …… . 测试用例错误的详细信息 注意 Started 下面的 . F (小圆点和 F ) ....
Test::Unit 支持的断言 <ul><li>assert(boolean,[message]) </li></ul><ul><li>如果为 false 或 nil ,则失败 </li></ul><ul><li>assert_nil(obj...
NetBeans 中的测试 <ul><li>Rails 创建应用程序的时候就已经生成 Test 整个目录 : </li></ul>
 
<ul><li>模型的测试叫做   单元测试 ( unit test ) , 控制器的测试叫做 功能测试 ( functional test ) , 对横跨多个控制器的业务流程进行的测试被称为 集成测试 ( integration test )...
测试专用数据库: <ul><li>在 </li></ul>
<ul><li>使用 rake:  db:test:prepare   任务,拥有了测试数据库和数据库架构。 </li></ul><ul><li>(NetBeans 中如何使用已有讲解 PPT) </li></ul><ul><li>测试夹具  ...
<ul><li>在执行每个测试方法之前, fixtures() 方法会根据指定的模型名称自动的加载对应的夹具,将其载入数据库: </li></ul><ul><li>加上 fixtures 指令意味在执行测试方法之前,表会首先清空,然后填上夹具中...
 
控制器的功能测试: <ul><li>功能的约定: </li></ul>
 
 
 
 
<ul><li>功能测试的关键在于 setup() 方法,它为每个功能测试方法初始化三件东西。 </li></ul><ul><li>@controller: 需要测试的控制器实例 </li></ul><ul><li>@request 包含了一个...
<ul><li>通过脚本创建 Controller  </li></ul>
 
修改后:
 
动态夹具 <ul><li>正如我们所料,除非有用户登陆,才能使用那些 action (前置过滤器),所以我们要模拟一个登陆用户,将用户 ID 放入 session 中, 用户的 ID 必须是合法的。创建 yaml 文件: </li></ul><...
Mock :
 
参考文章: <ul><li>http://www.builder.com.cn/2007/0901/482329.shtml </li></ul><ul><li>http://www.51testing.com/?action_viewnews...
To Be Continue……
Upcoming SlideShare
Loading in...5
×

The ruby way test

623

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
623
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

The ruby way test

  1. 1. The Ruby Way (Test) Meet a Test world [email_address]
  2. 2. 什么是测试? 1. 测试是通过一系列手段检查边界,检查可能出现问题的的地方,对运行数度和并发性进行测试,查找代码的漏洞,向软件设计,开发者和用户展示软件系统的不稳定和不可交付性。 2. 广义的说,测试是通过种种手段收集问题,生成报告,向项目决策者提供决策依据,测试人员又称为质量保证人员,是软件开发的最后一道关卡。 3. 测试的目的 不是为了证明软件可以正确运行,与此相反,测试的目的是为了找到软件的漏洞,从而证明程序代码是否能交付。
  3. 3. 测试的内容 1. 在测试中,按照测试的时间顺序和目的,分为: 单元测试 , 模块测试 , 集成测试 。 单元测试 :对被测代码每一个函数边界和功能检查。 模块测试 :当软件被按照模块划分开发时,在模块耦合之 前,对每一个模块进行的检查。 集成测试 :对于模块整合之后的测试或称为系统测试。
  4. 4. Ruby 中 测试框架 1.Ruby 是一个非常注重测试的语言,提供了一套测试框架,以进行单元测试和集成测试,名称为 RUBY 单元测试框架: ( Ruby Unit Testing Framework) ,保存与 Ruby 的 Runt 目录,包括 TestSuite , TestCace , tests , 和 Assertions 4 个部分 .
  5. 5. 测试框架 1. 通过加载一行代码 require ‘test/unit’. 就给 Ruby 脚本加上了编写测试用例的能力。 一个简单的’ Hello world’ 测试例程( TestCase ): #hello_test require ’test/unit’ class TC_HelloTest<Test::Unit::TestCase def test_hello puts “test_hello” assert true end end 测试的结果如下: Loaded suite testhello started test_hello
  6. 6. Finished in 0.0 seconds. 1 tests,1assertions,0 failures, 0 errors 上面的输出结果: 1 tests,1assertions,0 failures, 0 errors 代表测试组合的测试已经成功执行,它有一个测试,一个断言,耗费了 0.0 秒, 0 failures, 0 errors 没有一个错误。下面是对代码的解释: 1.require ‘test/unit’ 在编写单元测试的时候,应该始终包含 require ‘test/unit’ ,它包含了可以编 写和运行单元测试的类和功能,提供对测试组合的操作。 2 . class TC_HelloTest<Test::Unit::TestCase 必须有一个 Test::Unit::TestCase 的 派生类 , TestCase 类是测试例程的宿主 3 . def test_hello 测试执行的函数,输出 “ test_hello” ,所有的测试方法必须遵循如下命名规范:名称必须以 test 开头,测试框架将不认为它是测试方法,也不会自动运行,他是一个普通 Ruby 方法。 4. assert true 断言是测试方法
  7. 7. <ul><li>在 Ruby 的测试模块中有 4 个主要的角色,角色如下: </li></ul><ul><li>TestSuite: </li></ul><ul><li>TestCase: </li></ul><ul><li>tests: </li></ul><ul><li>assertions: </li></ul><ul><li>他们之间的关系是 : TestSuite<<TestCase<<tests<<assertions. </li></ul>TestSuite TestCase test test he TestCase Test Assertion1
  8. 8. 1.Test Suite( 测试组合 ) :一个测试组合是一大堆测试用例的集合,运行了一个测试组合以后,它将执行该测试组合中的每一个属于它的测试,例如,可以通过创建一个测试组合,来包含每一个测试单元,这有利于小组不断的进行进行编译和打包集成,有利于提高测试速度和测试的质量,上面的 testhello.rb 就是一个测试组合。 2.TestCase (测试例程): 测试例程是一个继承与 Test::Unit::TestCase 的类,包含了以 test 开头命名的测试方法,以及和内容相关的测试策略。 3. tests (测试)方法 :包含了断言和测试操作的方法,以 test 开头,表示某一特定的测试场景。 4.assertion( 断言 ) :用来判断一个对象(或表达式)是否是希望的结果。
  9. 9. 测试流程 一个简单的测试框架: 在下面测试代码中, UserVerify 用于表示用户校验模块,测试一个用户密码是否符合客户制定的安全规则, UserVerify 中的 is_pass_format_ok? 方法将处理这个问题,如果用户的密码通过了测试规则,将返回 TRUE, 否则,将返回 FASLE 并且断言立即中止,不再执行。 测试代码: class UserVerity attr_accessor :username ,:password def initialize(username,password) @forbidwords =[‘123456’] @username =username @password =password end
  10. 10. def is_pass-format_ok? return false if @password.nil? return false if @password.empty? return false if @password.size < 6 return false if @ forbidwords? (@ password ) return false if @password =~/[rnt]?/ return false if @password == @username true end end
  11. 11. 使用测试框架示例: require ‘test/unit’ class TC_UserTest < Test::Unit::TestCase def test_hello assert true end def test_passwords assert UserVerity.new(“root”,”abc”).is_pass_format_ok? assert UserVerity.new(“root”,”123456”).is_pass_format_ok? assert UserVerity.new(“root”,”1234567890”).is_pass_format_ok? assert UserVerity.new(“root”,”password”).is_pass_format_ok? assert UserVerity.new(“root”,”user”).is_pass_format_ok? assert UserVerity.new(“root”,”root”).is_pass_format_ok? assert UserVerity.new(“root”,”nil”).is_pass_format_ok? assert UserVerity.new(“root”,”1”).is_pass_format_ok? assert UserVerity.new(“root”,”n”).is_pass_format_ok?
  12. 12. 这段程序的输出结果如下所示: Loaded suite userpwd Started . F Finished in 0.016 seconds. …… . 测试用例错误的详细信息 注意 Started 下面的 . F (小圆点和 F ) . : 测试通过。 F :测试失败 。 E :发生错误。
  13. 13. Test::Unit 支持的断言 <ul><li>assert(boolean,[message]) </li></ul><ul><li>如果为 false 或 nil ,则失败 </li></ul><ul><li>assert_nil(obj,[message]) </li></ul><ul><li>assert_not_nil(obj,[message]) </li></ul><ul><li>预期对象为 nil (或不为) nil </li></ul><ul><li>assert_equal(excepted,actual,[message]) </li></ul><ul><li>assert_not_equal(excepted,actual,[message]) </li></ul><ul><li>使用 == 来判定 excepted 和 actual 是否相等 </li></ul>
  14. 14. NetBeans 中的测试 <ul><li>Rails 创建应用程序的时候就已经生成 Test 整个目录 : </li></ul>
  15. 16. <ul><li>模型的测试叫做 单元测试 ( unit test ) , 控制器的测试叫做 功能测试 ( functional test ) , 对横跨多个控制器的业务流程进行的测试被称为 集成测试 ( integration test ) . </li></ul><ul><li>单元测试 : </li></ul>
  16. 17. 测试专用数据库: <ul><li>在 </li></ul>
  17. 18. <ul><li>使用 rake: db:test:prepare 任务,拥有了测试数据库和数据库架构。 </li></ul><ul><li>(NetBeans 中如何使用已有讲解 PPT) </li></ul><ul><li>测试夹具 Test Fixtures </li></ul><ul><li>负责指定模型对象初始的内容,使测试的表在每个单元测试开始之前具有同样的内容,在 yaml 文件中创建测试数据,文件名必须与表名相匹配。 </li></ul>
  18. 19. <ul><li>在执行每个测试方法之前, fixtures() 方法会根据指定的模型名称自动的加载对应的夹具,将其载入数据库: </li></ul><ul><li>加上 fixtures 指令意味在执行测试方法之前,表会首先清空,然后填上夹具中的记录。每个测试方法都会使用一张全新的表。 </li></ul><ul><li>使用模型类型提供的查找方法来读取数据,只要传入 yaml 夹具中定义的记录名称,例: Product.new( :id => products(:ruby_book).id), 该方法返回包含该条记录的数据的模型对象,其中包含在夹具中定义的数据。 </li></ul>
  19. 21. 控制器的功能测试: <ul><li>功能的约定: </li></ul>
  20. 26. <ul><li>功能测试的关键在于 setup() 方法,它为每个功能测试方法初始化三件东西。 </li></ul><ul><li>@controller: 需要测试的控制器实例 </li></ul><ul><li>@request 包含了一个请求的对象 </li></ul><ul><li>请求对象包含了所有输入的请求信息和数据: http 头信息 ,post 和 get 数据等,在测试环境下,我们会使用一个特别的请求对象,不依赖于真是的请求 (Mock). </li></ul><ul><li>@response 包含了一个应答对象 </li></ul><ul><li>每当处理来自浏览器的请求时, RAILS 都会准备一个应答对象,模板会将数据渲染到应答对象中,返回的状态码也会记录在应答对象中,应用程序完成请求处理后, RAILS 就会取出应答对象中信息,根据这些信息向浏览器发送应答。 </li></ul>
  21. 27. <ul><li>通过脚本创建 Controller </li></ul>
  22. 29. 修改后:
  23. 31. 动态夹具 <ul><li>正如我们所料,除非有用户登陆,才能使用那些 action (前置过滤器),所以我们要模拟一个登陆用户,将用户 ID 放入 session 中, 用户的 ID 必须是合法的。创建 yaml 文件: </li></ul><ul><li>Yaml 文件中依然可以调用模型对象 </li></ul><ul><li>最后在测试类中加上 fixtures 声明。 </li></ul>
  24. 32. Mock :
  25. 34. 参考文章: <ul><li>http://www.builder.com.cn/2007/0901/482329.shtml </li></ul><ul><li>http://www.51testing.com/?action_viewnews_itemid_70460.html </li></ul><ul><li>http://www.cnblogs.com/dahuzizyd/archive/2007/11/20/ruby_rails_dotnet_study_24.html </li></ul><ul><li>http://my4java.itpub.net/post/9983/55687 </li></ul><ul><li>http://www.ruby-lang.org.cn/forums/viewthread.php?tid=2342 </li></ul><ul><li>http://www.cnblogs.com/dahuzizyd/archive/2007/11/20/ruby_rails_dotnet_study_24.html </li></ul>
  26. 35. To Be Continue……
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×