TESTABLE CODE ..... IN JOOMLA!?                       Old School Development Regenerated, or, Doin’ it like a Time LordFri...
Who Is This?                        Arlen Walker - (Paladin)                                @arlen                  Web De...
CURMUDGEONFriday, March 15, 13
ANNOYANCEFriday, March 15, 13
TROUBLEMAKERFriday, March 15, 13
ARROGANTFriday, March 15, 13
WASTE EVACUATION CHUTEFriday, March 15, 13
TEST NAZIFriday, March 15, 13
That’s Who, But Why?Friday, March 15, 13
That’s Who, But Why?                   40 years development experienceFriday, March 15, 13
That’s Who, But Why?                   40 years development experience                   15 years on the webFriday, March ...
That’s Who, But Why?                   40 years development experience                   15 years on the web              ...
That’s Who, But Why?                   40 years development experience                   15 years on the web              ...
What If You Had A Tool...Friday, March 15, 13
What If You Had A Tool...                   ... that could look inside your application?Friday, March 15, 13
What If You Had A Tool...                   ... that could look inside your application?                   ... that would ...
What If You Had A Tool...                   ... that could look inside your application?                   ... that would ...
What If You Had A Tool...                   ... that could look inside your application?                   ... that would ...
What If You Had A Tool...                   ... that could look inside your application?                   ... that would ...
Automated Testing                   Kent Beck’s work on Smalltalk testing resulted in SUnit                   From there, ...
PHPUnitFriday, March 15, 13
Tests Before Code                   Kent Beck remembered reading about the “tests first” approach                   in an ...
Write Tests First?                   Enforces "plan before code"                   Focuses the coding on one task at a tim...
THE ONE CERTAINTYFriday, March 15, 13
YOUR CODE WILL CHANGE!Friday, March 15, 13
Testable Code is Easy to Change         Modifiable Code          Testable Code         Small Units              Small Unit...
DONT JUST TAKE MY WORD                       FOR ITFriday, March 15, 13
David Allen                       Before you begin, answer one question:                        “What does ‘done’ look lik...
Dr. Stephen Covey                                Habit 2                       Begin With The End In MindFriday, March 15,...
SO WHAT WOULD TESTABLE CODE           THAT WORKS IN JOOMLA! LOOK LIKE?Friday, March 15, 13
mod_random_image — Before                   Requires presence of Joomla                   code                   Depends o...
Tell, Dont Ask                   Procedural code asks for information, makes a decision, and then                   acts  ...
mod_random_image — After                   Much simpler code                   Easier to understand                   All ...
Helper                  Static functions                This means we can’t replace them              for testing purposes...
“Never Mention a Class Name                     Within Another Class”                       From Sandi Metz               ...
Helper                  No static method calls                A completely different cms object              can be insert...
Test Doubles                   Special-purpose objects                   Replace parts of a larger system                 ...
PHUnit Test Doubles                 $this->mock_glue = $this->getMock(JoomlaGlue, array(                 getBaseUrl, strpo...
What if it’s not a Module?                   Plugins can be set up very similarly to Modules                   An idea for...
Decorator Pattern                   Brings in the wrapped object in its constructor                   Passes all calls it ...
Decorator                   Include all decorated methods as pass-thru’s                   ... or use the “__call” magic m...
BUT I DO FRONT-END WORK!                        I don’t have any way to test, right?Friday, March 15, 13
Yes, you can!                   Template overrides can be tested like modules or plugins -- wrap                   them wi...
Javascript                   Selenium2 (WebDriver) works with PHPUnit, but:                       Direct UI testing is Fra...
Jasmine                   In-Browser testing:                       http://pivotal.github.com/jasmine/                   C...
Jasmine                   Uses a traditional behavior-focused english-like syntax:                       describe - to set...
A Block of Related Tests                   describe( “Description of Test Block”, function () {                   ...test ...
Test Setup And Teardown                   beforeEach( function () {                   .....set up for test to begin.....  ...
Fixtures                   Added by jasmine-jQuery                   Allows you to create a special set of markup to test ...
Test                   it( “What is test about”, function () {                   .....actual test happens here.....       ...
Match Results                   expect(actualValue)[.not].toBe(otherValue);                    other matchers include toEq...
Jasmine ExampleFriday, March 15, 13
Originally                $(#webinar-click1).click(function() {                       $(#webinar-desc1).show(fast, functio...
Tests                describe("Expanding Descriptions", function () {                !      beforeEach(function () {      ...
Initialization              describe("Initializing The Boxes", function () {              !    beforeEach(function () {   ...
Credits                   Jasmine                                         S.O.L.I.D.                       http://pivotal....
Arlen Walker                   @arlen on Twitter                   Paladin on Github                   http://speakerrate....
Upcoming SlideShare
Loading in...5
×

Testable Code ... In Joomla!?

1,358

Published on

Writing testable code is also writing better code. Here's how to do it in the context of Joomla CMS

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

  • Be the first to like this

No Downloads
Views
Total Views
1,358
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Testable Code ... In Joomla!?

  1. 1. TESTABLE CODE ..... IN JOOMLA!? Old School Development Regenerated, or, Doin’ it like a Time LordFriday, March 15, 13
  2. 2. Who Is This? Arlen Walker - (Paladin) @arlen Web Developer, PKWARE, Inc.Friday, March 15, 13
  3. 3. CURMUDGEONFriday, March 15, 13
  4. 4. ANNOYANCEFriday, March 15, 13
  5. 5. TROUBLEMAKERFriday, March 15, 13
  6. 6. ARROGANTFriday, March 15, 13
  7. 7. WASTE EVACUATION CHUTEFriday, March 15, 13
  8. 8. TEST NAZIFriday, March 15, 13
  9. 9. That’s Who, But Why?Friday, March 15, 13
  10. 10. That’s Who, But Why? 40 years development experienceFriday, March 15, 13
  11. 11. That’s Who, But Why? 40 years development experience 15 years on the webFriday, March 15, 13
  12. 12. That’s Who, But Why? 40 years development experience 15 years on the web Wrote plugins when they were called MambotsFriday, March 15, 13
  13. 13. That’s Who, But Why? 40 years development experience 15 years on the web Wrote plugins when they were called Mambots Joomla Community Magazine Developer’s WorkbenchFriday, March 15, 13
  14. 14. What If You Had A Tool...Friday, March 15, 13
  15. 15. What If You Had A Tool... ... that could look inside your application?Friday, March 15, 13
  16. 16. What If You Had A Tool... ... that could look inside your application? ... that would help you write better code, faster?Friday, March 15, 13
  17. 17. What If You Had A Tool... ... that could look inside your application? ... that would help you write better code, faster? ... that encouraged good development practices?Friday, March 15, 13
  18. 18. What If You Had A Tool... ... that could look inside your application? ... that would help you write better code, faster? ... that encouraged good development practices? ... that conformed to the advice of major productivity gurus like David Allen and Stephen Covey?Friday, March 15, 13
  19. 19. What If You Had A Tool... ... that could look inside your application? ... that would help you write better code, faster? ... that encouraged good development practices? ... that conformed to the advice of major productivity gurus like David Allen and Stephen Covey? ...that pointed out what you’re doing now breaks what you did last week?Friday, March 15, 13
  20. 20. Automated Testing Kent Beck’s work on Smalltalk testing resulted in SUnit From there, JUnit was born, and the xUnit series of testing frameworks began Joomla is written in PHP, so it uses ....Friday, March 15, 13
  21. 21. PHPUnitFriday, March 15, 13
  22. 22. Tests Before Code Kent Beck remembered reading about the “tests first” approach in an “ancient” computer programming manual. This memory began what is known today as Test Driven Development, an agile development practice that uses tests to define the code that will be written.Friday, March 15, 13
  23. 23. Write Tests First? Enforces "plan before code" Focuses the coding on one task at a time Documents progress Avoids creating unnecessary code Ensures resulting code is testable, therefore easily changeable. Allows immediate refactoring of code, resulting in cleaner, clearer, better code.Friday, March 15, 13
  24. 24. THE ONE CERTAINTYFriday, March 15, 13
  25. 25. YOUR CODE WILL CHANGE!Friday, March 15, 13
  26. 26. Testable Code is Easy to Change Modifiable Code Testable Code Small Units Small Units Focused on Single Idea Focused on a Single Idea Loosely Coupled Loosely Coupled Clean and Clear Clean and ClearFriday, March 15, 13
  27. 27. DONT JUST TAKE MY WORD FOR ITFriday, March 15, 13
  28. 28. David Allen Before you begin, answer one question: “What does ‘done’ look like?”Friday, March 15, 13
  29. 29. Dr. Stephen Covey Habit 2 Begin With The End In MindFriday, March 15, 13
  30. 30. SO WHAT WOULD TESTABLE CODE THAT WORKS IN JOOMLA! LOOK LIKE?Friday, March 15, 13
  31. 31. mod_random_image — Before Requires presence of Joomla code Depends on specific classes Must execute code outside of unit to evaluate unit’s performance Harder to debug issues Violates "Tell, Dont Ask"Friday, March 15, 13
  32. 32. Tell, Dont Ask Procedural code asks for information, makes a decision, and then acts Object-Oriented code tells an object to act, and the object decides what it can/should doFriday, March 15, 13
  33. 33. mod_random_image — After Much simpler code Easier to understand All logic now inside object Simply creates unit and output No real debugging necessaryFriday, March 15, 13
  34. 34. Helper Static functions This means we can’t replace them for testing purposes Hard-coded to use Joomla functions Requires execution of external code Violates “Metz Prohibition”Friday, March 15, 13
  35. 35. “Never Mention a Class Name Within Another Class” From Sandi Metz As with all rules of software development, it’s not inviolable. The specific class is less important than its members Liskov Substitution Principle Reduces dependencies on outside code, makes doubling for testing simple.Friday, March 15, 13
  36. 36. Helper No static method calls A completely different cms object can be inserted for testing purposes. Can be tested in isolation from all Joomla code. No violations of the Metz ProhibitionFriday, March 15, 13
  37. 37. Test Doubles Special-purpose objects Replace parts of a larger system Receive messages from the code being tested Report on their interactions with the code being tested Supply test dataFriday, March 15, 13
  38. 38. PHUnit Test Doubles $this->mock_glue = $this->getMock(JoomlaGlue, array( getBaseUrl, strpos, getTranslatedText, getLayoutPath, sendHTML)); $this->mock_glue->expects($this->once())- >method(getBaseURL)-> will($this->returnValue(http://www.testingsite.com)); Checks to be sure getBaseURL() gets called only once, and returns a specific value. $this->mock_glue->expects($this->exactly(2))- >method(strpos) ->will($this->returnValue($this->folder)); Checks to be sure strpos() gets called twice and each time returns a specific value.Friday, March 15, 13
  39. 39. What if it’s not a Module? Plugins can be set up very similarly to Modules An idea for Components is to use the Decorator pattern to wrap your class around the Joomla class.Friday, March 15, 13
  40. 40. Decorator Pattern Brings in the wrapped object in its constructor Passes all calls it doesn’t handle itself on to the decorated class "Prefer composition over inheritance"Friday, March 15, 13
  41. 41. Decorator Include all decorated methods as pass-thru’s ... or use the “__call” magic method to pass method calls public function __construct($client) { $this->decorated = $client; } ... overridden and / or new methods here ... // route all other method calls directly to the decorated object public function __call($method, $args) { // you could also add method_exists check here return call_user_func_array(array($this->decorated, $method), $args); }Friday, March 15, 13
  42. 42. BUT I DO FRONT-END WORK! I don’t have any way to test, right?Friday, March 15, 13
  43. 43. Yes, you can! Template overrides can be tested like modules or plugins -- wrap them with an object that provides links to the information they need, replace them with test data for testing. But PHPUnit can’t test javascript, can it?Friday, March 15, 13
  44. 44. Javascript Selenium2 (WebDriver) works with PHPUnit, but: Direct UI testing is Fragile Direct UI testing doesn’t isolate the UI unit being tested Direct UI testing takes longer than unit testing should takeFriday, March 15, 13
  45. 45. Jasmine In-Browser testing: http://pivotal.github.com/jasmine/ Command line with phantom.js https://github.com/jcarver989/phantom-jasmine http://www.theodicius.net/archives/2012/09/25/what-i- did-to-the-jasmine-phantom/Friday, March 15, 13
  46. 46. Jasmine Uses a traditional behavior-focused english-like syntax: describe - to set the description for a block of tests it - to describe the specific test expect - to match the actual output with the expected. Jasmine-jQuery provides test fixtures and jQuery matchers https://github.com/velesin/jasmine-jqueryFriday, March 15, 13
  47. 47. A Block of Related Tests describe( “Description of Test Block”, function () { ...test code goes here... });Friday, March 15, 13
  48. 48. Test Setup And Teardown beforeEach( function () { .....set up for test to begin..... }); afterEach( function () { .....teardown from testing..... });Friday, March 15, 13
  49. 49. Fixtures Added by jasmine-jQuery Allows you to create a special set of markup to test against. setFixtures(<div class="event"><a class="showme" style="display:none;">Show</a><a class="hideme" style="display:none;">Hide</a><div class="description">Description</div></div>);Friday, March 15, 13
  50. 50. Test it( “What is test about”, function () { .....actual test happens here..... });Friday, March 15, 13
  51. 51. Match Results expect(actualValue)[.not].toBe(otherValue); other matchers include toEqual(y), toMatch(regex), toBe[Un]Defined(), toBeNull(), toBeTruthy(), toBeFalsy(), toContain(x), toBeLessThan(x), toBeGreaterThan(y) jasmine-jQuery adds even more matchersFriday, March 15, 13
  52. 52. Jasmine ExampleFriday, March 15, 13
  53. 53. Originally $(#webinar-click1).click(function() { $(#webinar-desc1).show(fast, function() { $(#webinar-click1).fadeOut(fast, function() { $(#webinar-click-hide1).fadeIn(fast, function() { }); }); }); }); $(#webinar-click-hide1).click(function() { $(#webinar-click-hide1).fadeOut(fast, function() { $(#webinar-desc1).hide(fast, function() { $(#webinar-click1).fadeIn(fast, function() { }); }); }); });Friday, March 15, 13
  54. 54. Tests describe("Expanding Descriptions", function () { ! beforeEach(function () { ! ! setFixtures(<div class="event"><a class="showme" style="display:none;"> + ! ! ! Show</a><a class="hideme" style="display:none;">Hide</a> + ! ! ! <div class="description">Description</div></div>); ! }); ! afterEach(function () { ! }); ! it("should not have visible showme button", function () { ! ! expect($(".event .showme").first().css("display")).toBe("none"); ! }); ! it("should not have visible hideme button", function () { ! ! expect($(".event .showme").first().css("display")).toBe("none"); ! }); ! it("should display the description", function () { ! ! expect($(".event .description").first().css("display")).not.toBe("none"); ! }); });Friday, March 15, 13
  55. 55. Initialization describe("Initializing The Boxes", function () { ! beforeEach(function () { ! ! setFixtures(<div class="event"><a class="showme" style="display:none;"> + ! ! ! Show</a><a class="hideme" style="display:none;">Hide</a> + ! ! ! <div class="description">Description</div></div>); ! ! setExpandingBoxes(); ! }); ! it("should now have a visible showme button", function () { ! ! expect($(".event .showme").first().css("display")).not.toBe("none"); ! }); ! it("should not have a visible hideme button", function () { ! ! expect($(".event .hideme").first().css("display")).toBe("none"); ! }); ! it("should not display the description", function () { ! ! expect($(".event .description").first().css("display")).toBe("none"); ! }); });Friday, March 15, 13
  56. 56. Credits Jasmine S.O.L.I.D. http://pivotal.github.com/jasmine/ http://butunclebob.com/ https://github.com/jcarver989/phantom- ArticleS.UncleBob.PrinciplesOfOod jasmine PHPUnit https://github.com/velesin/jasmine-jquery https://github.com/sebastianbergmann? http://www.theodicius.net/archives/ tab=repositories 2012/09/25/what-i-did-to-the-jasmine- phantom/ Metz Prohibition http://rubyrogues.com/087-rr-book- Testable Modules clubpractical-object-oriented-design-in- http://magazine.joomla.org/issues/issue- ruby-with-sandi-metz/ aug-2012/item/822-Towards-A-More- Testable-Module Tell, Don’t Ask http://www.ccs.neu.edu/research/demeter/ related-work/pragmatic-programmer/ jan_03_enbug.pdfFriday, March 15, 13
  57. 57. Arlen Walker @arlen on Twitter Paladin on Github http://speakerrate.com/talks/20671-testable-code-in-joomlaFriday, March 15, 13
  1. A particular slide catching your eye?

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

×