SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Unit and Functional
                                Testing for the
                               Android Platform


                                 Christopher M. Judd


Saturday, February 19, 2011
Christopher M. Judd
      President/Consultant of

                                                  leader

      Columbus                     Developer User Group (CIDUG)




Saturday, February 19, 2011
Remarkable Ohio




                                           Free
                     Developed for eTech Ohio and Ohio Historical Center
Saturday, February 19, 2011
University System Of Ohio




                                        Free
                Developed for eTech Ohio and University System Of Ohio
Saturday, February 19, 2011
How many of you are currently or
have developed applications for the
        Android Platform?



Saturday, February 19, 2011
How many of you have ever unit or
     functionally tested your
       Android application?


Saturday, February 19, 2011
How many of you have ever
     unit tested on
   another platform?


Saturday, February 19, 2011
Why aren’t you testing
               your Android
               applications?



Saturday, February 19, 2011
Testing is the key to




Saturday, February 19, 2011
Testing is the key to




                      Agility
Saturday, February 19, 2011
Unit Testing


Saturday, February 19, 2011
Unit Testing Basics




Saturday, February 19, 2011
Why Unit Test?

            Improves design
            Facility change and refactoring
            Simplifies integration
            Provides executable documentation



Saturday, February 19, 2011
includes




Saturday, February 19, 2011
Getting Started




Saturday, February 19, 2011
1.Create Android Test Project




Saturday, February 19, 2011
Create
Android Test Project




Saturday, February 19, 2011
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.android.notepad.test"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">

         <uses-library android:name="android.test.runner" />
      </application>
      <uses-sdk android:minSdkVersion="3" />

      <instrumentation
             android:targetPackage="com.example.android.notepad"
             android:name="android.test.InstrumentationTestRunner" />
    <uses-sdk android:targetSdkVersion="4" />
</manifest>




Saturday, February 19, 2011
Running Unit Tests




Saturday, February 19, 2011
Running

               Run As > Android JUnit Test




Saturday, February 19, 2011
Writing Unit Tests




Saturday, February 19, 2011
Test Framework




    Instrumentation controls an Android
       component independently of its
             normal lifecycle.




Saturday, February 19, 2011
TestCases




Saturday, February 19, 2011
Mocks




Saturday, February 19, 2011
Functional Testing




Saturday, February 19, 2011
Monkey Runner
                              Monkey
                              Robotium




Saturday, February 19, 2011
MonkeyRunner




Saturday, February 19, 2011
functional testing framework
                              for Android applications and devices




Saturday, February 19, 2011
Saturday, February 19, 2011
monkeyrunner add_note.py




Saturday, February 19, 2011
# Imports the monkeyrunner modules
 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

 # Connect to the current device
 device = MonkeyRunner.waitForConnection()

 # Install package
 device.installPackage('bin/NotePad.apk')

 # Run activity
 device.startActivity(component='com.example.android.notepad/.NotesList')

 # Press the Menu button
 device.press('KEYCODE_MENU','DOWN_AND_UP')

 # Press Add Note menu item
 device.press('KEYCODE_A','DOWN_AND_UP')

 # Type "Mobidevdays"
 device.press('KEYCODE_M','DOWN_AND_UP')
 device.press('KEYCODE_O','DOWN_AND_UP')
 device.press('KEYCODE_B','DOWN_AND_UP')
 device.press('KEYCODE_I','DOWN_AND_UP')
 device.press('KEYCODE_D','DOWN_AND_UP')
 device.press('KEYCODE_E','DOWN_AND_UP')
 device.press('KEYCODE_V','DOWN_AND_UP')
 device.press('KEYCODE_D','DOWN_AND_UP')
 device.press('KEYCODE_A','DOWN_AND_UP')
 device.press('KEYCODE_Y','DOWN_AND_UP')

 # Press the Menu button
 device.press('KEYCODE_MENU','DOWN_AND_UP')

 # Press save menu item
 device.press('KEYCODE_S','DOWN_AND_UP')

 # Take snapshot
 screenshot = device.takeSnapshot()

 # Write snapshot to file system
 screenshot.writeToFile('notes_list.png','png')




