Тестирование, отлаживая, и производительность

Эта глава перечисляет тактику, которую можно использовать для теста и отладить scriptable приложение Какао. Это также обеспечивает краткий список возможных проблем производительности, включая ссылки к информации о производительности в другом месте в этом документе.

План тестирования Scriptability

Как отмечено в Разработке для Scriptability, планирующего тестирование, должна быть неотъемлемая часть Вашего проектирования приложений и реализации. Ваш план тестирования должен включать регулярные этапы для подтверждения каждого шага scriptability. Они могут включать:

  1. Проверка терминологии (проверяющий, что sdef семантически корректен).

  2. Проверка, что приложение получает события Apple.

  3. Проверка, что команды сценария инстанцируют и выполнились, когда получены соответствующие события Apple.

  4. Проверка, что ожидаемые методы вызывают, чтобы получить и установить scriptable значения.

  5. Проверение, что поддержка более сложных операторов сценария Вы поддерживаете, такой как every и whose операторы, работает. (Для примеров этих типов операторов посмотрите объектные спецификаторы для фильтра (whose) и every ссылочные формы в Таблице 6-1.)

Ваш план тестирования должен также включать тестирование производительности. Для получения дополнительной информации посмотрите Проблемы Производительности для Scriptability.

Используйте сценарии AppleScript для тестирования приложения

Поскольку Вы реализуете свое приложение, необходимо накопить комплект сценариев тестирования для осуществления его scriptability. И чем больше функций, которые Вы делаете scriptable, тем больше Вашего тестирования сценария может служить испытательным стендом для Вашего целого приложения.

От Редактора сценариев можно вырезать и вставить вывод Event Log из сценариев тестирования и сохранить его для более позднего регрессионного тестирования. Поскольку Вы вносите изменения в свое приложение, можно ли в специфичном для сценария коде или нет, сравнить текущую производительность с сохраненной версией, чтобы помочь Вам найти возможные побочные эффекты.

Сделайте свои сценарии тестирования максимально завершенными следующим эти инструкции:

Для получения дополнительной информации об использовании сценариев тестирования, включая примеры, видят Реализацию Глагола, который Выравнивает Первая Команда — и Реализация Объектной Первой Команды — Вращаются.

Включите отладочную информацию для сценариев

Включение отладочной информации Какао для сценариев поможет Вам отладить свое scriptable приложение. Отладочная информация показывает информацию такой как

Для включения этой поддержки Вы устанавливаете значение отладки в пользовательской системе значений по умолчанию, предоставленной OS X. Значения по умолчанию в глобальном домене доступны для любого приложения. Например, во время разработки, приложение может установить пользовательское значение по умолчанию, которое отладчик проверяет, чтобы определить, вывести ли на экран определенную отладочную информацию. Это - подход, который Какао проявляет к информации об отладке журнала для сценариев.

Шаги для включения отладочной информации какао

Для включения отладочной информации Какао для сценариев Вы делаете следующее:

  1. Откройте Окно терминала. Терминал доступен в /Applications/Utilities.

  2. Введите следующую строку и нажмите Return для выполнения его:

    defaults write NSGlobalDomain NSScriptingDebugLogLevel 1

    Можно выключить отладочную информацию со строкой как это:

    defaults write NSGlobalDomain NSScriptingDebugLogLevel 0

    Можно вывести на экран всю текущую стоимость в глобальном домене со строкой как это:

    defaults read NSGlobalDomain
  3. Если Ваше приложение уже работает, выйдите из приложения.

  4. Если Вы запускаете свое приложение от Средства поиска, ищете отладочную информацию в Консольном приложении (доступный в /Applications/Utilities). Если Вы запускаете свое приложение в XCode, ищете отладочную информацию в области Debug Console или в области Run.

Вы не будете видеть отладочной информации, пока приложение не получит событие Apple, заставляющее его выполнять команду сценария (и, в свою очередь, загружать scriptability информацию приложения). Можно просмотреть отладочную информацию или для разработки или для сборки развертывания приложения.

