Ruby中单元测试(Unit Test)方法

Kalika ·
更新时间:2024-09-20
· 772 次阅读

  Ruby中也提供了单元测试的框架,类似Java中的JUnit,此框架在Ruby中被成为mini test。

  我们先看一个例子,这个是我的源代码:

require'json' modulePMU_INTERFACE     classIUserLoginReq         definitialize(command_id=nil, user_name=nil, user_password=nil, auth_code=nil, token=nil)             @command_id= command_id             @user_name= user_name             @user_password= user_password             @auth_code= auth_code             @token= token         end           defto_json(*a)             {                 "json_class"=>self.class,                 "data"=>self.to_json_hash             }.to_json(*a)         end           defto_json_hash             {:command_id=>@command_id,:user_name=>@user_name,:user_password=>@user_password,:auth_code=>@auth_code,:token=>@token}         end           defself.json_create(json_str)             data = json_str["data"]             new(data["command_id"], data["user_name"], data["user_password"], data["auth_code"], data["token"])         end         attr_accessor:command_id,:user_name,:user_password,:auth_code     end       classIUserLoginResp         definitialize(result=nil, user_name=nil, user_password =nil)             #the login result             @result= result             #the token holding by client             @user_name= user_name             @user_password= user_password         end           defto_json(*a)             {                 "json_class"=>self.class,                 "data"=> {:result=>@result,:user_name=>@user_name,:user_password=>@user_password}             }.to_json(*a)         end           defself.json_create(json_str)             data = json_str["data"]             new(data["result"], data["user_name"], data["user_password"])         end           attr_accessor:result,:user_password,:user_name     end

  给上面的源代码写测试代码:

require'test/unit' require'json'   require_relative'../../../source/server/service/pmu_interface/app_interface' classTestInterface < Test::Unit::TestCase     deftest_user_login_req         req =PMU_INTERFACE::IUserLoginReq.new(1,'a@b.com','aa','1234','')         str = req.to_json         req2 =JSON.parse(str)         assert(str !=nil&& req2.command_id == req.command_id)     end       deftest_user_login_resp         req =PMU_INTERFACE::IUserLoginResp.new(1,'1234','1234')          str = req.to_json         req2 =JSON.parse(str)         assert(str !=nil&& req2.result == req.result)     end end  

  我们可以看到,测试类继承了Test::Unit::TestCase类,这个类在test/unit库中,test/unit库是Ruby的系统库,成为mini test。

  每个测试方法都是以test开头,这点也与JUnit的规则一致,然后assert也是一致,所以如果你熟悉JUnit,那么做Ruby代码的单元测试不用学习可以直接写。

  还有一点,我们都知道JUnit提供了TestSuite这个类,可以将很多TestCase汇总到一块执行,这个对于持续集成非常有用,因为持续集成需要执行所有的TestCase并输入报告。

  要在Ruby中执行TestSuite不是那么简单,因为Ruby内置的库里面没有包含TestSuite,需要额外安装一个第三方的gem(test-unit):

sudo gem install test-unit

  安装好了之后,可以使用TestSuite了:

require 'test/unit/testsuite' require 'test/unit/ui/console/testrunner' require_relative './service/pmu_dao/test_dao' require_relative './service/pmu_dao/test_db_conn_pool' require_relative './service/pmu_communication/test_comm8n' require_relative './service/pmu_service/test_user_service' require_relative './service/pmu_interface/test_interface'   class PMUTestSuite     def self.suite     suite = Test::Unit::TestSuite.new     suite << TestDBConnPool.suite     suite << TestDAOManager.suite         suite << TestMessageDispatcher.suite         suite << TestMessage.suite         suite << TestUserService.suite         suite << TestInterface.suite         return suite     end end   Test::Unit::UI::Console::TestRunner.run(PMUTestSuite)

  我们把每个TestCase都返回一个suite对象:suite << TestInterface.suite,然后增加到suite中,并使用TestRunner执行。

  我们要注意的是,mini test中的TestCase类是没有suite方法的(TestInterface.suite),suite方法是通过require 'test/unit/testsuite'之后,'test/unit/testsuite' 使用了ruby中module 的 mixin特性,给TestCase类增加了suite方法。

  后我们看运行结果:

Loaded suite Unnamed TestSuite Started ..latin1 tbl_car_private_info tbl_request tbl_task tbl_user_credit tbl_user_info tbl_user_login tbl_user_private_info ………E   Error: test_regist_all_handler(TestMessageDispatcher): ArgumentError: wrong number of arguments (0 for 1)     /Users/maoxuepeng/uproject/utopia-project-code/main/source/server/service/pmu_communication/comm8n.rb:125:in `regist_all_handlers’     /Users/maoxuepeng/uproject/utopia-project-code/main/test/service/pmu_communication/test_comm8n.rb:33:in `test_regist_all_handler’   .F   Failure: test_regist_handler_duplicate(TestMessageDispatcher) [/Users/maoxuepeng/uproject/utopia-project-code/main/test/service/pmu_communication/test_comm8n.rb:47]: <false> is not true.   …………   Finished in 0.231342 seconds.   26 tests, 25 assertions, 1 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications 92.3077% passed  

  注意结果中有两个用例,一个是错误一个执行失败。

  当然,TestSuite的执行结果是可以美化的,但是还没有研究,有兴趣的同学可以研究后交流一下。



单元 方法 单元测试 Ruby 测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号