Тестирование, отлаживая, и производительность
Эта глава перечисляет тактику, которую можно использовать для теста и отладить scriptable приложение Какао. Это также обеспечивает краткий список возможных проблем производительности, включая ссылки к информации о производительности в другом месте в этом документе.
План тестирования Scriptability
Как отмечено в Разработке для Scriptability, планирующего тестирование, должна быть неотъемлемая часть Вашего проектирования приложений и реализации. Ваш план тестирования должен включать регулярные этапы для подтверждения каждого шага scriptability. Они могут включать:
Проверка терминологии (проверяющий, что sdef семантически корректен).
Проверка, что приложение получает события Apple.
Проверка, что команды сценария инстанцируют и выполнились, когда получены соответствующие события Apple.
Проверка, что ожидаемые методы вызывают, чтобы получить и установить scriptable значения.
Проверение, что поддержка более сложных операторов сценария Вы поддерживаете, такой как
every
иwhose
операторы, работает. (Для примеров этих типов операторов посмотрите объектные спецификаторы для фильтра (whose
) иevery
ссылочные формы в Таблице 6-1.)
Ваш план тестирования должен также включать тестирование производительности. Для получения дополнительной информации посмотрите Проблемы Производительности для Scriptability.
Используйте сценарии AppleScript для тестирования приложения
Поскольку Вы реализуете свое приложение, необходимо накопить комплект сценариев тестирования для осуществления его scriptability. И чем больше функций, которые Вы делаете scriptable, тем больше Вашего тестирования сценария может служить испытательным стендом для Вашего целого приложения.
От Редактора сценариев можно вырезать и вставить вывод Event Log из сценариев тестирования и сохранить его для более позднего регрессионного тестирования. Поскольку Вы вносите изменения в свое приложение, можно ли в специфичном для сценария коде или нет, сравнить текущую производительность с сохраненной версией, чтобы помочь Вам найти возможные побочные эффекты.
Сделайте свои сценарии тестирования максимально завершенными следующим эти инструкции:
Осуществите всю иерархию своей объектной модели AppleScript: например, имейте свои сценарии, получают и устанавливают каждое доступное свойство каждого доступного объекта, с помощью
repeat
циклы иevery
операторы.После получения и установки значений, используйте a
log
оператор для журналированияproperties
свойство объектов записать изменения.Доступ для тестирования каждой применимой ссылочной формой: например, выполните итерации по scriptable наборам по имени, ID, индексом, и любой другой применяющейся формой. (См. Таблицу 6-1 для списка ссылочных форм.)
Тест, создающий новые объекты при помощи
make
команда и указание свойств.Например, этот сценарий тестирует Эскиз путем создания нового графического объекта в существующем документе:
Перечисление 8-1 Простой сценарий тестирования
tell application "Sketch"
tell document "Test Doc.sketch"
make new circle at end with properties {x position:50, y position:30, width:60, height:60}
end tell
end tell
Тестовое использование
whose
пункты: они - мощная функция сценариев, которая важна для пользователей.A
whose
пункт может обеспечить хороший стресс-тест для Вашего scriptability и может поднять проблемы производительности.Выполненные сценарии, вносящие изменения тогда, инвертируют их, затем проверяют, соответствует ли конечный результат начальную точку.
Выполняйте свои сценарии тестирования регулярно, даже после изменений кода, что Вы не ожидаете влиять на scriptability своего приложения.
Для получения дополнительной информации об использовании сценариев тестирования, включая примеры, видят Реализацию Глагола, который Выравнивает Первая Команда — и Реализация Объектной Первой Команды — Вращаются.
Включите отладочную информацию для сценариев
Включение отладочной информации Какао для сценариев поможет Вам отладить свое scriptable приложение. Отладочная информация показывает информацию такой как
загруженная scriptability информация (от sdef файла или от комплекта сценария и файлов с терминологией сценария)
выполняемые команды сценария
параметры выполняемым командам
Для включения этой поддержки Вы устанавливаете значение отладки в пользовательской системе значений по умолчанию, предоставленной OS X. Значения по умолчанию в глобальном домене доступны для любого приложения. Например, во время разработки, приложение может установить пользовательское значение по умолчанию, которое отладчик проверяет, чтобы определить, вывести ли на экран определенную отладочную информацию. Это - подход, который Какао проявляет к информации об отладке журнала для сценариев.
Шаги для включения отладочной информации какао
Для включения отладочной информации Какао для сценариев Вы делаете следующее:
Откройте Окно терминала. Терминал доступен в
/Applications/Utilities
.Введите следующую строку и нажмите Return для выполнения его:
defaults write NSGlobalDomain NSScriptingDebugLogLevel 1
Можно выключить отладочную информацию со строкой как это:
defaults write NSGlobalDomain NSScriptingDebugLogLevel 0
Можно вывести на экран всю текущую стоимость в глобальном домене со строкой как это:
defaults read NSGlobalDomain
Если Ваше приложение уже работает, выйдите из приложения.
Если Вы запускаете свое приложение от Средства поиска, ищете отладочную информацию в Консольном приложении (доступный в
/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 файла или комплекта сценария и файлов с терминологией сценария. Для этого выполните эти шаги:
Повредитесь где угодно в приложении.
Откройте 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, как Вы можете:
Определите, получает ли Ваше приложение события Apple (и зарегистрируйте информацию в тех событиях).
Используйте Редактор сценариев в качестве инструмента тестирования для отправки событий в приложение.
Наблюдайте события Apple для многократных приложений.
Найдите сторонние ресурсы для контроля и отладки событий Apple и scriptable приложений.
Проблемы производительности для Scriptability
Соображения производительности должны быть неотъемлемой частью Вашего плана тестирования, так, чтобы, поскольку Вы реализуете свое приложение, Вы всегда знали когда его увеличения производительности или уменьшения. У Вас может быть довольно хорошая идея, которой пути выполнения кода, наиболее вероятно, доставят неприятности, но получение регулярной информации синхронизации поможет избежать неожиданностей.
В целом Вы не должны будете волноваться о производительности в получении событий Apple и переводе их в объекты команды, поскольку приложения обычно не получают большие числа событий Apple, и Какао может декодировать их вполне быстро. Однако Ваше приложение не должно полагаться на события Apple для передачи информации, которая более подходит для более легкой формы общения веса, такова как уведомления. Посмотрите Уровень Драйверов ядра и Драйверов устройств в Технологическом Обзоре Mac для получения дополнительной информации об опциях межпроцессных взаимодействий, доступных в OS X.
Если событие Apple инициирует команду сценария, требующую, чтобы Ваше приложение выполнило асинхронное (и возможно длинный) работа, можно приостановить команду и возобновить его, когда работа завершена, как описано в Приостановке и Возобновлении Событий Apple и Команд Сценария. В то время как команда приостановлена, В зависимости от работы можно хотеть предоставить информацию прогресса. Однако приостановка команды (или событие Apple) не препятствует тому, чтобы инициирующий сценарий испытал таймаут, если Ваше приложение берет слишком долго для ответа на событие.
Производительность может также быть проблемой в определении, как реализовать определенную команду сценария приложений. Например, может быть проще реализовать объектную первую команду, где команда вызывает метод для каждого объекта, на который это воздействует. Однако использование объектного первого подхода может иметь последствия производительности в случаях, где значительный, наверху понесен для каждого объекта, особенно при контакте с большими количествами объектов. Как альтернатива, с помощью глагола первый подход может позволить Вам минимизировать наверху и оптимизировать операции на многократных объектах. Эти подходы описаны в Объекте сначала По сравнению с Глаголом первые Команды Сценария.
Для большинства приложений, производительности обработки значения по умолчанию сценариев Какао whose
пункты должны быть достаточными. Однако при нахождении потребности ускорить его можно использовать механизм, описанный в Реализации Метода для Оценки Объектных Спецификаторов.
Сценарии какао полагаются на кодирование значения ключа (KVC), чтобы получить и установить значения и найти объекты в Вашем приложении. Производительность KVC может варьироваться в зависимости от методов, которые Вы реализуете для поддержки его. Это - особенно истина для операций на массивах. Для подсказок относительно обработки этих проблем посмотрите Соображения Производительности С KVC.
Для общего введения в проблемы производительности посмотрите Начальную точку Производительности для OS X.