agile development with ruby · 2009. 12. 2. · 28th august, agile mumbai '05 how does ruby...
TRANSCRIPT
![Page 1: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/1.jpg)
Agile Development with Agile Development with
RubyRuby
PremshreePremshree PillaiPillai
YYAAHHOOOO!!
ppillai@[email protected]
![Page 2: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/2.jpg)
28th August, Agile Mumbai '05
What is Agile?What is Agile?
►►TestTest--driven developmentdriven development
►►Incremental developmentIncremental development
►►Continual deliveryContinual delivery
►►Software over documentationSoftware over documentation
![Page 3: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/3.jpg)
28th August, Agile Mumbai '05
How does Ruby facilitate agile How does Ruby facilitate agile
development?development?
►►TestTest--driven development (using unit testing driven development (using unit testing
modules)modules)
�� User storiesUser stories
�� Limited number of stories considered at a timeLimited number of stories considered at a time
�� Unit tests written before actual codeUnit tests written before actual code
�� Tests for the specificationTests for the specification
►►More testingMore testing
�� IntrospectionIntrospection
![Page 4: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/4.jpg)
28th August, Agile Mumbai '05
If you're new to RubyIf you're new to Ruby……
►►InterpretedInterpreted
►►Pure OOPure OO
►►Dynamic, strong typedDynamic, strong typed
►►Often compared to Perl and PythonOften compared to Perl and Python
![Page 5: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/5.jpg)
28th August, Agile Mumbai '05
Testing: Looking at objectsTesting: Looking at objects
classclassclassclassclassclassclassclass MyClassMyClass……
endendendendendendendend
objobj = = MyClass.newMyClass.new
ObjectSpaceObjectSpaceObjectSpaceObjectSpaceObjectSpaceObjectSpaceObjectSpaceObjectSpace..each_objecteach_objecteach_objecteach_objecteach_objecteach_objecteach_objecteach_object(MyClass(MyClass) { |x| ) { |x| p x }p x }
Returns <MyClass:0x812e658>Returns <MyClass:0x812e658>
![Page 6: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/6.jpg)
28th August, Agile Mumbai '05
Testing: Looking inside objectsTesting: Looking inside objects
classclass MyClassMyClass
defdef foofoo
……
endend
defdef barbar
……
endend
endend
ObjObj = = MyClass.newMyClass.new
pp obj.obj.methodsmethods
Returns Returns ["["foofoo", "bar"]", "bar"]
![Page 7: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/7.jpg)
28th August, Agile Mumbai '05
Testing: Looking inside objects Testing: Looking inside objects
(contd.)(contd.)
►►obj.obj.respond_torespond_to?? ((method_to_testmethod_to_test))
►►obj.obj.idid
►►obj.obj.classclass
►►obj.obj.kind_ofkind_of?? type_to_testtype_to_test
►►obj.obj.instance_ofinstance_of?? class_to_testclass_to_test
![Page 8: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/8.jpg)
28th August, Agile Mumbai '05
Testing: Classes and methodsTesting: Classes and methods
►► ClassesClasses�� MyClass.MyClass.private_instance_methodsprivate_instance_methods
�� MyClass.MyClass.protected_instance_methodsprotected_instance_methods
�� MyClass.MyClass.public_instance_methodspublic_instance_methods
�� MyClass.MyClass.singleton_methodssingleton_methods
�� MyClass.MyClass.constantsconstants
�� MyClass.MyClass.superclasssuperclass..constantsconstants
►►MethodsMethods�� MyClass_obj.MyClass_obj.sendsend("("method_namemethod_name")")
�� MyClass_obj.MyClass_obj.methodmethod("("method_namemethod_name")")
![Page 9: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/9.jpg)
28th August, Agile Mumbai '05
Unit testing with Ruby: ModulesUnit testing with Ruby: Modules
►► Test::UnitTest::Unit
requirerequire 'test/unit''test/unit'classclass TC_ClassToTestTC_ClassToTest < < Test::Unit::TestCaseTest::Unit::TestCase
defdef test_method_to_testtest_method_to_testassert_equal("expectedassert_equal("expected output",output",
""actual_outputactual_output",",""some_stringsome_string")")
endendendend
►► RubyUnitRubyUnit
![Page 10: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/10.jpg)
28th August, Agile Mumbai '05
Mock objectsMock objects
mock = mock = Object.newObject.new
mock.extend(Test::Unit::Assertmock.extend(Test::Unit::Assert))
defdef mock.method_called_by_testeemock.method_called_by_testee
assert_equal("expectedassert_equal("expected output",output",
"actual output","actual output",
""some_stringsome_string")")
endend
testObject.something_with(mocktestObject.something_with(mock))
![Page 11: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/11.jpg)
28th August, Agile Mumbai '05
RubyUnitRubyUnit
►► Initial setup:Initial setup:
requirerequire ''runit/testcaserunit/testcase''requirerequire ''runit/cui/testrunnerrunit/cui/testrunner''requirerequire ''myclassmyclass' # class under test ' # class under test (CUT)(CUT)
►► Test class (TC):Test class (TC):
classclass Testing_classTesting_class < < RUNIT::TestCaseRUNIT::TestCase……
endend
![Page 12: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/12.jpg)
28th August, Agile Mumbai '05
RubyUnitRubyUnit (contd.)(contd.)
►►Methods of test class begin with Methods of test class begin with test_test_
classclass Testing_classTesting_class < <
RUNIT::TestCaseRUNIT::TestCase
defdef test_1test_1
……
endend
endend
![Page 13: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/13.jpg)
28th August, Agile Mumbai '05
RubyUnitRubyUnit (contd.)(contd.)
►► RUNIT::TestCaseRUNIT::TestCase methodsmethods
�� assert_fail(messageassert_fail(message))
�� assert(booleanassert(boolean, message=""), message="")
�� assert_equal(expectedassert_equal(expected, actual, , actual,
message="")message="")
�� assert_same(expectedassert_same(expected, actual, message=""), actual, message="")
�� assert_nil(objassert_nil(obj, message=""), message="")
�� assert_respond_to(methodassert_respond_to(method, , objobj, ,
message="")message="")
�� assert_kind_of(cassert_kind_of(c, , objobj, message=""), message="")
![Page 14: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/14.jpg)
28th August, Agile Mumbai '05
RubyUnitRubyUnit (contd.)(contd.)
►►RUNIT::TestCaseRUNIT::TestCase methods (contd.)methods (contd.)
�� assert_instance_of(cassert_instance_of(c, , objobj , ,
message="")message="")
�� assert_match(strassert_match(str, re, message=""), re, message="")
�� assert_send(obj1, op, *assert_send(obj1, op, *argsargs))
�� ……
![Page 15: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/15.jpg)
28th August, Agile Mumbai '05
RubyUnitRubyUnit: Running tests: Running tests
►►Running a specific testRunning a specific test
RUNIT::CUI::TestRunner.run(Testing_cRUNIT::CUI::TestRunner.run(Testing_class.new("lass.new("some_test_methodsome_test_method"))"))
►►Running a test suiteRunning a test suite
RUNIT::CUI::TestRunner.run(TestiRUNIT::CUI::TestRunner.run(Testing_class.suiteng_class.suite))
![Page 16: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/16.jpg)
28th August, Agile Mumbai '05
RubyUnitRubyUnit: Sample template test code: Sample template test code
ifif __FILE__ == $0__FILE__ == $0
requirerequire ''runit/testcaserunit/testcase''
requirerequire ''runit/cui/testrunnerrunit/cui/testrunner''
requirerequire ''runit/testsuiterunit/testsuite''
classclass Testing_classTesting_class < < RUNIT::TestCaseRUNIT::TestCase
defdef test_method1test_method1
mine = mine = MyClass.newMyClass.new
……
endend
endend
RUNIT::CUI::TestRunner.run(Testing_class.suiteRUNIT::CUI::TestRunner.run(Testing_class.suite))
endend
![Page 17: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/17.jpg)
28th August, Agile Mumbai '05
Building an app using Building an app using RubyUnitRubyUnit
requirerequire ''runit/testcaserunit/testcase''
requirerequire ''runit/cui/testrunnerrunit/cui/testrunner''
requirerequire ''runit/testsuiterunit/testsuite''
classclass TC_NewLineToHtmlBreakTC_NewLineToHtmlBreak < < RUNIT::TestCaseRUNIT::TestCase
defdef test_NewLineToHtmlBreaktest_NewLineToHtmlBreak
nl2br = nl2br = NewLineToHtmlBreak.newNewLineToHtmlBreak.new
assert_equal("bombayassert_equal("bombay\\nrocksnrocks!", nl2br.convert, !", nl2br.convert, ""newlinesnewlines should've been converted to <should've been converted to <brbr>s")>s")
endend
RUNIT::CUI::TestRunnr.run(TC_NewLineToHtmlBreak.suitRUNIT::CUI::TestRunnr.run(TC_NewLineToHtmlBreak.suitee))
endend
![Page 18: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/18.jpg)
28th August, Agile Mumbai '05
Building an app using Building an app using RubyUnitRubyUnit
(contd.)(contd.)
classclass NewLineToHtmlBreakNewLineToHtmlBreak
defdef convert(strconvert(str))
return return str.gsub!("str.gsub!("\\nn", "<", "<brbr
/>")/>")
endend
endend
![Page 19: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/19.jpg)
28th August, Agile Mumbai '05
Building an app using Building an app using RubyUnitRubyUnit
(contd.)(contd.)requirerequire ''runit/testcaserunit/testcase''
requirerequire ''runit/cui/testrunnerrunit/cui/testrunner''
requirerequire ''runit/testsuiterunit/testsuite''
requirerequirerequirerequirerequirerequirerequirerequire ''''''''NewLineToHtmlBreakNewLineToHtmlBreakNewLineToHtmlBreakNewLineToHtmlBreakNewLineToHtmlBreakNewLineToHtmlBreakNewLineToHtmlBreakNewLineToHtmlBreak''''''''
classclass TC_NewLineToHtmlBreakTC_NewLineToHtmlBreak < < RUNIT::TestCaseRUNIT::TestCase
defdef test_NewLineToHtmlBreaktest_NewLineToHtmlBreak
nl2br = nl2br = NewLineToHtmlBreak.newNewLineToHtmlBreak.new
assert_equal("bombayassert_equal("bombay\\nrocksnrocks!", nl2br.convert, !", nl2br.convert, ""newlinesnewlines should've been converted to <should've been converted to <brbr>s")>s")
endend
RUNIT::CUI::TestRunnr.run(TC_NewLineToHtmlBreak.suitRUNIT::CUI::TestRunnr.run(TC_NewLineToHtmlBreak.suitee))
endend
![Page 20: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/20.jpg)
28th August, Agile Mumbai '05
Unit testing web appsUnit testing web apps
►►MVC architectureMVC architecture
�� Decoupling models and Decoupling models and contollerscontollers –– mock mock
objectsobjects
�� Automated feeds to controllers (from views)Automated feeds to controllers (from views)
�� Method interceptionMethod interception
![Page 21: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/21.jpg)
28th August, Agile Mumbai '05
ReferencesReferences
►►Ruby language: Ruby language: http://rubyhttp://ruby--lang.org/lang.org/
►►Test::UnitTest::Unit: : http://testunit.talbott.ws/http://testunit.talbott.ws/
►►Ruby on Rails: Ruby on Rails: http://www.rubyonrails.com/http://www.rubyonrails.com/
►►I write about Ruby when II write about Ruby when I’’m not drunk: m not drunk:
http://www.livejournal.com/~premshreehttp://www.livejournal.com/~premshree
![Page 22: Agile Development with Ruby · 2009. 12. 2. · 28th August, Agile Mumbai '05 How does Ruby facilitate agile development? Test-driven development (using unit testing modules) User](https://reader035.vdocuments.us/reader035/viewer/2022071101/5fda6f29828dba17080e6802/html5/thumbnails/22.jpg)
ThengyooThengyoo!!
Questions?Questions?