💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. В заданиях с кодом опирайтесь на показанный фрагмент и наблюдаемое поведение; в ситуационных — на публичный договор и последствия решения.
Вопрос 3 из 30
Код проходит обычный сценарий. Какие проверки по теме «Трассировки» нужны, чтобы разные граничные исходы не слились в один?
Dart Dart · Трассировки · границы Копировать
Future<void> refresh() async {
try {
await repository.refresh();
} catch (error, stack) {
Error.throwWithStackTrace(RefreshFailed(error), stack);
}
}
// Контекст задания: анализ граничных входов.
Проверить независимо друг от друга: асинхронная граница, обёрнутое исключение, отсутствующие символы и первый пользовательский кадр, не являющийся причиной.
Проверить для «Трассировки» только самый сложный случай «не являющийся причиной», считая остальные границы косвенно покрытыми.
Автоматизировать обычный путь «Трассировки», а случай «не являющийся причиной» оставить в ручном чек-листе выпуска.
Проверить входы «Трассировки» только на текущей реализации, не закрепляя результат как внешний договор. Отдельное состояние после отказа «Трассировки» в таком плане не анализируется.
Во всех спорных входах «Трассировки» проверять только отсутствие необработанного исключения, не сравнивая состояние.
Вопрос 6 из 30
Для показанного решения написали один тест на успех. Какой набор граничных сценариев по теме «Отчёты об авариях» должен появиться рядом?
Dart Dart · Отчёты об авариях · границы Копировать
void reportCrash(Object error, StackTrace stack) {
crashes.record(
error,
stack,
tags: {'appVersion': build.version, 'platform': platform.name, 'screen': route.name},
);
}
// Контекст задания: анализ граничных входов.
Задать самостоятельные ожидания для случаев: отчёт без версии и платформы, дубли одинакового сбоя и чувствительные пользовательские данные.
Проверить для «Отчёты об авариях» только самый сложный случай «чувствительные пользовательские данные», считая остальные границы косвенно покрытыми.
Объединить «отчёт без версии и платформы» и «дубли одинакового сбоя» в один тест «Отчёты об авариях» с общим ожидаемым исходом.
Для «Отчёты об авариях» ограничиться случаем «отчёт без версии и платформы», а остальные входы считать тем же классом отказа.
Автоматизировать обычный путь «Отчёты об авариях», а случай «чувствительные пользовательские данные» оставить в ручном чек-листе выпуска.
Вопрос 8 из 30
Какое утверждение корректно связывает показанный код с семантикой темы «Отчёты об авариях»?
Dart Dart · Отчёты об авариях · семантика Копировать
void reportCrash(Object error, StackTrace stack) {
crashes.record(
error,
stack,
tags: {'appVersion': build.version, 'platform': platform.name, 'screen': route.name},
);
}
// Контекст задания: проверка семантики фрагмента.
Порядок внутренних вызовов «Отчёты об авариях» считать публичной гарантией, которую нельзя менять при рефакторинге. Вывод делают по поведению текущей реализации «Отчёты об авариях» на обычном входе.
Для «Отчёты об авариях» считать случаи «отчёт без версии и платформы, дубли одинакового сбоя и чувствительные пользовательские данные» эквивалентными, если программа не завершается аварийно.
Спорный результат «Отчёты об авариях» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Crash report полезен вместе с версией, платформой, символами и последовательностью обезличенных событий; полный пользовательский ввод в отчёте создаёт новую утечку.
Случай «чувствительные пользовательские данные» объявить внутренней деталью «Отчёты об авариях», даже если клиент видит иной результат.
Вопрос 21 из 30
Какой вывод о фрагменте «Контроль ресурсов» останется верным после безопасного рефакторинга?
Dart Dart · Контроль ресурсов · семантика Копировать
final class NativeBuffer implements Finalizable {
NativeBuffer(this.pointer, this.length) {
_finalizer.attach(this, pointer.cast(), detach: this);
}
final Pointer<Uint8> pointer;
final int length;
void dispose() => _finalizer.detach(this);
}
// Контекст задания: проверка семантики фрагмента.
Для «Контроль ресурсов» считать случаи «контроллер, подписка, таймер, порт или нативная память без симметричного завершения» эквивалентными, если программа не завершается аварийно.
Случай «порт или нативная память без симметричного завершения» объявить внутренней деталью «Контроль ресурсов», даже если клиент видит иной результат.
Спорный результат «Контроль ресурсов» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь. Вывод делают по поведению текущей реализации «Контроль ресурсов» на обычном входе.
Контроллеры, подписки, таймеры, порты и нативная память имеют владельца и симметричное освобождение; `dispose` должен быть безопасен при ожидаемом порядке жизненного цикла.
Порядок внутренних вызовов «Контроль ресурсов» считать публичной гарантией, которую нельзя менять при рефакторинге. Дополнительные границы «Контроль ресурсов» при таком рассуждении считают избыточными.