{"id":98,"date":"2010-11-22T18:51:07","date_gmt":"2010-11-23T02:51:07","guid":{"rendered":"http:\/\/bynomial.com\/blog\/?p=98"},"modified":"2010-11-22T18:51:07","modified_gmt":"2010-11-23T02:51:07","slug":"beta-testing","status":"publish","type":"post","link":"http:\/\/bynomial.com\/blog\/?p=98","title":{"rendered":"Beta testing"},"content":{"rendered":"<p>This post gives a quick introduction to beta testing for iOS developers. \u00c2\u00a0Specifically, I&#8217;ll walk through the major steps needed to legitimately send out a working copy of your app to testers without going through the app store &#8211; a process known as <em>ad hoc distribution<\/em>.<\/p>\n<h2>Why beta test?<\/h2>\n<p>All programmers become attached to their code over time. \u00c2\u00a0It&#8217;s just being human. \u00c2\u00a0You think to yourself, &#8220;why do I need to spend time sharing this with people who don&#8217;t know anything about my app?&#8221; \u00c2\u00a0You can just test it yourself, faster and cheaper!<\/p>\n<p>Right?<\/p>\n<p>The problem is, it&#8217;s <em>really hard<\/em> for you to treat your app like you haven&#8217;t built it yourself. \u00c2\u00a0There&#8217;s a tendency to only test what you just wrote, and to play with things that you know will work. \u00c2\u00a0I can&#8217;t tell you how many times I&#8217;ve done this &#8211; gotten so used to using the app the way I know it works, that I forget about all the ways it can break.<\/p>\n<p>So there is a huge value to a fresh pair of eyes. \u00c2\u00a0You may like to pretend that all customers will perceive the app exactly the way you do, but that isn&#8217;t reality. \u00c2\u00a0What a new user thinks and does with your app is not obvious, and this is why we test.<\/p>\n<h2>Getting testers&#8217; UDIDs<\/h2>\n<p>A UDID is a unique identifier string per device (iPhone, iPad, or iPod touch). \u00c2\u00a0Your Apple developer program account will usually give you 100 device slots that you can register. \u00c2\u00a0Basically, by requiring you to register devices, Apple can avoid people selling their apps directly through this system. \u00c2\u00a0You can recycle your slots, but only very slowly, as there is a 1-year waiting period to recycle any given slot (see the last two paragraphs of <a href=\"http:\/\/developer.apple.com\/news\/ios\/archives\/november2009\/\">this page<\/a>).<\/p>\n<p>A user can find their UDID a couple ways:<\/p>\n<ol>\n<li>They can search for &#8220;udid&#8221; in the app store, and download one of those apps. \u00c2\u00a0These generally give the user the option to email their UDID directly to you. \u00c2\u00a0Although I think option 2 is faster, some users might feel like this is easier, since there seems to be some psychological &#8220;work&#8221; associated with plugging in an iPad\/iPhone.<\/li>\n<li>They can plug in their iPads, open iTunes, and click on &#8220;Joe&#8217;s iPad&#8221; (whatever the name is) under Devices in the left-hand panel. \u00c2\u00a0Next click on the serial number of your device, and it switches to display the UDID.<\/li>\n<\/ol>\n<p>Here&#8217;s a link to <a href=\"http:\/\/www.innerfence.com\/howto\/find-iphone-unique-device-identifier-udid\">instructions on finding a UDID<\/a> &#8211; useful for emailing to new testers.<\/p>\n<h2>Building an ipa file<\/h2>\n<p>This is the most fun part.<\/p>\n<p>An ipa file is a file testers can install in two steps:<\/p>\n<ol>\n<li>Double-click on the ipa file, which loads it into iTunes for them; and then<\/li>\n<li>Sync their device with iTunes.<\/li>\n<\/ol>\n<p>In some cases, they might have to check the box next to your app&#8217;s name under the Apps tab amongst the list of their sync settings for their device.<\/p>\n<p>Generating that ipa file, however, is a bit of work. \u00c2\u00a0Here&#8217;s an overview of what you need to do.<\/p>\n<p>These steps are for the Provisioning Portal, available to all Apple developer program members through developer.apple.com. \u00c2\u00a0I&#8217;m assuming you&#8217;ve already done some usually-previously-required steps like creating your certificates and an app ID. \u00c2\u00a0If not, see the links below.<\/p>\n<ol>\n<li>In the Devices section, add the tester&#8217;s device using the UDID they sent you.<\/li>\n<li>In the Provisioning section, click on the Distribution tab, and either add a new profile (if this is your first tester), or click Edit next to the existing profile for your app. \u00c2\u00a0This will be an ad hoc distribution profile, and the other options are straightforward &#8211; always select all the devices you want to be able to run the app on.<\/li>\n<li>Download the provisioning profile from the previous step, also from within the Provisioning section.<\/li>\n<li>In Xcode, create a build configuration called &#8220;Ad Hoc Distribution&#8221; (the name does not affect the build, so you can change this string to suit your needs). \u00c2\u00a0Modify the build settings to sign the binary using the new profile (iPhone Distribution, under Code Signing Identity).<\/li>\n<li>In the build configuration drop-down (always visible in the top-left of the main Xcode window), choose Device, and then Ad Hoc Distribution.<\/li>\n<li>From the Build menu, choose Build and Archive.<\/li>\n<li>From Xcode&#8217;s Organizer window (ctrl-cmd-O), click on your app&#8217;s name under Archived Applications on the left.<\/li>\n<li>Choose the latest archived version (if this is your first time through, there is no choice here), click on Share&#8230;, and then Save to Disk&#8230;<\/li>\n<li>Save the file where-ever you like, and email it to your testers. \u00c2\u00a0Done!<\/li>\n<\/ol>\n<p>I&#8217;ve actually been relatively terse in the above list. \u00c2\u00a0There are two much more detailed lists you can walk through if this is all new and scary. \u00c2\u00a0The first is from Apple directly. \u00c2\u00a0Once you&#8217;re logged in to developer.apple.com\/ios, go to the Provisioning Portal, click on Distribution on the left, and read through each of the items starting with &#8220;Obtaining your iOS Distribution Certificate&#8221; &#8211; each of those items is a link that expands when clicked (<a href=\"https:\/\/developer.apple.com\/ios\/manage\/distribution\/index.action\">link<\/a>). \u00c2\u00a0Those steps are official and comprehensive.<\/p>\n<p>There&#8217;s also a nice stackoverflow answer with <a href=\"http:\/\/stackoverflow.com\/questions\/40154\/how-do-you-beta-test-an-iphone-app\/2426270#2426270\">a detailed walkthrough posted by Arne Evertsson<\/a>.<\/p>\n<h2>Tips for getting feedback<\/h2>\n<p>Actually getting useful feedback from testers is harder than you may think. \u00c2\u00a0Expect a significant portion of testers to not follow through. \u00c2\u00a0Those who do send feedback may easily send non-useful tips without careful forethought. \u00c2\u00a0A few <strong>things can go wrong<\/strong>:<\/p>\n<ul>\n<li><strong>Testers won&#8217;t know what to try to do<\/strong>. \u00c2\u00a0Often, they might not be exactly your target audience, so you have to give them goals, such as &#8220;try to search for books on math.&#8221; \u00c2\u00a0Even if they wouldn&#8217;t normally do this, it can be informative to see what they try, and how they feel about the results.<\/li>\n<li><strong>You give over-detailed instructions<\/strong>, and nothing new is discovered. \u00c2\u00a0If testers have step-by-step instructions, they&#8217;ll follow them exactly, and the results will always be the same. \u00c2\u00a0The point of testing is to put testers in the position of real users, who have taken the time to download your app, but otherwise know nothing about it.<\/li>\n<li><strong>Testers have too many choices<\/strong>, and end up not trying the primary use case. \u00c2\u00a0If your test app is too open-ended and abstract, it may be hard for others to even know what your app is <em>really<\/em> good at. \u00c2\u00a0I suggest you avoid treating testers as percolators of vision, and consider them more as an extremely low-bandwidth window into the minds of end users. \u00c2\u00a0Consider yourself as getting a few bits back at a time.<\/li>\n<\/ul>\n<p>There is a whole field of research on testing software, so this barely scratches the surface. \u00c2\u00a0Another good post is <a href=\"http:\/\/www.joelonsoftware.com\/articles\/BetaTest.html\">Joel on beta testing<\/a>.<\/p>\n<h2>Testing in person<\/h2>\n<p>Having explained so much about remote testing, I&#8217;d like to say that in-person testing is still the easiest and most in-depth way to go. \u00c2\u00a0When you are interacting directly with someone trying your app, you can see first-hand how bored or excited they are, and understand more easily which buttons they&#8217;re pushing and how they build their internal model of your interface.<\/p>\n<p>Test, tweak, repeat, &#8211; and converge your design to greatness!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post gives a quick introduction to beta testing for iOS developers. \u00c2\u00a0Specifically, I&#8217;ll walk through the major steps needed to legitimately send out a working copy of your app to testers without going through the app store &#8211; a process known as ad hoc distribution. Why beta test? All programmers become attached to their [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[87],"tags":[88],"_links":{"self":[{"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/98"}],"collection":[{"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=98"}],"version-history":[{"count":0,"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/98\/revisions"}],"wp:attachment":[{"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=98"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=98"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/bynomial.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=98"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}