Эффективное тестирование приложений iPhone с помощью сборок релизов - PullRequest
4 голосов
/ 04 октября 2010

У нас есть приложение, которое зависло на armv6 устройствах iOS из App Store. armv7 Устройства iOS работали просто отлично. Когда приложение было собрано и протестировано как отладочное, оно прекрасно работало как на armv6, так и на armv7. В журналах я получал EXC_BAD_INSTRUCTION, когда он пытался создать объект из библиотеки. Сбой оказался ошибкой компоновки при сборке релиза, так как у меня есть несколько статических библиотек от three20. Сначала я думал, что это проблема с версией для iOS, но теперь она выглядит как «толстая двоичная» проблема.

Является ли ad-hoc лучшим способом создать симулированный App Store для тестирования? Как лучше всего протестировать сборку релиза на устройстве? Как лучше всего проверить связь с различными устройствами в выпуске сборке?

Ответы [ 4 ]

1 голос
/ 04 августа 2011

Я смог протестировать его с помощью специального распределения.

1 голос
/ 05 октября 2010

Я не могу найти ссылку на лаборатории тестирования совместимости с iOS, но я слышал, что в настоящее время она доступна.Если я смогу найти этот ресурс, я обновлю свой ответ.

В то же время вы можете найти совет по автоматизации тестирования пользовательского интерфейса здесь: Автоматическое тестирование для iPhone

К сожалению, вам придется найти 3g iPhone, чтобы проверить совместимость arm6.Я ожидаю, что вы сможете найти один достаточно просто, просто спросив всех, кого вы знаете, у кого есть новый iPhone.У них, вероятно, старый телефон сидит в ящике, как я.Я использую мой для тестирования.

Если вы можете оправдать сложное решение, вы можете навсегда подключить старый iPhone к mac mini и управлять пользовательским интерфейсом, используя вышеупомянутые платформы тестирования пользовательского интерфейса, используя Hudson или CruiseControl.Это был бы самый надежный и наименее трудоемкий подход, если бы вы могли сделать это заранее.

1 голос
/ 06 октября 2010

Вы можете изменить полномочия для подписи кода во встроенном приложении, используя инструмент командной строки codesign .После создания цели распространения файл приложения будет иметь полномочия «распространения»;вам нужно изменить его на development полномочия.После внесения изменений вы можете установить сборку на устройстве разработки и выполнить тестирование.

Чтобы увидеть подробный дамп подписи приложения:

$ codesign -d -vv MyApp.app/MyApp

Чтобы изменить полномочия кодового знака:

$ codesign -f -s "My iPhone Developer Name" -vv MyApp.app/MyApp

Возможно, вам понадобится создать переменную окружения, чтобы получить правильную версию codesign_allocate:

$ export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

Я нашел эти указания в блоге Крэйга Хокенберри, с большим количеством дополнительной информации об этом процессе.: http://furbo.org/2008/11/12/the-final-test/

0 голосов
/ 04 октября 2010

Я использую ANT для создания релизов, используя утилиту командной строки xcodebuild.Цель ant выглядит следующим образом:

 <target name="build-adhoc">
        <echo>Running XCODE compiler</echo>
        <exec executable="xcodebuild" failonerror="true" vmlauncher="false" dir="${connect_src}">
            <arg value="build"/>
            <arg value="-target" />
            <arg value="myappname" />
            <arg value="-configuration"/>
            <arg value="AdHoc"/>
            <arg value="SYMROOT=${export_app}-${version.number}/AdHoc" />
            <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/somesource/**\ /tmp/build/trunk/Libraries/somemoresource/**"/>
        </exec>
        <echo>xcode build complete</echo>
    </target>

Создайте конфигурацию для своего специального выпуска и убедитесь, что он использует специальный готовый профиль обеспечения.Или вы можете создать обычную, не специальную конфигурацию, которая использует ваш профиль обеспечения разработчика.Если вы сделаете первое, вы можете отправить продукт по электронной почте вместе с вашим профилем обеспечения тестерам.Если вы делаете последнее, вы можете использовать утилиту конфигурации iPhone для установки на любое устройство в профиле.

Кроме того, у нас есть целевая установка ANT с зависимостями от выполнения новой проверки из системы контроля версий и выполнения сборки оттуда.Наконец, мы делаем сборку сразу после этого, используя реальную конфигурацию, готовую для App Store, чтобы мы могли протестировать первую сборку и отправить вторую Apple, с некоторой степенью уверенности, что поведение кода будет таким же.

Вот сводка наших целей ANT в порядке обработки:

  1. установка переменных env, необходимых для сборок
  2. очистка каталогов извлечения и сборки
  3. извлечение HEAD из источникаcontrol
  4. изменение списков для удаления отладки и элементов только для внутреннего использования (с помощью PLISTBUDDY)
  5. инкрементная версия сборки (с использованием agvtool)
  6. запуск модульных тестов (для этого требуется настройка sdkустановить iphonesimulator4.x и специальную цель - см. Руководство для разработчиков iPhone для модульного тестирования)
  7. Выполнить внутреннюю сборку (с использованием профиля dev или специального профиля)
  8. Выполнить сборку распространения (с помощью приложения)Храните сертификат распространения)
  9. Checkin plist файлы, которые имеют новую версию сборки
  10. Сделайте тег в управлении исходным кодом, указывающийbuild
  11. Отчет о статистике сборки (версия сборки, местоположение и т. д.)

ПРИМЕЧАНИЕ: убедитесь, что вы задали переменную SYMROOT env в синтаксисе команды xcodebuild, чтобы ваша сборка оказалась вправильный каталог.После этого у нас возникли проблемы с копированием сборок App Store.

Вот полный сценарий ANT, используемый для создания нескольких сборок: одна для тестирования, а другая для распространения.Например: «ant distribution» создаст одну сборку с использованием профиля dev, а другую - с использованием профиля распространения App Store.

Этот сценарий «очищен», поэтому он служит только моделью для запуска:

<?xml version="1.0" ?>

<project basedir="." default="xcode-build" name="Temp">
    <property file="build.properties" />
    <property name = "CONFIGURATION_INTERNAL" value = "InternalRelease" />
    <property name = "CONFIGURATION_DISTRIBUTION" value = "Distribution" />
    <property name = "CONFIGURATION_ADHOC" value = "InternalAdHoc" />
    <property name="cvsroot" value=":pserver:${username}:${password}@${cvsurl}"/>
    <tstamp>
      <format property="TODAY"
              pattern="MM-dd-yyyy"
              locale="en,US"/>
    </tstamp>


    <target name="init">
        <echo message="deleting old directories" />
        <delete dir="${check_out_location}"/>
        <mkdir dir="${check_out_location}"/>
    </target>


    <target name="set-source-trees" depends="init">
    <echo message="exporting source tree variables" />
        <echo message="${somesourcedir}" />
        <exec executable="/bin/bash" os=" Mac OS X">
            <arg value="-c" />
            <arg value="${export_src_trees}"/>
            <arg value="${anothersourcedir}"/>
        </exec>
        <exec executable="/bin/bash" os=" Mac OS X">
            <arg value="-c" />
            <arg value="${export_src_trees}"/>
            <arg value="${yetanothersourcedir}"/>
        </exec>
    </target>


    <target name="cvs-login" depends="init" description="CVS Login">
        <echo>Login CVS</echo>
        <cvs cvsroot=":pserver:${username}:${password}@${cvsurl}" command="login" />
    </target>

    <target name="checkout" depends="cvs-login" description="Check out source from CVS">
        <echo message="check out from CVS ...." />
        <echo message="${check_out_location}" />
        <cvs cvsroot="${cvsroot}"  command=" -Q checkout -P -d${project_trunk} ${project_repository_root}/${project_trunk} " dest="${check_out_location}" compression="true" />
        <echo message="...check out from CVS done" />
    </target>


     <target name="strip-settings" depends="checkout" description="Remove elements from the Settings.bundle that we don't want in the distribution">
        <echo message="Removing Settings not valid for distribution"/>

        <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}/Resources">
            <arg value="-c"/>
            <arg value="Delete :PreferenceSpecifiers:3"/>
            <arg value="Settings.bundle/Root.plist"/>
        </exec>

        <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}/Resources">
            <arg value="-c"/>
            <arg value="Delete :PreferenceSpecifiers:3"/>
            <arg value="Settings.bundle/Root.plist"/>
        </exec>
    </target>


    <target name="build-version" depends="checkout">

        <property name = "LOGLEVEL" value = "DEBUG" />

       <!-- GET THE NEXT VERSION NUMBER (major and minor) -->
        <exec executable="/tmp/build/trunk/Build/version.sh" failonerror="TRUE" outputproperty="version.number" dir="${app_src}"></exec>

        <echo message="Increment Build Number"/>

        <exec executable="agvtool" failonerror="TRUE" dir="${app_src}">
            <arg value="new-version"/>
            <arg value="-all"/>
            <arg value="${version.number}"/>
        </exec>

        <!-- GET THE MINOR portion of the version number for later use -->
        <exec executable="/tmp/build/trunk/Build/minor.sh" failonerror="TRUE" outputproperty="version.minor" dir="${app_src}"></exec>

        <!-- SET the version number as reference in the Settings.bundle -->
        <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}">
            <arg value="-c"/>
            <arg value="Set :PreferenceSpecifiers:1:DefaultValue ${version.number}"/>
            <arg value="./Resources/Settings.bundle/Root.plist"/>
        </exec>

        <echo message="New build number=${version.number}"/>

        <!-- SET the log level - NOTE, ANT vars are immutable, if LOGLEVEL was previously set, it cannot be overridden -->
        <exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}">
            <arg value="-c"/>
            <arg value="Set LogLevel.Default ${LOGLEVEL}"/>
            <arg value="./Resources/SharedConfig.plist"/>
        </exec>
        <echo message="Log level set to ${LOGLEVEL}"/>

    </target>


     <target name="encrypt" depends="build-version">
        <!-- SOME ENCRYPTION OF SENSITIVE DATA -->
    </target>


    <target name="build-internal" depends="test-lib1, test-lib2, test-app, encrypt">
        <echo>Running XCODE compiler</echo>
        <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
            <arg value="clean"/>
            <arg value="install"/>    
            <arg value="-target" />
            <arg value="MyApp" />
            <arg value="-configuration"/>
            <arg value="${CONFIGURATION_INTERNAL}"/>
            <arg value="SYMROOT=${build_release}" />
            <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/somesource/**\ /tmp/build/trunk/Libraries/someothersource/**"/>
        </exec>
        <echo>xcode build complete</echo>
    </target>

     <target name="test-lib1" depends="checkout">
        <echo>Running XCODE compiler</echo>
        <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${somelib_dir}">
            <arg value="clean"/>
            <arg value="build"/>
            <arg value="-target" />
            <arg value="Lib1UnitTests"/>
            <arg value="-sdk"/>
            <arg value="iphonesimulator4.1"/>
            <arg value="SYMROOT=${build_release}" />
        </exec>
        <echo>xcode build complete</echo>
    </target>

     <target name="test-lib2" depends="checkout">
        <echo>Running XCODE compiler</echo>
        <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${somelib2_src_dir}">
            <arg value="clean"/>
            <arg value="build"/>
            <arg value="-target" />
            <arg value="Lib2UnitTests"/>
            <arg value="-sdk"/>
            <arg value="iphonesimulator4.1"/>
            <arg value="SYMROOT=${build_release}" />
            <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1source/**"/>
        </exec>
        <echo>xcode build complete</echo>
    </target>

      <target name="test-app" depends="checkout">
        <echo>Running XCODE compiler</echo>
        <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
            <arg value="clean"/>
            <arg value="build"/>
            <arg value="-target" />
            <arg value="AppUnitTests"/>
            <arg value="-sdk"/>
            <arg value="iphonesimulator4.1"/>
            <arg value="SYMROOT=${build_release}" />
            <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
        </exec>
        <echo>xcode build complete</echo>
    </target>

     <target name="build-distribution" depends="internal-release, test-lib1, test-lib2, test-app">
        <echo>Running XCODE compiler</echo>
        <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
            <arg value="build"/>
            <arg value="-target" />
            <arg value="MyApp" />
            <arg value="-configuration"/>
            <arg value="${CONFIGURATION_DISTRIBUTION}"/>
            <arg value="SYMROOT=${export_app}-${version.number}/Distribution" />
            <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
        </exec>
        <echo>xcode build complete</echo>
    </target>

    <target name="build-adhoc" depends="internal-release, test-lib1, test-lib2, test-app">
        <echo>Running XCODE compiler</echo>
        <exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
            <arg value="build"/>
            <arg value="-target" />
            <arg value="MyApp" />
            <arg value="-configuration"/>
            <arg value="${CONFIGURATION_ADHOC}"/>
            <arg value="SYMROOT=${export_app}-${version.number}/AdHoc" />
            <env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
        </exec>
        <echo>xcode build complete</echo>
    </target>


    <target name="checkin" depends="build-internal" description="Commit source to CVS" >
        <echo message="Committing to CVS ...." />
        <echo message="${check_out_location}" />

         <cvs cvsroot="${cvsroot}"  command="commit -m 'Commit of internal release build ${version.number}' MyApp-Info.plist" dest="${check_out_location}/trunk/Applications/MyApp" />
        <echo message="...commit done" />
    </target>


     <target name="tag-release" depends="checkin" description="Tag source in CVS" >
        <echo message="Tagging source ... Release-${version.minor}" />
        <echo message="${check_out_location}" />
        <cvs cvsroot="${cvsroot}"  command="tag Release-${version.minor}" dest="${check_out_location}"/>
        <echo message="...tag done" />
    </target>


     <target name="internal-release" depends="tag-release" description="Tag source in CVS" >
        <echo message="Creating Internal release ..." />
        <echo message="Deploying files to . . .${export_app}" />
        <copy todir="${export_app}-${version.number}">
            <fileset dir="${prod_dir_internal}"/>
        </copy>

        <echo message="Internal release ${version.number} complete." />
    </target>


     <target name="override-default-env"  description="Setup Env for Distribution" >
                <property name = "LOGLEVEL" value = "WARN" />
     </target>


     <target name="distribution" depends="override-default-env, strip-settings, build-distribution" description="Create Distribution" >

        <echo message="Creating Distribution ..." />
        <echo message="Deploying files to . . .${export_app}-${version.number}/Distribution" />
        <echo message="Distribution ${version.number} complete." />

    </target>

     <target name="adhoc" depends="override-default-env, strip-settings, build-adhoc" description="Create Ad Hoc Distribution" >

        <echo message="Creating ad hoc distribution ..." />
        <echo message="Deploying files to . . .${export_app}-${version.number}/AdHoc" />
        <echo message="Ad hoc distribution ${version.number} complete." />

    </target>


</project>

Hope this helps.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...