12

Итак, этот вопрос все начался, когда я начал выполнять модульное тестирование для простой 2 строки postNotification и addObserver. Из этого аналогичного вопроса here вы можете увидеть, что для его проверки вам нужно добавить ~ 20 строк & часть от общего способа написания кода.Как написать тестируемый код в Swift

Перед тем как справиться с этой проблемой, я впервые понял разницу между Unit Testing и TDD. Тестирование модулей легко, если ваш код можно проверить, т. Е. Если вы следите за мышлением TDD. Затем меня привели к тому, как я могу написать тестовый код, который я не нашел много рекомендаций, и каждый учебник просто перескакивает на единичный тест. Apple принадлежит documentation.

Моя первоначальная мысль заключалась в том, что мне нужно стремиться к «функциональному программированию» и писать свои функции в способе pure function. Но опять же это очень трудоемко и может потребовать много рефакторинга в существующих кодах или даже для новых проектов много добавленных линий, и я даже не уверен, что that is the correct approach. Существуют ли какие-либо предлагаемые рекомендации или стандарты для написания тестового кода в простой форме?

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

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

Что я не знаю, так как я могу сгладить процесс более простым способом.

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

ответ

13

Это довольно большой вопрос и тот, где взгляды разработчиков влияют на самые разные направления. Также важно отметить, что сделать код, который можно тестировать, во многих существенных аспектах не является особым вопросом Swift: многое из того, что позволяет вам писать тестируемый код регулярно и удобно, фактически полагается на вас, следуя некоторым фундаментальным, общеприменимым принципам. Часто методы тестирования, основанные на проверке, помогают вам косвенно, подтверждая, что вы следовали практике, которая делает выполнение вашего кода через тесты правдоподобными, помимо того, что вы получаете дополнительную производительность и надежность для программистов. Поэтому, к сожалению, написание тестового кода - это не вопрос изучения некоторых механических приемов работы с Xcode, а не часто доказательство того, что вы разработали и спланировали программы и библиотеки, которые вы пишете, придерживаясь некоторых хороших практик.

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

  1. Выполнение вашего проверяемого кода часто является побочным эффектом следующих принципов проектирования, ориентированных на звуковые объекты.

    • Возможно, вы прочитали около the SOLID principles.
    • Посмотрите также на this Swift based demonstration каждого из пяти принципов SOLID.
    • Google's Code Reviewer's Guide (PDF) также является отличным ресурсом для изучения типичных проблем OOD и того, как их избежать (также не случайно, этот документ, связанный с OOD, называется подзаголовком «Написание тестового кода»).
  2. После проектирования, ориентированного на звуковые объекты, часто сам по себе является побочным эффектом архитектурных решений высокого уровня. В основном, подумайте рано и часто о типах типов, которые вы планируете ввести на графике объекта программы. Каковы роли и зависимости между ними? Являются ли какие-либо из зависимостей в вашем объектном графе трудными для соответствия или правильной конструкции при выполнении кода из разных контекстов (например, из кода пользовательского интерфейса и модульного теста)?

    • Существует много литературы по информатике об архитектурных узорах. The Gang of Four остается ценной книгой, посвященной этой теме (хотя не все это относится к вашей типичной программе Swift).
    • Посмотрите на эту демонстрацию Swift design patterns, чтобы просмотреть, сколько общих шаблонов проектирования может быть реализовано в Swift.
    • Особенно, если ваш код предназначен для мобильного приложения, вы должны read about VIPER, ориентированный на мобильные приложения архитектурный шаблон, возникший из типичных архитектурных потребностей приложений iOS.
    • Чтобы связать шаблоны проектирования с принципами SOLID, перечисленными выше, принцип «единой ответственности» - это, пожалуй, один из принципов, наиболее ярко нарушающийся во многих крупных программах какао, что является результатом плохих архитектурных практик, что также приводит к очень сложному тестированию кода , Люди на самом деле часто за шутку ссылаются на MVC, применяемые на практике в Cocoa как "Massive View Controller".

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

  • Use value types when you can: Swift хорошо подходит для написания программ, которые сводят к минимуму автоматический подсчет ссылок ссылки (указатели). Это связано с преимуществами производительности, но также повышает ваши шансы написать надежный код, который сводит к минимуму неожиданные зависимости и расписания данных, которые трудно уловить при тестировании.
  • Keep things immutable when you can: соглашения о синтаксисе и система типов в Swift помогают избежать изменчивого состояния, которое, среди прочего, оказывает негативное влияние на тестируемость вашего кода (настройка графического объекта для тестирования может стать затруднительной, так же как и при использовании в реальном мире тестовое покрытие вашего кода, если пространство состояний в вашей программе велико).
  • Apple также предоставила некоторые рекомендации по the architectural matter of value types and immutability, которые также касаются проверяемости вашего кода.
  • Использовать протоколы, когда вы можете: понять, почему, читать на the Liskov substitution principle :-) Более серьезно, предпочитая протоколы по конкретным типам, вы можете, например, написать тестовый код, чтобы позволить вам выполнять зависимости в тестовом задании с конкретными типами тестов что подделка или фальсификация некоторых ресурсов, не имеющих отношения к вашим испытаниям.
  • Используйте методы функционального программирования (когда это имеет смысл): часто составляя функциональность с помощью функций, вы можете писать читаемый гибкий код, который позволяет избежать изменчивого состояния.Я рекомендую Functional Swift by Chris Eidhof and others как хорошее руководство по применению функциональных шаблонов в Swift.

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

+0

Мне нужно будет пройти через ссылки. Это займет некоторое время. Можете ли вы привести пример плохого кода для тестирования и другого теста на хороший код, а также указать, что нам нужно делать глупо? – Honey

+1

Я бы предложил прочитать мой ответ более подробно, чтобы понять, почему я не представляю вам плохой и хороший пример (я дам вам подсказку, вы упростите проблему) :-) Итак, я предлагаю вам сделать фоновое чтение - нет способа обмануть навык и опыт по этому вопросу. – mz2

+0

В вашей первой ссылке для solid отсутствует ')' в конце. Я прочитал ссылки и верю, что вы направляете меня на путь записи. Можете ли вы точно определить, что вам нужно сделать для адресной единицы тестирования PostNotification, AddObserver. Не ссылайтесь на какие-либо ссылки? Я уже включил ссылку в мой вопрос, обращаясь к моей проблеме. PS Я думаю, что ссылка на шаблон Swift Design заставила бы меня заняться довольно долгое время – Honey

Смежные вопросы