Как я реализую среду тестирования в проекте прежней версии

Используя эти Int32 тип требует ссылки пространства имен на System, или полное определение (System.Int32). Я склоняюсь к int, потому что это не требует импорта пространства имен, поэтому уменьшая шанс конфликта пространства имен в некоторых случаях. Когда скомпилировано в IL, нет никакого различия между двумя.

18
задан Félix Gagnon-Grenier 12 October 2015 в 06:49
поделиться

10 ответов

Добрый день,

Изменить: Я только что быстро просмотрел первую главу книги « Искусство модульного тестирования », которая также доступна в виде бесплатного PDF-файла на веб-сайте книги . Это даст вам хороший обзор того, что вы пытаетесь сделать с помощью модульного теста.

Я предполагаю, что вы собираетесь использовать фреймворк типов xUnit. Вот некоторые начальные мысли высокого уровня:

  1. Изменить: убедитесь, что все согласны с тем, что составляет хороший модульный тест. Я' Я предлагаю использовать приведенную выше обзорную главу в качестве хорошей отправной точки и, если необходимо, брать ее оттуда. Представьте себе, что люди с энтузиазмом бегут создавать множество модульных тестов, имея при этом другое понимание того, что такое «хороший» модульный тест. Было бы ужасно в будущем сообщить, что 25% ваших модульных тестов не являются полезными, повторяемыми, надежными и т. Д. И т. Д.
  2. добавляют тесты, чтобы охватить небольшие фрагменты кода за раз. То есть не создавайте единую монолитную задачу для добавления тестов для существующей базы кода.
  3. модифицируйте любые существующие процессы, чтобы гарантировать добавление новых тестов для любого нового написанного кода. Сделайте частью процесса проверки кода необходимость предоставления модульных тестов для новых функций.
  4. расширяют любые существующие процессы исправления ошибок, чтобы гарантировать создание новых тестов, показывающих наличие и подтверждающих отсутствие ошибки. NB Не забудьте откатить исправление кандидата, чтобы снова ввести ошибку, чтобы убедиться, что проблема была исправлена ​​только одним патчем, и что она не исправляется комбинацией факторов.
  5. Изменить: как вы начинаете наращивать количество ваших тестов, запускаете их как ночные регрессионные тесты, чтобы проверить, что ничего не было нарушено новыми функциями.
  6. выполните успешный запуск всех существующих тестов и критерия входа для процесс проверки кандидата исправления.
  7. Изменить: начать вести каталог типов тестов, то есть фрагментов кода тестов, чтобы облегчить создание новых тестов. Нет смысла постоянно изобретать велосипед. Модульные тесты, написанные для тестирования открытия файла в одной части базы кода, будут похожи на модульные тесты, написанные для тестового кода, который открывает другой файл в другой части базы кода. . Каталогизируйте их, чтобы их было легко найти.
  8. Изменить: , где вы изменяете только пару методов для существующего класса, создайте набор тестов для хранения полного набора тестов для класса. Затем добавьте в этот набор тестов только отдельные тесты для методов, которые вы изменяете. Здесь используется терминология xUnit, поскольку я предполагаю, что вы будете использовать фреймворк xUnit, такой как PHPUnit.
  9. используйте стандартное соглашение для именования ваших наборов тестов и тестов, например testSuite_classA, которое затем будет содержать отдельные тесты, такие как test__test_function. Например, test_fopen_bad_name и test_fopen_bad_perms и т. Д. Это помогает свести к минимуму шум при перемещении по базе кода и просмотре чужих тестов. Это также помогает людям, когда они начинают называть свои тесты, в первую очередь, освобождая свой разум для работы над более интересными вещами, такими как сами тесты.
  10. Изменить: Я бы не стал использовать TDD. на данном этапе. По определению, TDD потребует наличия всех тестов до того, как изменения вступят в силу, поэтому у вас будут неудачные тесты повсюду, когда вы добавляете новые testSuites для покрытия классов, над которыми вы работаете. Вместо этого добавьте новый testSuite, а затем добавьте отдельные тесты по мере необходимости, чтобы в результатах тестов не было большого шума из-за неудачных тестов. И, как указывает Ишай, добавление задачи изучения TDD в этот момент действительно замедлит вас. Сделайте изучение TDD задачей, которую нужно выполнять, когда у вас есть свободное время. Это не так уж и сложно.
  11. Как следствие этого, вам понадобится инструмент для отслеживания тех существующих классов, в которых существует testSuite, но где еще не написаны тесты для охвата других функций-членов в классе. Таким образом, вы можете отслеживать, где в вашем тестовом покрытии есть дыры. Я говорю здесь на высоком уровне, где вы можете создать список классов и конкретных функций-членов, для которых в настоящее время не существует тестов. Здесь вам очень поможет стандартное соглашение об именах для тестов и testSuites.

Я буду добавлять больше пунктов, когда думаю о них.

HTH

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

Я буду добавлять больше пунктов, когда думаю о них.

HTH

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

Я буду добавлять больше пунктов, когда думаю о них.

HTH

6
ответ дан 30 November 2019 в 08:48
поделиться

Для тестирования графического интерфейса вы можете взглянуть на Selenium (как уже указал Игнас R) ИЛИ вы можете также взглянуть на этот инструмент: STIQ .

Удачи!

0
ответ дан 30 November 2019 в 08:48
поделиться

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