Saturday, February 19, 2011
When things don’t work




Saturday, February 19, 2011
When things don’t work


                                       add


                 MonkeyRunner.sleep(1)



Saturday, February 19, 2011
automates android application
                      can run in the simulator or the device




                       difficult to write scripts
                       no red bar/green bar
                       no verification (other than screenshots)
                       very little documentation

Saturday, February 19, 2011
Monkey




Saturday, February 19, 2011
random click stress tester




Saturday, February 19, 2011
adb shell monkey -p com.example.android.notepad -v 500




Saturday, February 19, 2011
child proofs our app
                       looks for crashes
                       identifies unresponsiveness



                      not sure the real value


Saturday, February 19, 2011
Robotium




Saturday, February 19, 2011
Selenium for Android


                                        Open Source

                              http://code.google.com/p/robotium/




Saturday, February 19, 2011
Setup

  1. Create Android Test Project
  2. Add robotium-solo-x.x.jar




Saturday, February 19, 2011
public class NotePadTest extends ActivityInstrumentationTestCase2<NotesList> {

     private static final int TWO_SECONDS = 2000;
     private Solo solo;

     public NotePadTest() {
       super("com.example.android.notepad", NotesList.class);
     }

     protected void setUp() throws Exception {
       super.setUp();
       solo = new Solo(getInstrumentation(), getActivity());
     }

     public void testAddNote() throws Exception {

         solo.sendKey(Solo.MENU);
         solo.sendKey(Solo.MENU); // issue 61

         solo.clickOnMenuItem("Add note");

         solo.sleep(TWO_SECONDS);
         EditText note = (EditText) solo.getView(R.id.note);
         solo.clickOnView(note);
         solo.enterText(note, "Mobidevdays");

         solo.sendKey(Solo.MENU);
         solo.sendKey(Solo.MENU); // issue 61

         solo.clickOnMenuItem("Save");



         assertTrue(solo.searchText("Mobidevdays"));
     }

     public void tearDown() throws Exception {
       try {
         solo.finalize();
       } catch (Throwable e) {
         e.printStackTrace();
       }
       getActivity().finish();
       super.tearDown();
     }

 }

Saturday, February 19, 2011
Running

               Run As > Android JUnit Test




Saturday, February 19, 2011
Command-line

$ adb shell am instrument -w
    com.example.android.notepad.test/android.test.InstrumentationTestRunner

com.example.android.notepad.NotePadTest:.
Test results for InstrumentationTestRunner=.
Time: 14.517

OK (1 test)




Saturday, February 19, 2011
JUnit based
                        red bar/ green bar
                        asserts
                      can run in the simulator or the device
                      command-line automation
                      integrates with cucumber



                      little documentation
                      not approachable by traditional testers
Saturday, February 19, 2011
Android Resources




                                        http://developer.android.com


Saturday, February 19, 2011
Christopher M. Judd

                              President/Consultant/Author
                              email: cjudd@juddsolutions.com
                              web: www.juddsolutions.com
                              blog: juddsolutions.blogspot.com
                              twitter: javajudd




Saturday, February 19, 2011
Attributions
                   http://www.organicdesign.co.nz/File:Warning.svg

                   http://www.flickr.com/photos/heliotrop3/4310957752/




Saturday, February 19, 2011

Mais conteúdo relacionado

Último

1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdf
QucHHunhnh
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
QucHHunhnh
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
ciinovamais
 

Último (20)

Dyslexia AI Workshop for Slideshare.pptx
Dyslexia AI Workshop for Slideshare.pptxDyslexia AI Workshop for Slideshare.pptx
Dyslexia AI Workshop for Slideshare.pptx
 
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17  How to Extend Models Using Mixin ClassesMixin Classes in Odoo 17  How to Extend Models Using Mixin Classes
Mixin Classes in Odoo 17 How to Extend Models Using Mixin Classes
 
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
 
Asian American Pacific Islander Month DDSD 2024.pptx
Asian American Pacific Islander Month DDSD 2024.pptxAsian American Pacific Islander Month DDSD 2024.pptx
Asian American Pacific Islander Month DDSD 2024.pptx
 