Если Вы только хотите включить отладку сценария для определенного приложения, можно использовать домен приложения. Домен приложения идентифицируется идентификатором пакета приложения, обычно строка в форме имени пакета стиля Java (думайте о нем как об обратном URL). Например, Вы могли включить журналирование отладки сценария для примера приложения Эскиза (доступный от Apple) путем выполнения следующей строки:

defaults write com.apple.CocoaExamples.Sketch NSScriptingDebugLogLevel 1

Чтобы считать это значение или сбросить его для обнуления используйте одну из следующих двух строк:

defaults read com.apple.CocoaExamples.Sketch NSScriptingDebugLogLevel
defaults write com.apple.CocoaExamples.Sketch NSScriptingDebugLogLevel 0

Демонстрационный вывод

Следующее перечисление показывает сценарий, изменяющий высоту круга в окне приложения Эскиза.

tell application "Sketch"
    tell the first document
        set height of first circle to 100
    end tell
end tell

Перечисление 8-2 показывает вывод отладки от выполнения сценария, показанного выше на версии Эскиза, предоставляющего его scriptability информацию с sdef файлом. Вывод показывает команду, перечисленную как Command: Intrinsics.set, потому что Какао, пишущее сценарий автоматически, предоставляет информацию для различной «внутренней» терминологии AppleScript.

Отладочная информация включает прямой параметр (свойство для установки, height), получатели для команды (спецификатор для circles 1 of orderedDocuments 1), и параметры за команду (значение для установки, 100). Можно также видеть, что Эскиз возвращает результат null, потому что никакое возвращаемое значение не необходимо для a set команда.

  Сценарии Отладки перечисления 8-2 выводятся для находящегося в sdef Эскиза