Было бы лучше начать с простого контрольного списка (со ссылками, чтобы сделать это быстрее) тестов, которые следует проводить (вручную) на предмете перед каждой доставкой.

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

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

0
ответ дан 30 November 2019 в 08:48
поделиться

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

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

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

6
ответ дан 30 November 2019 в 08:48
поделиться

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

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

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

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

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

Учитывая все обстоятельства, я думаю, что я бы выбрал скромный спринт в духе подхода 1, за которым следует приверженность подходу 3.

Для общих принципов модульного тестирования я рекомендую книгу xUnit Test Patterns: Refactoring Test Code Джерарда Месароса.

3
ответ дан 30 November 2019 в 08:48
поделиться

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

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

  • Вероятно, это будет минимальный тестовый пример, чтобы продемонстрировать, что действительно существует проблема.
  • С уверенностью, что (в настоящее время не выполняется) тест подчеркивает сообщенную проблему, вы точно узнаете, устранили ли ее ваши изменения
  • Он навсегда останется регрессионным тестом, который предотвратит повторение той же проблемы в будущем.

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

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

  • Вероятно, это будет минимальный тестовый пример, чтобы продемонстрировать, что проблема действительно существует.
  • Если вы уверены, что (в настоящее время неуспешный) тест подчеркивает сообщенную проблему, вы знать наверняка, исправили ли ваши изменения
  • Это всегда будет регрессионным тестом, который предотвратит повторение той же проблемы в будущем.

Внедрение тестов в существующий проект является трудным и, вероятно, долгим процессом, но делать их одновременно с исправлением ошибок - настолько идеальное время для этого (параллельно с постепенным введением тестов в «нормальном» смысле), что было бы стыдно не воспользоваться этим шансом и не сделать лимонад из ваших отчетов об ошибках. : -)

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

  • Вероятно, это будет минимальный тестовый пример, чтобы продемонстрировать, что проблема действительно существует.
  • Если вы уверены, что (в настоящее время неуспешный) тест подчеркивает сообщенную проблему, вы знать наверняка, исправили ли ваши изменения
  • Это всегда будет регрессионным тестом, который предотвратит повторение той же проблемы в будущем.

Внедрение тестов в существующий проект является трудным и, вероятно, долгим процессом, но делать их одновременно с исправлением ошибок - настолько идеальное время для этого (параллельно с постепенным введением тестов в «нормальном» смысле), что было бы стыдно не воспользоваться этим шансом и не сделать лимонад из ваших отчетов об ошибках. : -)

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

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

    Я буду знать наверняка, исправили ли ваши изменения
  • Это всегда будет регрессионным тестом, который предотвратит повторение этой же проблемы в будущем.
  • Внедрение тестов в существующий проект является трудным и, вероятно, долгим процессом, но делать это одновременно с исправлением ошибок - это настолько идеальное время для этого (параллельно с постепенным введением тестов в «нормальном» смысле), что было бы стыдно не воспользоваться этим шансом и не сделать лимонад из ваших отчетов об ошибках. : -)

    Я буду знать наверняка, исправили ли ваши изменения
  • Это всегда будет регрессионным тестом, который предотвратит повторение этой же проблемы в будущем.
  • Внедрение тестов в существующий проект является трудным и, вероятно, долгим процессом, но делать это одновременно с исправлением ошибок - это настолько идеальное время для этого (параллельно с постепенным введением тестов в «нормальном» смысле), что было бы стыдно не воспользоваться этим шансом и не сделать лимонад из ваших отчетов об ошибках. : -)

    sense), что было бы стыдно не рискнуть и не сделать лимонад из ваших отчетов об ошибках. : -)

    sense), что было бы стыдно не рискнуть и не сделать лимонад из ваших отчетов об ошибках. : -)

    5
    ответ дан 30 November 2019 в 08:48
    поделиться

    Я использовал PHPUnit с хорошими результатами. PHPUnit, как и другие проекты, производные от JUnit, требует, чтобы тестируемый код был организован в классы. Если ваш проект не является объектно-ориентированным, вам необходимо начать рефакторинг непроцедурного кода в функции и функции в классы.

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

    Для тестирования приложений с графическим интерфейсом вы можете получить пользу от использования Selenium , хотя контрольный список, написанный программистом с хорошие инстинкты QA могут работать нормально. Я'

    2
    ответ дан 30 November 2019 в 08:48
    поделиться

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

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

    Я не очень уверен в модульном тестировании, но NetBeans имеет встроенный набор модульного тестирования.

    0
    ответ дан 30 November 2019 в 08:48
    поделиться

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

    0
    ответ дан 30 November 2019 в 08:48
    поделиться

    Возможно, этот список поможет вам и вашим товарищам все реструктурировать:

    1. Используйте UML для разработки и обработки исключений ( http://en.wikipedia.org/ wiki / Unified_Modeling_Language )
    2. Используйте BPMS, чтобы спроектировать рабочий процесс таким образом, чтобы у вас не было проблем ( http://en.wikipedia.org/wiki/Business_process_management )
    3. Получить список фреймворков php, которые также поддерживают бэкенды javascript (например, Zend с jQuery)
    4. Сравните эти фреймворки и выберите тот, который больше всего соответствует дизайну вашего проекта и структуре кодирования, использовавшейся до
    5. Вам следует рассмотреть возможность использования такие вещи, как ezComponents и Dtrace для отладки и тестирования
    6. Не бойтесь изменений;)
    0
    ответ дан 30 November 2019 в 08:48
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: