单元测试
单元测试针对model,主要是测试model中的业务规则,测试model中的验证validates规则。
单元测试的文件存放在test/unit文件夹,针对user的model的单元测试文件是user_test.rb。
常用命令
从db/schema.rb中同步测试数据库的结构。
在数据库结构变化之后,就需要执行这个命令,保持测试数据库的结构和最新的数据库结构一致。
- rake db:test:prepare
还有其他的一些相关命令。
Tasks | Description |
---|---|
rake db:test:clone | 重建测试数据库结构 |
rake db:test:clone_structure | 根据开发环境的数据库结构,重建测试数据库 |
rake db:test:load | 从schema.rb重建测试数据库 |
rake db:test:prepare | 检查挂起的数据库变更migration,将变化加载到测试数据库 |
rake db:test:purge | 清空测试数据库 |
如何编写并进行单元测试
在使用rails g model user或者rails g scaffold user的时候,会自动在test/unit文件夹中创建model对应的单元测试文件。
- require 'test_helper'
- class UserTest < ActiveSupport::TestCase
- test "email invalid" do
- user = users(:one)
- assert user.invalid?, "email invalid"
- end
- test "email invalid two" do
- user=users(:two)
- assert user.invalid?
- end
- test "password do not match" do
- user =users(:three)
- assert user.invalid?
- end
- test "all fields are valid" do
- user=User.new(:nickname=>"nickname",:email=>"sdf@13123.xo",
- :password=>"123456",
- :password_confirmation=>"123456")
- assert user.valid?
- end
- test "password and password_confirmation do not match" do
- user = User.new(:nickname=>"asdf",:email=>"asdfasdf",:password=>"123",
- :password_confirmation=>"234")
- assert user.invalid?
- end
- end
app/model/user.rb
- class User < ActiveRecord::Base
- attr_accessible :email, :nickname, :password, :password_confirmation
- attr_accessor :password, :password_confirmation
- validates :password, :confirmation => true
- validates :password_confirmation, :presence => true
- validates :email, :presence => true, :uniqueness => true, :format => { :with => /^\w+@\w+\.\w+$/ },
- :length => { :maximum => 40 }
- validates :nickname, :presence => true, :length => { :in =>1..30 }
- end
test/fixtures/users.yml
- one:
- nickname: nickname1
- email: invalidemail
- two:
- nickname: nickname2
- email: invalideamil@
- three:
- nickname: nickname3
- email: validemail@123.com
- four:
- nickname: nickname4
- email: validemail@baidu.com
- require 'test_helper'
- class UserTest < ActiveSupport::TestCase
- end
类名为model名+Test,继承自ActiveSupport::TestCase。
- require 'test_helper'
- class UserTest < ActiveSupport::TestCase
- test "email invalid" do
- user = users(:one)
- assert user.invalid?, "email invalid"
- end
- end
针对邮件格式的测试,首先加载模拟数据users(:one),然后用断言assert验证user.email是否无效。也就是验证我们在user的model中写的validates是否有效。也可以不加载模拟数据,自己创建实体数据。
- require 'test_helper'
- class UserTest < ActiveSupport::TestCase
- test "email invalid" do
- user = User.new(:email=>"asdf", :nickname=>"nickname")
- assert user.invalid?, "email invalid"
- end
- end
执行单个文件中的测试。
- ruby -Itest test/unit/category_test.rb
也可以使用
- rake test TEST=test/unit/category_test.rb
如果想执行全部的单元测试,就执行下面的命令。
- rake test:units
执行的结果如下。
- blog git:(develop) rake test TEST=test/unit/user_test.rb
- Run options:
- # Running tests:
- .....
- Finished tests in 0.539807s, 9.2626 tests/s, 9.2626 assertions/s.
- 5 tests, 5 assertions, 0 failures, 0 errors, 0 skips
在Running tests:下面是5个. ,每个.对应一个测试,对应一个test...do。.代表测试通过,如果是F代表测试失败,E代表抛出异常。
再下面是花费的时间,已经每秒可以执行的测试个数,每秒可以执行断言assert的个数。
再下面是一些统计信息,测试个数,断言个数,失败个数,错误个数,跳过的个数。
断言assert
断言是测试常用的一个方法。
常用的端阳包括
- boolean的断言assert user.valid?。
- equal的断言assert_equal(obj1, obj2), assert_not_equal(obj1, obj2)。
- nil的断言assert_nil(obj),assert_not_nil(obj)。
- same的断言assert_same(obj1, obj2),assert_not_same(obj1, obj2)。
更多的断言可以去http://guides.rubyonrails.org/testing.html查看
本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1075391,如需转载请自行联系原作者