2006-02-24 13:51:29.951 Sketch[8245] Command: Intrinsics.set
    Direct Parameter: <NSPropertySpecifier: height>
    Receivers: <NSIndexSpecifier: circles 1 of orderedDocuments 1>
    Arguments: {Value = <NSAppleEventDescriptor: 100
2006-02-24 13:51:29.953 Sketch[8245] Result: (null)

Перечисление 8-2 показывает вывод от выполнения того же сценария на версии приложения Эскиза, предоставляющего его scriptability информацию в формате комплекта сценария. Существует два основных отличий от предыдущего перечисления:

  • Во-первых, вывод показывает Стандартный комплект (раньше названный Базовым комплектом), текстовым комплектом и комплектами Эскиза — Вы будете видеть эту информацию в первый раз загрузки приложения те комплекты в ответ на получение события Apple.

  • Во-вторых, команда перечислена как Command: NSCoreSuite.Set, отражение комплекта форматирует для того, чтобы предоставить внутреннюю scriptability информацию.

  Вывод сценариев Отладки перечисления 8-3 для сценария основанный на комплекте Эскиз

2005-05-20 13:38:39.736 Sketch[2005-05-20 13:40:55.215 Sketch[516] Suite NSCoreSuite, apple event code 0x3f3f3f3f
2005-05-20 13:40:55.223 Sketch[516] Suite NSTextSuite, apple event code 0x3f3f3f3f
2005-05-20 13:40:55.253 Sketch[516] Suite Sketch, apple event code 0x736b7463
2005-05-20 13:40:55.259 Sketch[516] Command: NSCoreSuite.Set
    Direct Parameter: <NSPropertySpecifier: height>
    Receivers: <NSIndexSpecifier: circles 1 of orderedDocuments 1>
    Arguments: {Value = 100; }
    Key Specifier: <NSPropertySpecifier: height>
2005-05-20 13:40:55.261 Sketch[516] Result: (null)

Отладка информация о Scriptability

Для просмотра sdef файла в средстве просмотра словаря дважды щелкните по нему в Средстве поиска. Двойной щелчок по sdef файлу в проекте XCode так же открывает его в окне средства просмотра словаря. Чтобы просмотреть или отредактировать XML для файла, откройте sdef файл с любым редактором простого текста; в XCode выберите sdef файл и выберите File> Open As> Plain Text File.

Поскольку Вы добавляете информацию к sdef файлу, можно проверить, что файл все еще допустим (семантически корректный) путем открытия ее с Редактором сценариев или XCode. Если те приложения не могут проанализировать файл, Вы не будете видеть “Ничего для наблюдения здесь; пройдите”. выведенный на экран в средстве просмотра словаря. Можно тогда открыть Консольный журнал для наблюдения определенных ошибок анализа.

Проверка sdef Файла с xmllint

Можно также проверить sdef с xmllint инструмент, с помощью командной строки как следующее:

xmllint --noout --postvalid --xinclude YourApp.sdef

Дополнительную информацию см. в xmllint странице справочника.

Исследование информации о Scriptability в приложении

description методы различных классов сценариев Какао могут предоставить полезную информацию. Можно просмотреть эту информацию во время сеанса отладки с print object команда в отладчике GDB. (Эта команда может быть сокращена как po.), Например, можно исследовать информационные сценарии Какао, извлек из sdef файла или комплекта сценария и файлов с терминологией сценария. Для этого выполните эти шаги:

  1. Отладьте приложение в XCode.

  2. Повредитесь где угодно в приложении.

  3. Откройте Debugger Console Log и введите эту команду:

    print object [NSClassFromString(@"NSScriptSuiteRegistry") sharedScriptSuiteRegistry]

В результате этих шагов Вы получите подробное перечисление scriptability информации NSScriptSuiteRegistry загрузился для приложения. Перечисление 8-4 показывает просто get и set информация о команде от того вывода.

  Вывод Listing 8-4 Partial информации о NSScriptSuiteRegistry

 Command: get ('core'/'getd')
        Implementation class: NSGetCommand
        Name: "get", description: "Returns the value of the specified object(s)."
        Unnamed argument ('----'), type: specifier ('obj '), optional: no
            (No user-readable name or description needed for unnamed arguments)
        Result type: any ('****')
            Description: <none>
    Command: set ('core'/'setd')
        Implementation class: NSSetCommand
        Name: "set", description: "Sets the value of the specified object(s)."
        Unnamed argument ('----'), type: specifier ('obj '), optional: no
            (No user-readable name or description needed for unnamed arguments)
        Argument: Value ('data'), type: any ('****'), optional: no
            Name: "to", description: "The new value."
        Result type: <none> ('null')
            Description: <none>

Точно так же можно получить описания экземпляров NSScriptCommand и NSAppleEventDescriptor классы. Например, можно использовать следующую команду в контрольной точке во время выполнения команды сценария:

print object [NSClassFromString(@"NSScriptCommand") currentCommand]

Если необходимо знать больше об определенных событиях Apple, полученных приложением, можно исследовать информацию на событие Apple, инициировавшее текущую команду сценариев с оператором как следующее:

print object [[NSClassFromString(@"NSScriptCommand") currentCommand] appleEvent]

Можно получить подобную информацию при помощи NSLog операторы в Вашем приложении, позволяя Вам отследить выполнение через Ваш код, поскольку Вы реализуете поддержку scriptability. Например, приложение Эскиза содержит файл my.h. Тот файл обеспечивает определения входящему в систему повороту или прочь на основе значения myMasterSwitch, показанный в Перечислении 8-5. Установите его в 1, перекомпилируйте, и любой NSLog операторы в Вашем приложении будут выполняться:

Перечисление 8-5  , Включающее операторы журнала

#define    myMasterSwitch    ( 0 )
 
#if        myMasterSwitch
#define    myLog1(x)    NSLog(x)
#define    myLog2(x,y)    NSLog(x,y)
#else
#define    myLog1(x)
#define    myLog2(x,y)
#endif

Для дампа информации для объекта команды в Эскизе Вы могли поместить это NSLog оператор в performDefaultImplementation метод SKTAlignCommand класс:

myLog2(@"SKTAlignCommand performDefaultImplementation command = %@", self);

Вот результат из Консоли XCode (после того, как установка myMasterSwitch к 1 в my.h и перекомпиляция):

  Вывод Listing 8-6 NSLog для SKTAlignCommand

2006-02-01 13:15:31.622 Sketch[1662] ME SKTAlignCommand performDefaultImplementation command = Sketch Suite.align
    Direct Parameter: <CFArray 0x3d3780 [0xa073a150]>{type = mutable-small, count = 2, values = (
    0 : <NSIndexSpecifier: graphics 1 of orderedDocuments named "SketchDoc">
    1 : <NSIndexSpecifier: graphics 2 of orderedDocuments named "SketchDoc">
)}
    Receivers: (null)
    Arguments: {
        "" = (
            <NSIndexSpecifier: graphics 1 of orderedDocuments named "SketchDoc">,
            <NSIndexSpecifier: graphics 2 of orderedDocuments named "SketchDoc">
        );
        toEdge = 1986359907;
    }

В этом выводе Вы видите, что прямой параметр использует индексные спецификаторы для указания двух графики. Прямой параметр (с теми же двумя спецификаторами) также выведен на экран в массиве arguments, идентифицированном пустой строкой ("") ключ. Край для выравнивания графики к также предоставлен как параметр с ключом "toEdge".

Дополнительные подсказки по отладке

Существует много подсказок по отладке события Apple, работающих хорошо и на приложения, использующие менеджера по корпоративным мероприятиям Apple непосредственно и тех, которые используют платформы, такие как Какао. Например, глава, которую описывает Тестирующий и Отлаживающий Код события Apple в Руководстве по программированию Событий Apple, как Вы можете:

Проблемы производительности для Scriptability

Соображения производительности должны быть неотъемлемой частью Вашего плана тестирования, так, чтобы, поскольку Вы реализуете свое приложение, Вы всегда знали когда его увеличения производительности или уменьшения. У Вас может быть довольно хорошая идея, которой пути выполнения кода, наиболее вероятно, доставят неприятности, но получение регулярной информации синхронизации поможет избежать неожиданностей.

В целом Вы не должны будете волноваться о производительности в получении событий Apple и переводе их в объекты команды, поскольку приложения обычно не получают большие числа событий Apple, и Какао может декодировать их вполне быстро. Однако Ваше приложение не должно полагаться на события Apple для передачи информации, которая более подходит для более легкой формы общения веса, такова как уведомления. Посмотрите Уровень Драйверов ядра и Драйверов устройств в Технологическом Обзоре Mac для получения дополнительной информации об опциях межпроцессных взаимодействий, доступных в OS X.

Если событие Apple инициирует команду сценария, требующую, чтобы Ваше приложение выполнило асинхронное (и возможно длинный) работа, можно приостановить команду и возобновить его, когда работа завершена, как описано в Приостановке и Возобновлении Событий Apple и Команд Сценария. В то время как команда приостановлена, В зависимости от работы можно хотеть предоставить информацию прогресса. Однако приостановка команды (или событие Apple) не препятствует тому, чтобы инициирующий сценарий испытал таймаут, если Ваше приложение берет слишком долго для ответа на событие.

Производительность может также быть проблемой в определении, как реализовать определенную команду сценария приложений. Например, может быть проще реализовать объектную первую команду, где команда вызывает метод для каждого объекта, на который это воздействует. Однако использование объектного первого подхода может иметь последствия производительности в случаях, где значительный, наверху понесен для каждого объекта, особенно при контакте с большими количествами объектов. Как альтернатива, с помощью глагола первый подход может позволить Вам минимизировать наверху и оптимизировать операции на многократных объектах. Эти подходы описаны в Объекте сначала По сравнению с Глаголом первые Команды Сценария.

Для большинства приложений, производительности обработки значения по умолчанию сценариев Какао whose пункты должны быть достаточными. Однако при нахождении потребности ускорить его можно использовать механизм, описанный в Реализации Метода для Оценки Объектных Спецификаторов.

Сценарии какао полагаются на кодирование значения ключа (KVC), чтобы получить и установить значения и найти объекты в Вашем приложении. Производительность KVC может варьироваться в зависимости от методов, которые Вы реализуете для поддержки его. Это - особенно истина для операций на массивах. Для подсказок относительно обработки этих проблем посмотрите Соображения Производительности С KVC.

Для общего введения в проблемы производительности посмотрите Начальную точку Производительности для OS X.