There are literally hundreds, if not thousands, of mobile devices out there today (with countless more new ones shipping all the time). You'd like to "get mobile," but there's one minor detail - how do you make sure the software you write runs on all those devices? Now, you may approach this with a "all I need to do is build for the iPhone" mindset. First, a little math to scare you. The iOS platform is available for a surprisingly large range of devices, including several generations of iPhone, iPod Touch, and of course the iPad. Depending on what you read, Android devices (which also include numerous generations of software) are outshipping iOS devices. Microsoft isn't idle either - Windows Phone 7 is getting nice reviews, and you know they'll be shipping those to a lot of partners. Plus, there's webOS, BlackBerry, and a bunch of other devices you haven't heard of. All of these devices have different operating systems, patch levels, video cards, memory, CPU, storage, and wildly different network capabilities.
So, a brief path out of the wilderness. You can chose one of three basic strategies for building the app:
- Build native apps
- Build mobile web applications
- Build mobile web apps and put a tiny native shim on (and put that shim in the various app stores).
Scenario 3 has the advantage of getting your app into as many app stores as possible (e.g. Apple iOS App Store, Google App Marketplace, Amazon app store, etc.) while still keeping the development (and testing) somewhat manageable. With that in mind, here are the tools you may want to look at:
- JUnit/NUnit - basic foundational tool
- HTMLUnit - headless Java web browser
- Robotium - Selenium/JUnit extended for Android
- Sikuli - Visually script and drive emulator[s]
- Selenium - Script and drive mobile app
- Physical Lab - Buy lots and lots and lots of devices
Packages I haven't used but am curious about include: