Какой должен быть шрифт в контрольной работе: требования по ГОСТ, структура + пример

Содержание

Какой шрифт должен быть в реферате по ГОСТу (размер шрифта)

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

Общие правила по оформлению шрифта в реферате

За неправильно использованный шрифт при написании реферата, преподаватели могут снизить оценку на один балл. Поэтому, перед сдачей учебного проекта, лучше проверить все параметры шрифта:

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

  1. Стиль шрифта при написании реферата – Times New Roman.

  2. Шрифт для реферата по ГОСТу – 14 пт.

  3. Стандартный цвет букв – черный.

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

Важно! Следует внимательно изучить методические рекомендации вуза по оформлению исследовательских проектов. Исключением из общих правил может стать оформление формул и примеров внутри документа


Что можно писать прописным шрифтом

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

Форматирование начинается с титульного листа. Именно он содержит большую концентрацию прописных букв:

  1. Вся информация об учебном заведении, факультете и кафедре набирается заглавными буквами, шрифтом 14го размера.

  2. Слово «реферат» также имеет прописное начертание, дополнительно используется полужирное выделение, размер букв увеличивается до 24-26 пт.

  3. Название темы реферата набирается полужирными, заглавными буквами, размер шрифта – 14 кегль.

Следующий шаг – это оформление оглавления. Здесь заглавные буквы используются для написания слова «содержание», а также для названия глав, слов «введение», «заключение» и «список литературы». Данное правило касается и названия разделов внутри рефератного материала. Для написания параграфов и подразделов используются строчные буквы.


Интервал между строк и абзацами

Настройка межстрочного интервала также важна при форматировании работы. От этого параметра зависит читаемость информации и объем. В соответствии с ГОСТом текст может иметь следующие интервалы:

  1. Межстрочный интервал – полуторный.

  2. Интервал до и после абзаца – автоматический.

Чтобы выставить правильные параметры, надо воспользоваться настройками «Абзац. В строке «Не добавлять интервал между абзацами одного стиля» не должно быть никаких отметок. Этот параметр позволяет визуально отделять абзацы друг от друга – делая реферат удобным для чтения.


Выравнивание текста

Основной материал реферата имеет выравнивание по ширине листа. Чтобы применить данную настройку, требуется выделить весь текст и выбрать соответствующий пункт в главном меню.


Следующий шаг – это редактирование заголовков. Названия глав и параграфов, слова «содержание», «введение», «заключение» и «библиографические источники» должны располагаться по центру страницы.

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

Отступы

Рефераты, доклады и другие исследовательские работы имеют последовательное изложение мыслей, поэтому весь материал надо делить на смысловые абзацы. Хорошая читаемость текста зависит не только от межстрочного интервала, но и от отступов. В зависимости от требований педагога или методических рекомендаций учебного заведения, значение отступа первой строки может варьироваться в пределах 1-2 см. По ГОСТу данный показатель равен 1,25 см.

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

Важно! Заголовки и названия разделов внутри документа, имеющие выравнивание по центру, должны быть отформатированы без абзацных отступов. Если в материале есть нумерованные и маркированные списки, то для них лучше выставить в поле левый отступ – 1 см

Расположение текста на листе

Реферат надо печатать на листе размером А4 с книжной ориентацией. Исключения составляют приложения к исследованию, которые могут иметь альбомную ориентацию. Для того, чтобы внешне работа выглядела красиво – нужно правильно настроить разметку страницы. Опять же, в «методичках» эти показатели могут быть иными, но в ГОСТе написаны следующие значения:

  • верхнее поле – 2 см;

  • правое поле – 1,5 см;

  • нижнее поле – 2 см;

  • левое поле – 3 см.


Важно! Текст каждого нового раздела или главы следует начинать со следующего листа, для этого надо использовать параметр «разрыв страницы»

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

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


Каким шрифтом писать курсовую – советы студентам

Содержание

 

  1. Каким шрифтом писать курсовую – обзор требований ВУЗов

          — выбираем размер шрифта

          — интервал в тексте курсовой работы

          — как выбрать тип шрифта

          — какой цвет шрифта выбираем для курсовой

  1. Отступы и абзацы – правила оформления
  2. Оформление курсовой работы – важный совет

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

 

1. Каким шрифтом писать курсовую – обзор требований ВУЗов

 

Перед тем как разобраться, каким шрифтом писать курсовую работу, давайте рассмотрим требования и методические указания, которые предъявляются к оформлению курсовых работ 5 совершенно любых высших учебных заведений, пусть это будут Московский государственный университет им.М.Ломоносова, Казанский государственный медицинский университет, Башкирская академия государственного и муниципального управления при Главе РБ, Самарский национальный исследовательский университет имени академика С. П. Королева и Гуманитарно-педагогический институт г.Тольятти.

 Итак, анализ и тщательное исследование  необходимых шрифтовых параметров показало наличие нескольких пунктов, на которые необходимо обратить внимание при оформлении курсовой работы.

Выбираем размер шрифта

 

Для абсолютного большинства высших учебных заведений стандартным размером для написания курсовых работ является 14 кегль. Это связано с тем, что данный размер шрифта в сочетании с 1,5-ным интервалом приближает 1 страницу печатного компьютерного текста к странице текста машинописного. Это было сделано для удобства редактирования, подсчета количества символов на странице и более плавного перехода к компьютерной верстке.

 

Однако, известны случаи, когда кроме стандартного 14 шрифта допускается оформить работу 12-ым кеглем, и прописан этот норматив в методических рекомендациях к оформлению курсовых работ, например, Нижегородский государственный технический университет имени Р.Алексеева в требованиях к курсовой работе в пункте 3.9 прописывает, что набор текста необходимо производить размером 12 pt с интервалом 1,5 или 14-ым с интервалом 1. Но это скорее исключение из правил.

Пример оформления курсовой работы (ГОСТ 2019-2020)

Оформление курсовой работы – дело очень серьезное и ответственное. Чтобы разобраться во всех тонкостях правильного оформления вам потребуется немало времени, терпения и усидчивости. Итак, в данной статье мы подробно остановимся на каждом элементе – введении, содержании, основной части, заключении, списке литературы и покажем примеры оформления курсовой работы по ГОСТу 2019-2020 гг.

Содержание

Пример оформления курсовой работы – общие требования по ГОСТу

Как оформить курсовую работу — начинаем с титульника

Как правильно оформить курсовую: введение

Оформление курсовой работы по госту 2019-2020 – основное содержание

Образец оформления курсовой работы: заключение

Оформляем курсовую: список литературы — примеры, образец

 Пример оформления курсовой работы — общие требования по ГОСТу

 

Как показывает практика, очень много студентов не знают, где найти пример оформления курсовой работы оформленный по ГОСТУ. Если вы поставили последнюю точку в своей курсовой собираетесь сдавать ее преподавателю, не спешите. Не забудьте, что остался еще один важный шаг – проверить и откорректировать оформление работы. Это не так просто, как кажется на первый взгляд. Мы сейчас подскажем на что нужно обратить особое внимание.

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

       

Курсовая работа всегда должна состоять из таких обязательных частей:

  1. Титульный лист
  2. Содержание
  3. Введение
  4. Главы основного содержания — две или три по желанию
  5. Заключение
  6. Список используемой литературы
  7. Приложения, но их может и не быть

Требования к оформлению контрольной работы

    1. Общие требования.

  1. Структура контрольной работы состоит из следующих частей: Титульный лист; содержание; рассмотрение первого вопроса; рассмотрение второго вопроса; решение задачи; список использованной литературы; приложения (если есть).

  2. Список использованной литературы должен включать: кодексы; законодательные акты; учебные пособия и другие источники.

  3. Страницы контрольной работы должны быть пронумерованы и скреплены с помощью степлерных скобок или тесьмы. Контрольная работа может быть выполнена в специальной прозрачной папке для контрольных работ.

Ни в коем случае не допускается скрепление листов при помощи канцелярской скрепки.

  1. Контрольная работа выполняется на бумаге формата А4 (210 × 290), с одной стороны листа при соблюдении следующих условий:

  • ширина всех полей – 25 мм;

  • шрифт – Times New Roman;

  • размер шрифта – 14;

  • межстрочный интервал – 1.5;

  • интервал между словами – 1 знак;

  • абзацный отступ – 1.25;

  • выравнивание текста – по ширине;

  • цвет шрифта – черный;

  • нумерация страниц – по центру внизу;

  • объем работы 15 – 20 листов;

  • титульный лист контрольной работы оформляется по образцу (см. приложение).

5. Выполненная контрольная работа не должна дословно излагать материал учебника или копировать письменные работы других студентов.

В этом случае контрольная работа расценивается как неудовлетворительно.

    1. Требование к оформлению отдельных элементов

контрольной работы

      1. Титульный лист.

Первой страницей контрольной работы считается титульный лист. Номер страницы на титульном листе не проставляется. Пример оформления титульного листа приведен в приложении.

      1. Содержание.

Содержание размещается после титульного листа контрольной работы (на которой проставляется страница 2). Слово «Содержание» располагается посередине страницы с прописной буквы.

      1. Деление текста контрольной работы.

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

Если контрольные задания в контрольной работе имеют подразделы, то нумерация подразделов должна быть в пределах раздела. Номер подраздела состоит из номера раздела и подраздела, разделенных точкой. Разделы, как и подразделы, могут состоять из одного или нескольких пунктов. В конце номера подраздела точка не ставиться.

Пример:

1 Теоретические основы налогообложения

1.1 Сущность налогов

1.2 Функции налогов

2 Анализ налоговой системы России

2.1 Структура налоговой системы Российской Федерации

2.2 Налоговое администрирование в России

      1. Таблицы

Таблицы применяются для лучшей наглядности и удобства сравнения показателей. Таблица должна иметь название. Название таблицы необходимо помещать над таблицей по центру. Таблица должна иметь также единицу измерения физических показателей и источник данных.

Таблицу помещают под текстом, в котором она впервые упоминается, на этой или на следующей странице.

Таблицы, следует нумеровать арабскими цифрами сквозной нумерацией.

      1. Список использованной литературы.

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

  • Конституция;

  • Законы;

  • Указы Президента РФ;

  • Постановления Правительства РФ;

  • Ведомственные правовые акты;

  • Источники статистических данных;

  • Книги на русском языке;

  • Статьи на русском языке;

  • Книги на иностранном языке;

  • Статьи на иностранном языке.

      1. Приложения.

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

  1. СПИСОК ЛИТЕРАТУРЫ

Нормативно-правовые акты

  1. Бюджетный Кодекс РФ от 31.07.1998 № 145-ФЗ (ред. от 19.07.2009).

  2. Закон РФ от 09.12.1991 N 2003-1 (ред. от 05.04.2009) «О налогах на имущество физических лиц».

  3. «Налоговый кодекс РФ (часть первая)» от 31.07.1998 № 146-ФЗ (принят ГД ФС РФ 16.07.1998) (ред. от 28.12.2010).

  4. «Налоговый кодекс Российской Федерации (часть вторая)» от 05.08.2000 N 117-ФЗ (принят ГД ФС РФ 19.07.2000) (ред. от 29.11.2010).

  5. Приказ ФНС РФ от 21.11.2006 N САЭ-3-19/798 (ред. от 05.02.2009) «Об утверждении Порядка организации работы по предоставлению отсрочки, рассрочки, инвестиционного налогового кредита по уплате налогов и сборов».

заголовков HTML


Заголовки HTML — это заголовки или субтитры, которые вы хотите отображать на веб-странице.



Заголовки HTML

Заголовки

HTML определяются с помощью тегов

.

определяет наиболее важный заголовок.
определяет наименее важный заголовок.

Пример

Заголовок 1


Заголовок 2


Заголовок 3


Заголовок 4

Заголовок 5

Заголовок 6

Попробуй сам »

Примечание. Браузеры автоматически добавляют пробелы (поля) до и после заголовка.


Заголовки важны

Поисковые системы используют заголовки для индексации структуры и содержания ваших веб-страниц.

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

заголовки должны использоваться для основных заголовков, за которыми следуют заголовки

, а затем менее важные

и т. Д.

Примечание: Используйте заголовки HTML только для заголовков.Не используйте заголовки для создания текста BIG или жирный .


Большие заголовки

Каждый заголовок HTML имеет размер по умолчанию. Однако вы можете указать размер для любого заголовка. с атрибутом стиля , используя свойство размера шрифта CSS :



Упражнения HTML


Ссылка на тег HTML

Справочник тегов

W3Schools содержит дополнительную информацию об этих тегах и их атрибутах.

Тег Описание
Определяет корень HTML-документа
Определяет тело документа

до

Определяет заголовки HTML


.

Учебное пособие по модульному тестированию iOS и пользовательскому интерфейсу

Примечания к обновлению : Майкл Кац обновил это руководство для Xcode 10.1, Swift 4.2 и iOS 12. Одри Тэм написала оригинал.

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

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

Из этого туториала Вы узнаете:

  • Как использовать тестовый навигатор Xcode для тестирования модели приложения и асинхронных методов
  • Как имитировать взаимодействия с библиотекой или системными объектами с помощью заглушек и имитаторов
  • Как проверить пользовательский интерфейс и производительность
  • Как использовать инструмент покрытия кода

Попутно вы освоите словарный запас, используемый при тестировании ниндзя.

Выяснение, что тестировать

Прежде чем писать какие-либо тесты, важно знать основы. Что нужно протестировать?

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

Как правило, тесты должны охватывать:

  • Основные функции: классы и методы модели и их взаимодействие с контроллером
  • Наиболее распространенные рабочие процессы пользовательского интерфейса
  • Граничные условия
  • Исправления ошибок

Лучшие практики тестирования

Аббревиатура FIRST описывает краткий набор критериев для эффективных модульных тестов.Эти критерии:

  • Fast : Тесты должны выполняться быстро.
  • Независимый / изолированный : Тесты не должны разделять состояние друг с другом.
  • Повторяемый : Вы должны получать одни и те же результаты каждый раз при запуске теста. Внешние поставщики данных или проблемы с параллелизмом могут вызывать периодические сбои.
  • Самостоятельная проверка : Тесты должны быть полностью автоматизированы. Вывод должен быть либо «прошел», либо «не прошел», а не полагаться на интерпретацию файла журнала программистом.
  • Своевременное : В идеале тесты следует писать до того, как вы напишете производственный код, который они тестируют (разработка через тестирование).

Следование принципам FIRST сделает ваши тесты понятными и полезными, вместо того, чтобы превращаться в препятствия для вашего приложения.

Начало работы

Начните с загрузки материалов проекта с помощью кнопки Загрузить материалы вверху или внизу этого руководства. Есть два отдельных стартовых проекта: BullsEye и HalfTunes.

  • BullsEye основан на примере приложения из iOS Apprentice . Логика игры находится в классе BullsEyeGame , который вы протестируете во время этого урока.
  • HalfTunes - это обновленная версия примера приложения из руководства по URLSession. Пользователи могут запрашивать песни в iTunes API, а затем загружать и воспроизводить фрагменты песен.

Модульное тестирование в Xcode

Навигатор тестов обеспечивает самый простой способ работы с тестами; вы будете использовать его для создания тестовых целей и запуска тестов для вашего приложения.

Создание цели модульного теста

Откройте проект BullsEye и нажмите Command-6 , чтобы открыть навигатор тестов.

Нажмите кнопку + в нижнем левом углу, затем выберите New Unit Test Target… из меню:

Примите имя по умолчанию, BullsEyeTests . Когда тестовый комплект появится в навигаторе тестов, щелкните, чтобы открыть комплект в редакторе. Если пакет не появляется автоматически, устраните неполадки, щелкнув один из других навигаторов, а затем вернитесь в навигатор тестирования.

Шаблон по умолчанию импортирует среду тестирования, XCTest , и определяет подкласс BullsEyeTests из XCTestCase с setUp () , tearDown () и примеры методов тестирования.

Есть три способа запустить тесты:

  1. Продукт ▸ Тест или Command-U . Оба они запускают всех тестовых классов.
  2. Щелкните кнопку со стрелкой в ​​навигаторе тестов.
  3. Щелкните ромбовидную кнопку в желобе.

Вы также можете запустить отдельный метод тестирования, щелкнув его ромбик либо в навигаторе тестов, либо в желобе.

Попробуйте разные способы запуска тестов, чтобы понять, сколько времени это занимает и как это выглядит. Образцы тестов пока ничего не делают, поэтому работают очень быстро!

Когда все тесты пройдут успешно, ромбы станут зелеными и покажут галочки. Вы можете щелкнуть серый ромб в конце testPerformanceExample () , чтобы открыть Результат производительности:

Для этого руководства вам не нужны testPerformanceExample () или testExample () , поэтому удалите их.

Использование XCTAssert для тестирования моделей

Во-первых, вы воспользуетесь функциями XCTAssert , чтобы проверить основную функцию модели BullsEye: правильно ли объект BullsEyeGame подсчитывает счет за раунд?

В BullsEyeTests.swift добавьте эту строку сразу под оператором import :

@testable import BullsEye
 

Это дает модульным тестам доступ к внутренним типам и функциям в BullsEye.

В верхней части класса BullsEyeTests добавьте это свойство:

вар сут: BullsEyeGame!
 

Это создает заполнитель для BullsEyeGame , который является тестируемой системой (SUT) или объектом, с которым этот класс тестового примера связан с тестированием.

Затем замените содержимое setup () на это:

super.setUp ()
sut = BullsEyeGame ()
sut.startNewGame ()
 

Это создает объект BullsEyeGame на уровне класса, поэтому все тесты в этом тестовом классе могут получить доступ к свойствам и методам объекта SUT.

Здесь вы также вызываете игру startNewGame () , которая инициализирует targetValue . Во многих тестах используется значение targetValue , чтобы проверить правильность подсчета очков в игре.

Прежде чем вы забудете, выпустите вашего объекта SUT в tearDown () . Заменить его содержимое на:

сут = ноль
super.tearDown ()
 
Примечание : Хорошая практика - создать SUT в setUp () и выпустить его в tearDown () , чтобы гарантировать, что каждый тест начинается с чистого листа.Дополнительную информацию можно найти в публикации Джона Рида по этой теме.

Написание вашего первого теста

Теперь вы готовы написать свой первый тест!

Добавьте следующий код в конец BullsEyeTests :

func testScoreIsComputed () {
  // 1. данный
  пусть угадают = sut.targetValue + 5

  // 2. когда
  сут.проверка (угадать: угадать)

  // 3. тогда
  XCTAssertEqual (sut.scoreRound, 95, «Оценка, вычисленная на основе предположения, неверна»)
}
 

Название метода тестирования всегда начинается с test , за которым следует описание того, что он проверяет.

Хорошей практикой является форматирование теста в с учетом , , когда и , затем разделов:

  1. Учитывая : Здесь вы устанавливаете любые необходимые значения. В этом примере вы создаете значение guess , чтобы указать, насколько оно отличается от targetValue .
  2. Когда : В этом разделе вы выполните тестируемый код: вызовите check (угадайте :) .
  3. Затем : это раздел, в котором вы подтверждаете ожидаемый результат с сообщением, которое печатается, если тест не проходит .В этом случае sut.scoreRound должно равняться 95 (100 - 5).

Запустите тест, щелкнув значок ромба в желобе или в навигаторе тестов. Это создаст и запустит приложение, а значок ромба изменится на зеленую галочку!

Отладка теста

В BullsEyeGame специально встроена ошибка, и сейчас вы попрактикуетесь в ее обнаружении. Чтобы увидеть ошибку в действии, вы создадите тест, в котором вычитает 5 из targetValue в заданном разделе и оставляет все остальное без изменений.

Добавьте следующий тест:

func testScoreIsComputedWhenGuessLTTarget () {
  // 1. данный
  пусть угадывают = sut.targetValue - 5

  // 2. когда
  сут.проверка (угадать: угадать)

  // 3. тогда
  XCTAssertEqual (sut.scoreRound, 95, «Оценка, вычисленная на основе предположения, неверна»)
}
 

Разница между guess и targetValue по-прежнему равна 5, поэтому результат должен быть 95.

В навигаторе точек останова добавьте Test Failure Breakpoint .Это остановит тестовый прогон, когда тестовый метод отправит утверждение об ошибке.

Запустите тест, и он должен остановиться на строке XCTAssertEqual с ошибкой теста.

Проверить сут и угадать в консоли отладки:

предположить, что - это targetValue - 5 , но очков. раунд - это 105, а не 95!

Для дальнейшего исследования используйте обычный процесс отладки: установите точку останова на , когда оператор , а также один на BullsEyeGame.swift , внутри проверьте (угадайте :) , где он создает разницу . Затем запустите тест еще раз и перейдите к инструкции let difference , чтобы проверить значение разница в приложении:

Проблема в том, что разница в отрицательна, поэтому результат 100 - (-5) . Чтобы исправить это, вы должны использовать абсолютное значение из разницы . В проверьте (угадайте :) , раскомментируйте правильную строку и удалите неправильную.

Удалите две точки останова и снова запустите тест, чтобы убедиться, что он успешно завершен.

Использование XCTestExpectation для тестирования асинхронных операций

Теперь, когда вы узнали, как тестировать модели и устранять ошибки тестирования, пора перейти к тестированию асинхронного кода.

Откройте проект HalfTunes . Он использует URLSession для запроса API iTunes и загрузки образцов песен. Предположим, вы хотите изменить его, чтобы использовать AlamoFire для сетевых операций.Чтобы увидеть, не сломается ли что-нибудь, вы должны написать тесты для сетевых операций и запускать их до и после изменения кода.

URLSession методы асинхронны : они возвращаются сразу же, но не завершают работу позже. Чтобы протестировать асинхронные методы, вы используете XCTestExpectation , чтобы ваш тест ожидал завершения асинхронной операции.

Асинхронные тесты обычно медленные, поэтому вы должны держать их отдельно от более быстрых модульных тестов.

Создайте новую цель модульного теста с именем HalfTunesSlowTests . Откройте класс HalfTunesSlowTests и импортируйте модуль приложения HalfTunes чуть ниже существующего оператора import :

@testable import HalfTunes
 

Все тесты в этом классе используют URLSession по умолчанию для отправки запросов на серверы Apple, поэтому объявите объект sut , создайте его в setUp () и отпустите в tearDown () .

Заменить содержимое класса HalfTunesSlowTests на:

var sut: URLSession!

override func setUp () {
  super.setUp ()
  sut = URLSession (конфигурация: по умолчанию)
}

override func tearDown () {
  сут = ноль
  super.tearDown ()
}
 

Затем добавьте этот асинхронный тест:

// Асинхронный тест: быстрый успех, медленный отказ
func testValidCallToiTunesGetsHTTPStatusCode200 () {
  // данный
  пусть url =
    URL (строка: "https: // itunes.apple.com/search?media=music&entity=song&term=abba ")
  // 1
  let обещание = ожидание (описание: «Код состояния: 200»)

  // когда
  let dataTask = sut.dataTask (with: url!) {данные, ответ, ошибка в
    // тогда
    if let error = error {
      XCTFail ("Ошибка: \ (error.localizedDescription)")
      возвращение
    } иначе, если разрешить statusCode = (ответ как? HTTPURLResponse) ?. statusCode {
      if statusCode == 200 {
        // 2
        обещание.выполнить ()
      } else {
        XCTFail ("Код состояния: \ (statusCode)")
      }
    }
  }
  dataTask.resume ()
  // 3
  ждать (для: [обещание], тайм-аут: 5)
}
 