Basic Civil Engineering first year Notes- Chapter 4 Building.pptx
Basic Civil Engineering first year Notes- Chapter 4 Building.pptxBasic Civil Engineering first year Notes- Chapter 4 Building.pptx
Basic Civil Engineering first year Notes- Chapter 4 Building.pptx
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptx
 
Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy Consulting
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdf
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdf
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdf
 
Kodo Millet PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...
Kodo Millet  PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...Kodo Millet  PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...
Kodo Millet PPT made by Ghanshyam bairwa college of Agriculture kumher bhara...
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
Accessible Digital Futures project (20/03/2024)
Accessible Digital Futures project (20/03/2024)Accessible Digital Futures project (20/03/2024)
Accessible Digital Futures project (20/03/2024)
 
Sociology 101 Demonstration of Learning Exhibit
Sociology 101 Demonstration of Learning ExhibitSociology 101 Demonstration of Learning Exhibit
Sociology 101 Demonstration of Learning Exhibit
 
ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.
 
Food safety_Challenges food safety laboratories_.pdf
Food safety_Challenges food safety laboratories_.pdfFood safety_Challenges food safety laboratories_.pdf
Food safety_Challenges food safety laboratories_.pdf
 
General Principles of Intellectual Property: Concepts of Intellectual Proper...
General Principles of Intellectual Property: Concepts of Intellectual  Proper...General Principles of Intellectual Property: Concepts of Intellectual  Proper...
General Principles of Intellectual Property: Concepts of Intellectual Proper...
 

Destaque

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destaque (20)

Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 

Unit andfunctionaltestingforandroidplatform

  • 1. Unit and Functional Testing for the Android Platform Christopher M. Judd Saturday, February 19, 2011
  • 2. Christopher M. Judd President/Consultant of leader Columbus Developer User Group (CIDUG) Saturday, February 19, 2011
  • 3. Remarkable Ohio Free Developed for eTech Ohio and Ohio Historical Center Saturday, February 19, 2011
  • 4. University System Of Ohio Free Developed for eTech Ohio and University System Of Ohio Saturday, February 19, 2011
  • 5. How many of you are currently or have developed applications for the Android Platform? Saturday, February 19, 2011
  • 6. How many of you have ever unit or functionally tested your Android application? Saturday, February 19, 2011
  • 7. How many of you have ever unit tested on another platform? Saturday, February 19, 2011
  • 8. Why aren’t you testing your Android applications? Saturday, February 19, 2011
  • 9. Testing is the key to Saturday, February 19, 2011
  • 10. Testing is the key to Agility Saturday, February 19, 2011
  • 12. Unit Testing Basics Saturday, February 19, 2011
  • 13. Why Unit Test? Improves design Facility change and refactoring Simplifies integration Provides executable documentation Saturday, February 19, 2011
  • 16. 1.Create Android Test Project Saturday, February 19, 2011
  • 18. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.notepad.test" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="android.test.runner" /> </application> <uses-sdk android:minSdkVersion="3" /> <instrumentation android:targetPackage="com.example.android.notepad" android:name="android.test.InstrumentationTestRunner" /> <uses-sdk android:targetSdkVersion="4" /> </manifest> Saturday, February 19, 2011
  • 19. Running Unit Tests Saturday, February 19, 2011
  • 20. Running Run As > Android JUnit Test Saturday, February 19, 2011
  • 21. Writing Unit Tests Saturday, February 19, 2011
  • 22. Test Framework Instrumentation controls an Android component independently of its normal lifecycle. Saturday, February 19, 2011
  • 26. Monkey Runner Monkey Robotium Saturday, February 19, 2011
  • 28. functional testing framework for Android applications and devices Saturday, February 19, 2011
  • 31. # Imports the monkeyrunner modules from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage # Connect to the current device device = MonkeyRunner.waitForConnection() # Install package device.installPackage('bin/NotePad.apk') # Run activity device.startActivity(component='com.example.android.notepad/.NotesList') # Press the Menu button device.press('KEYCODE_MENU','DOWN_AND_UP') # Press Add Note menu item device.press('KEYCODE_A','DOWN_AND_UP') # Type "Mobidevdays" device.press('KEYCODE_M','DOWN_AND_UP') device.press('KEYCODE_O','DOWN_AND_UP') device.press('KEYCODE_B','DOWN_AND_UP') device.press('KEYCODE_I','DOWN_AND_UP') device.press('KEYCODE_D','DOWN_AND_UP') device.press('KEYCODE_E','DOWN_AND_UP') device.press('KEYCODE_V','DOWN_AND_UP') device.press('KEYCODE_D','DOWN_AND_UP') device.press('KEYCODE_A','DOWN_AND_UP') device.press('KEYCODE_Y','DOWN_AND_UP') # Press the Menu button device.press('KEYCODE_MENU','DOWN_AND_UP') # Press save menu item device.press('KEYCODE_S','DOWN_AND_UP') # Take snapshot screenshot = device.takeSnapshot() # Write snapshot to file system screenshot.writeToFile('notes_list.png','png') Saturday, February 19, 2011
  • 32. When things don’t work Saturday, February 19, 2011
  • 33. When things don’t work add MonkeyRunner.sleep(1) Saturday, February 19, 2011
  • 34. automates android application can run in the simulator or the device difficult to write scripts no red bar/green bar no verification (other than screenshots) very little documentation Saturday, February 19, 2011
  • 36. random click stress tester Saturday, February 19, 2011
  • 37. adb shell monkey -p com.example.android.notepad -v 500 Saturday, February 19, 2011
  • 38. child proofs our app looks for crashes identifies unresponsiveness not sure the real value Saturday, February 19, 2011
  • 40. Selenium for Android Open Source http://code.google.com/p/robotium/ Saturday, February 19, 2011
  • 41. Setup 1. Create Android Test Project 2. Add robotium-solo-x.x.jar Saturday, February 19, 2011
  • 42. public class NotePadTest extends ActivityInstrumentationTestCase2<NotesList> { private static final int TWO_SECONDS = 2000; private Solo solo; public NotePadTest() { super("com.example.android.notepad", NotesList.class); } protected void setUp() throws Exception { super.setUp(); solo = new Solo(getInstrumentation(), getActivity()); } public void testAddNote() throws Exception { solo.sendKey(Solo.MENU); solo.sendKey(Solo.MENU); // issue 61 solo.clickOnMenuItem("Add note"); solo.sleep(TWO_SECONDS); EditText note = (EditText) solo.getView(R.id.note); solo.clickOnView(note); solo.enterText(note, "Mobidevdays"); solo.sendKey(Solo.MENU); solo.sendKey(Solo.MENU); // issue 61 solo.clickOnMenuItem("Save"); assertTrue(solo.searchText("Mobidevdays")); } public void tearDown() throws Exception { try { solo.finalize(); } catch (Throwable e) { e.printStackTrace(); } getActivity().finish(); super.tearDown(); } } Saturday, February 19, 2011
  • 43. Running Run As > Android JUnit Test Saturday, February 19, 2011
  • 44. Command-line $ adb shell am instrument -w com.example.android.notepad.test/android.test.InstrumentationTestRunner com.example.android.notepad.NotePadTest:. Test results for InstrumentationTestRunner=. Time: 14.517 OK (1 test) Saturday, February 19, 2011
  • 45. JUnit based red bar/ green bar asserts can run in the simulator or the device command-line automation integrates with cucumber little documentation not approachable by traditional testers Saturday, February 19, 2011
  • 46. Android Resources http://developer.android.com Saturday, February 19, 2011
  • 47. Christopher M. Judd President/Consultant/Author email: cjudd@juddsolutions.com web: www.juddsolutions.com blog: juddsolutions.blogspot.com twitter: javajudd Saturday, February 19, 2011
  • 48. Attributions http://www.organicdesign.co.nz/File:Warning.svg http://www.flickr.com/photos/heliotrop3/4310957752/ Saturday, February 19, 2011