Этот тест проверяет, что отправка действительного запроса в iTunes возвращает код состояния 200. Большая часть кода совпадает с тем, что вы пишете в приложении, с этими дополнительными строками:

  1. ожидание (описание 🙂 : возвращает объект XCTestExpectation , хранящийся в обещании .Описание Параметр описывает то, что вы ожидаете.
  2. promise.fulfill () : вызовите это в закрытии условия успеха обработчика завершения асинхронного метода, чтобы отметить, что ожидание было выполнено.
  3. wait (for: timeout 🙂 : Продолжает выполнение теста до тех пор, пока не будут выполнены все ожидания или пока не закончится интервал timeout , в зависимости от того, что произойдет раньше.

Запустить тест. Если вы подключены к Интернету, проверка должна занять около секунды после загрузки приложения в симуляторе.

Быстрый отказ

Неудача — это больно, но это не должно длиться вечно.

В случае сбоя просто удалите букву «s» из «itunes» в URL-адресе:

пусть url =
  URL (строка: "https://itune.apple.com/search?media=music&entity=song&term=abba")
 

Запустите тест. Это не удается, но требуется полный интервал ожидания! Это связано с тем, что вы предполагали, что запрос всегда будет успешным, и именно здесь вы вызвали Promise.fulfill () .Поскольку запрос не удался, он завершился только по истечении тайм-аута.

Вы можете улучшить это и ускорить выполнение теста, изменив предположение: вместо ожидания успешного выполнения запроса дождитесь только вызова обработчика завершения асинхронного метода. Это происходит, как только приложение получает ответ — ОК или ошибку — от сервера, который оправдывает ожидания. Затем ваш тест может проверить, был ли запрос успешным.

Чтобы увидеть, как это работает, создайте новый тест.

Но сначала исправьте предыдущий тест, отменив изменение, которое вы внесли в адрес .
Затем добавьте в свой класс следующий тест:

func testCallToiTunesCompletes () {
  // данный
  пусть url =
    URL (строка: "https://itune.apple.com/search?media=music&entity=song&term=abba")
  let обещание = ожидание (описание: «Вызван обработчик завершения»)
  var statusCode: Int?
  var responseError: Ошибка?

  // когда
  пусть dataTask = сут.dataTask (with: url!) {данные, ответ, ошибка в
    statusCode = (ответ как? HTTPURLResponse) ?. statusCode
    responseError = ошибка
    обещание.fulfill ()
  }
  dataTask.resume ()
  ждать (для: [обещание], тайм-аут: 5)

  // тогда
  XCTAssertNil (responseError)
  XCTAssertEqual (statusCode, 200)
}
 

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

Запустите тест. Теперь это должно занять около секунды. Он терпит неудачу, потому что запрос не удался, а не потому, что тестовый прогон превысил таймаут .

Исправьте URL-адрес , а затем снова запустите тест, чтобы убедиться, что он успешно завершен.

Подделка объектов и взаимодействий

Асинхронные тесты дают вам уверенность в том, что ваш код генерирует правильный ввод для асинхронного API. Вы также можете проверить, правильно ли работает ваш код, когда он получает ввод от URLSession , или что он правильно обновляет базу данных по умолчанию пользователя или контейнер iCloud.

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

Используйте подделку, если ваш код имеет зависимость от системного или библиотечного объекта. Вы можете сделать это, создав фальшивый объект для этой роли и внедрив фейка в свой код. Внедрение зависимостей от Джона Рида описывает несколько способов сделать это.

Поддельный ввод от заглушки

В этом тесте вы убедитесь, что приложение updateSearchResults (_ :) правильно анализирует данные, загруженные сеансом, проверив правильность searchResults.count . SUT — это контроллер представления, и вы можете имитировать сеанс с помощью заглушек и некоторых предварительно загруженных данных.

Перейдите в навигатор тестов и добавьте новую цель Unit Test .Назовите его HalfTunesFakeTests . Откройте HalfTunesFakeTests.swift и импортируйте модуль приложения HalfTunes сразу под оператором import :

@testable import HalfTunes
 

Теперь замените содержимое класса HalfTunesFakeTests на это:

var sut: SearchViewController!

override func setUp () {
  super.setUp ()
  sut = UIStoryboard (name: "Main", bundle: nil)
    .instantiateInitialViewController () как? SearchViewController
}

override func tearDown () {
  сут = ноль
  супер.срывать()
}
 

Это объявляет SUT, который является SearchViewController , создает его в setUp () и освобождает в tearDown () :

Примечание : SUT является контроллером представления, потому что у HalfTunes большая проблема контроллера представления — вся работа выполняется в SearchViewController.swift . Перемещение сетевого кода в отдельный модуль уменьшит эту проблему, а также упростит тестирование.

Затем вам понадобятся образцы данных JSON, которые ваш поддельный сеанс предоставит вашему тесту.Подойдет всего несколько элементов, поэтому для ограничения результатов загрузки в iTunes добавьте & limit = 3 к строке URL:

https://itunes.apple.com/search?media=music&entity=song&term=abba&limit=3
 

Скопируйте этот URL-адрес и вставьте его в браузер. Будет загружен файл с именем 1.txt , 1.txt.js или аналогичный. Просмотрите его, чтобы убедиться, что это файл JSON, затем переименуйте его в abbaData.json .

Теперь вернитесь к Xcode и перейдите в навигатор проекта.Добавьте файл в группу HalfTunesFakeTests .

Проект HalfTunes содержит вспомогательный файл DHURLSessionMock.swift . Это определяет простой протокол с именем DHURLSession с методами (заглушками) для создания задачи обработки данных с использованием либо URL , либо URLRequest . Он также определяет URLSessionMock , который соответствует этому протоколу с инициализаторами, которые позволяют создавать фиктивный объект URLSession с вашим выбором данных, ответа и ошибки.

Чтобы настроить подделку, перейдите к HalfTunesFakeTests.swift и добавьте следующее в setUp () после оператора, который создает SUT:

let testBundle = Bundle (для: type (of: self))
let path = testBundle.path (forResource: "abbaData", ofType: "json")
пусть данные = попробовать? Данные (contentsOf: URL (fileURLWithPath: path!), Параметры: .alwaysMapped)

пусть url =
  URL (строка: "https://itunes.apple.com/search?media=music&entity=song&term=abba")
пусть urlResponse = HTTPURLResponse (
  url: url !,
  statusCode: 200,
  httpVersion: nil,
  headerFields: ноль)

let sessionMock = URLSessionMock (данные: данные, ответ: urlResponse, ошибка: ноль)
сут.defaultSession = sessionMock
 

Это устанавливает поддельные данные и ответ и создает поддельный объект сеанса. Наконец, в конце он вводит поддельный сеанс в приложение как свойство sut .

Теперь вы готовы написать тест, который проверяет, анализирует ли вызов updateSearchResults (_ :) поддельные данные. Добавьте следующий тест:

func test_UpdateSearchResults_ParsesData () {
  // данный
  let обещание = ожидание (описание: «Код состояния: 200»)

  // когда
  XCTAssertEqual (
    сут.searchResults.count,
    0,
    "searchResults должен быть пустым перед запуском задачи данных")
  пусть url =
    URL (строка: "https://itunes.apple.com/search?media=music&entity=song&term=abba")
  let dataTask = sut.defaultSession.dataTask (with: url!) {
    данные, ответ, ошибка в
    // если HTTP-запрос прошел успешно, вызываем updateSearchResults (_ :)
    // который анализирует данные ответа на треки
    if let error = error {
      печать (error.localizedDescription)
    } иначе, если httpResponse = response as? HTTPURLResponse,
      httpResponse.statusCode == 200 {
      self.sut.updateSearchResults (данные)
    }
    обещание.fulfill ()
  }
  dataTask.resume ()
  ждать (для: [обещание], тайм-аут: 5)

  // тогда
  XCTAssertEqual (sut.searchResults.count, 3, «Не удалось проанализировать 3 элемента из поддельного ответа»)
}
 

Вам все равно придется писать это как асинхронный тест, потому что заглушка выдает себя за асинхронный метод.

при утверждении состоит в том, что searchResults пуст перед запуском задачи данных.Это должно быть правдой, потому что вы создали полностью новую SUT в setUp () .

Поддельные данные содержат JSON для трех объектов Track , поэтому утверждение затем состоит в том, что массив searchResults контроллера представления содержит три элемента.

Запустите тест. Это должно произойти довольно быстро, потому что нет реального сетевого подключения!

Поддельное обновление для Mock Object

В предыдущем тесте использовалась заглушка для ввода данных от поддельного объекта.Затем вы воспользуетесь имитацией объекта , чтобы проверить, правильно ли ваш код обновляет UserDefaults .

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

Следующий тест проверит, правильно ли приложение сохраняет свойство gameStyle .

В навигаторе тестов щелкните New Unit Test Class и назовите его BullsEyeMockTests . Добавьте следующее под оператором import :

@testable import BullsEye

class MockUserDefaults: UserDefaults {
  var gameStyleChanged = 0
  override func set (_ значение: Int, forKey defaultName: String) {
    if defaultName == "gameStyle" {
      gameStyleChanged + = 1
    }
  }
}
 

MockUserDefaults переопределяет набор (_: forKey :) для увеличения флага gameStyleChanged .Часто вы увидите похожие тесты, которые устанавливают переменную Bool , но увеличение Int дает вам больше гибкости — например, ваш тест может проверить, что метод вызывается только один раз.

Объявите SUT и фиктивный объект в BullsEyeMockTests :

var sut: ViewController!
var mockUserDefaults: MockUserDefaults!
 

Затем замените стандартные setUp () и tearDown () на это:

override func setUp () {
  супер.настроить()

  sut = UIStoryboard (name: "Main", bundle: nil)
    .instantiateInitialViewController () как? ViewController
  mockUserDefaults = MockUserDefaults (имя набора: "тестирование")
  sut.defaults = mockUserDefaults
}

override func tearDown () {
  сут = ноль
  mockUserDefaults = nil
  super.tearDown ()
}
 

Это создает тестируемую систему и фиктивный объект, а также внедряет фиктивный объект как свойство ТРИ.

Теперь замените в шаблоне два метода тестирования по умолчанию на следующие:

func testGameStyleCanBeChanged () {
  // данный
  пусть segmentedControl = UISegmentedControl ()

  // когда
  XCTAssertEqual (
    mockUserDefaults.gameStyleChanged,
    0,
    "gameStyleChanged должно быть 0 перед sendActions")
  segmentedControl.addTarget (сут,
    действие: #selector (ViewController.chooseGameStyle (_ :)), для: .valueChanged)
  segmentedControl.sendActions (для: .valueChanged)

  // тогда
  XCTAssertEqual (
    mockUserDefaults.gameStyleChanged,
    1,
    "Пользовательский стиль игры по умолчанию не был изменен")
}
 

Утверждение при состоит в том, что флаг gameStyleChanged равен 0 до того, как метод тестирования изменит сегментированный элемент управления.Итак, если утверждение , то также верно, это означает, что набор (_: forKey :) был вызван ровно один раз.

Запустить тест; это должно получиться.

Тестирование пользовательского интерфейса в Xcode

UI testing позволяет тестировать взаимодействие с пользовательским интерфейсом. Тестирование пользовательского интерфейса работает путем поиска объектов пользовательского интерфейса приложения с помощью запросов, синтеза событий и последующей отправки событий этим объектам. API позволяет вам исследовать свойства и состояние объекта пользовательского интерфейса, чтобы сравнить их с ожидаемым состоянием.

В навигаторе тестов проекта BullsEye добавьте новую UI Test Target . Убедитесь, что целью для тестирования является BullsEye , а затем примите имя по умолчанию BullsEyeUITests .

Откройте BullsEyeUITests.swift и добавьте это свойство в начало класса BullsEyeUITests :

var app: XCUIApplication!
 

В setUp () замените оператор XCUIApplication ().launch () со следующим:

app = XCUIApplication ()
app.launch ()
 

Измените имя testExample () на testGameStyleSwitch () .

Откройте новую строку в testGameStyleSwitch () и нажмите красную кнопку Record в нижней части окна редактора:

Это открывает приложение в симуляторе в режиме, который записывает ваши взаимодействия как тестовые команды. После загрузки приложения коснитесь сегмента Slide переключателя стиля игры и верхней метки.Затем нажмите кнопку Xcode Record, чтобы остановить запись.

Теперь у вас есть следующие три строки в testGameStyleSwitch () :

let app = XCUIApplication ()
app.buttons ["Слайд"]. Tap ()
app.staticTexts ["Подойдите как можно ближе к:"] .tap ()
 

Регистратор создал код для проверки тех же действий, которые вы тестировали в приложении. Пошлите тап по слайдеру и метке. Вы будете использовать их как основу для создания собственного теста пользовательского интерфейса.
Если вы видите другие утверждения, просто удалите их.

Первая строка дублирует свойство, которое вы создали в setUp () , поэтому удалите эту строку. Пока вам не нужно ничего нажимать, поэтому также удалите .tap () в конце строк 2 и 3. Теперь откройте небольшое меню рядом с ["Slide"] и выберите segmentedControls.buttons [ «Слайд»] .

У вас должно быть следующее:

app.segmentedControls.buttons ["Слайд"]
app.staticTexts ["Подойдите как можно ближе к:"]
 

Коснитесь любых других объектов, чтобы регистратор помог вам найти код, к которому вы можете получить доступ в ваших тестах.Теперь замените эти строки этим кодом, чтобы создать раздел с учетом :

// данный
let slideButton = app.segmentedControls.buttons ["Слайд"]
let typeButton = app.segmentedControls.buttons ["Тип"]
let slideLabel = app.staticTexts ["Подойдите как можно ближе к:"]
let typeLabel = app.staticTexts ["Угадайте, где находится ползунок:"]
 

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

// тогда
если slideButton.isSelected {
  XCTAssertTrue (slideLabel.exists)
  XCTAssertFalse (typeLabel.exists)

  typeButton.tap ()
  XCTAssertTrue (typeLabel.exists)
  XCTAssertFalse (slideLabel.exists)
} else if typeButton.isSelected {
  XCTAssertTrue (typeLabel.exists)
  XCTAssertFalse (slideLabel.exists)

  slideButton.tap ()
  XCTAssertTrue (slideLabel.exists)
  XCTAssertFalse (typeLabel.exists)
}
 

Это проверяет, существует ли правильная метка, когда вы нажимаете () на каждой кнопке в сегментированном элементе управления.Запустите тест — все утверждения должны быть успешными.

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

Из документации Apple: Тест производительности берет блок кода, который вы хотите оценить, и запускает его десять раз, собирая среднее время выполнения и стандартное отклонение для запусков. Усреднение этих отдельных измерений формирует значение для тестового прогона, которое затем можно сравнить с базовым уровнем для оценки успеха или неудачи.

Написать тест производительности очень просто: вы просто помещаете код, который хотите измерить, в замыкание measure () .

Чтобы увидеть это в действии, повторно откройте проект HalfTunes и в HalfTunesFakeTests.swift добавьте следующий тест:

func test_StartDownload_Performance () {
  let track = Track (
    название: "Ватерлоо",
    исполнитель: "ABBA",
    previewUrl:
      "http://a821.phobos.apple.com/us/r30/Music/d7/ba/ce/mzm.vsyjlsff.aac.p.m4a")

  measure {
    self.sut.startDownload (трек)
  }
}
 

Запустите тест, затем щелкните значок, который появляется рядом с началом измерения (), завершающее замыкание , чтобы просмотреть статистику.

Щелкните Set Baseline , чтобы установить контрольное время. Затем снова запустите тест производительности и просмотрите результат — он может быть лучше или хуже базового. Кнопка Edit позволяет сбросить базовую линию до этого нового результата.

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

Каждый раз, когда вы вносите изменения в приложение, которые могут повлиять на производительность тестируемого метода, запустите тест производительности еще раз, чтобы увидеть, как он сравнивается с базовым уровнем.

Охват кода

Инструмент покрытия кода сообщает вам, какой код приложения на самом деле выполняется вашими тестами, чтобы вы знали, какие части кода приложения (еще) не протестированы.

Чтобы включить покрытие кода, отредактируйте действие схемы Test и установите флажок Gather cover for на вкладке Options :

Запустите все тестов ( Command-U ), затем откройте навигатор отчетов ( Command-9 ).Выберите Покрытие под верхним элементом этого списка:

Щелкните треугольник раскрытия, чтобы просмотреть список функций и закрытий в SearchViewController.swift :

Прокрутите вниз до updateSearchResults (_ :) , чтобы увидеть, что покрытие составляет 87,9%.

Щелкните кнопку со стрелкой для этой функции, чтобы открыть исходный файл функции. При наведении указателя мыши на аннотации покрытия на правой боковой панели участки кода выделяются зеленым или красным цветом:

Аннотации покрытия показывают, сколько раз тест попадает в каждый раздел кода; разделы, которые не вызывались, выделяются красным цветом.Как и следовало ожидать, цикл for был выполнен 3 раза, но в путях ошибок ничего не было выполнено.

Чтобы увеличить охват этой функции, вы можете продублировать abbaData.json , а затем отредактировать его, чтобы он приводил к другим ошибкам. Например, измените "результаты" на "результат" для теста, который достигает print ("Ключ результатов не найден в словаре") .

100% покрытие?

Насколько сильно вы должны стремиться к 100% покрытию кода? Погуглите «100% охват модульным тестированием», и вы найдете ряд аргументов за и против этого, а также споры по поводу самого определения «100% покрытия».Аргументы против этого говорят, что последние 10-15% не стоят затраченных усилий. Аргументы в пользу этого говорят, что последние 10-15% являются наиболее важными, , потому что так сложно протестировать. Google «трудно тестировать плохой дизайн», чтобы найти убедительные аргументы в пользу того, что непроверяемый код является признаком более глубоких проблем дизайна.

Куда идти дальше?

Теперь у вас есть отличные инструменты, которые можно использовать при написании тестов для ваших проектов. Я надеюсь, что это руководство по модульному тестированию iOS и тестированию пользовательского интерфейса вселило в вас уверенность в том, что вы сможете протестировать и !

Вы можете загрузить законченную версию проекта, используя кнопку Загрузить материалы вверху или внизу этого руководства.Продолжайте развивать свои навыки, добавляя собственные дополнительные тесты.

Вот некоторые ресурсы для дальнейшего изучения:

raywenderlich.com Еженедельно

Информационный бюллетень raywenderlich.com — это самый простой способ оставаться в курсе всего, что вам нужно знать как разработчику мобильных приложений.

Получайте еженедельный дайджест наших руководств и курсов, а в качестве бонуса получите бесплатный углубленный курс по электронной почте!

.
Leave a Reply

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *