Как вы эффективно программируете, когда на тестирование кода уходит много времени?

16

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

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

Энн Нонимус
источник
Вы используете IDE?
Woot4Moo
3
Ваша корневая проблема не в том, что вы не можете эффективно кодировать, это тесты, которые выполняются слишком долго. Вы задаете не тот вопрос.
Рейн Хенрикс
Используйте язык, который имеет REPL.
Роберт Харви
У вас есть коллеги, о которых вы можете спросить и поучиться?
user985366

Ответы:

25

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

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

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

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

Darien
источник
12

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

  • Мой код был встроен в новый образ ядра для встроенного оборудования.
  • Сервер DHCP был обновлен, чтобы указывать на новое ядро.
  • Тестовая плата была перезагружена.
  • Тестовая плата получила ядро ​​с моей рабочей станции через монтирование NFS.
  • Тестовая плата перезагрузилась на новое ядро.
  • Юнит тесты были запущены.
  • Результаты модульного теста были возвращены на мою рабочую станцию.

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

Кевин Клайн
источник
2
+1. Нет проблем, которые нельзя решить с помощью достаточного количества сценариев оболочки.
Том Андерсон
1
Я не останусь в командах, которые не заботятся об улучшении скорости.
Кевин Клайн
@Tom За исключением слишком большого количества слоев сценариев оболочки;)
Дариен
Нет, вы просто пишете сценарий оболочки, который оборачивает другой сценарий оболочки. Тогда есть только один сценарий оболочки. ДОВЕРЬТЕСЬ МНЕ.
Том Андерсон
3
+1: повышение скорости редактирования -> компиляция -> загрузка -> запуск -> отладка -> редактирование - единственное лучшее, что вы можете сделать для ускорения производства кода. Когда я работал в Tymshare, у нас был парень, который утверждал (правильно), что его код работал правильно с первой попытки 87% времени. Я, с другой стороны, закодировал, как будто я получил передозировку на обезьяну с кофеином в 1 час ночи (которой я был). Я допустил массу опечаток и т. Д., Но я не беспокоился о них, потому что знал, что компилятор их поймает. В конце дня я был, вероятно, в 3-5 раз более продуктивным, чем он.
Питер Роуэлл
8

Автоматизированные тесты не являются заменой для обзора и понимания.

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

dietbuddha
источник
5

Вы уже дали ответ: I usually make a lot of syntax errors and logic errors

Поэтому, усердно работая над улучшением этого, вы сможете сократить время тестирования. Синтаксические ошибки должны быть самыми первыми, которые вы должны уменьшить. Никогда не было теста по программированию с бумагой и карандашом в вашем кабинете?

У меня было то же самое, когда я перешел с PHP на Java. Мне пришлось научиться отлаживать, а не просто печатать некоторые переменные и нажимать F5 в браузере ...

WarrenFaith
источник
2
Все мы время от времени совершаем глупые ошибки, со временем и опытом они случаются реже.
maple_shaft
@maple_shaft это правда, но когда он говорит, что make a lot ofэто звучит так, как будто он должен вкладывать свою энергию, чтобы улучшить его
WarrenFaith
3
Я сделал много кода на бумаге и на досках. Проблема та же: код выглядит правильно при первой проверке, но после его запуска вы замечаете свои ошибки.
Энн Нонимус
замечать ошибки в коде и писать код с неправильным синтаксисом - большая разница. Первый может случиться со всеми, второй - для начинающих. Я не знаю вашего происхождения, но даже в качестве новичка вы должны минимизировать синтаксические проблемы. Какая у тебя IDE и язык? Он должен поддерживать синтаксические проверки.
WarrenFaith
@Anne Nonimus: Вы имеете в виду логические ошибки? Синтаксические ошибки должны обнаруживаться вашей IDE (в идеале - если вы работаете с динамически генерируемым кодом, эти синтаксические ошибки не будут обнаруживаться во время компиляции).
FrustratedWithFormsDesigner
4

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

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

Билл Липер
источник
2

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

Нил Баттерворт
источник
3
Вы «биржевые» и «торгующие» инженеры программного обеспечения - уникальная порода. У моего друга был ряд психических расстройств, работающих на одну такую ​​компанию. Я никогда не слышал ничего хорошего из этой ниши индустрии программного обеспечения.
maple_shaft
@ maple Ну, я больше этим не занимаюсь. Но уникальный? Нет, любой может написать дерьмовый код, а большая часть трейдингового кода глубоко, очень дрянная. Однако, как ни крути, это основа нашего общества.
Нил Баттерворт
Да, я слышал то же самое о телекоммуникационном коде и о том, сколько миллионов линий было в программном обеспечении управления коммутатором. Затем я присоединился к телекоммуникационной компании и понял, что если бы они наняли несколько программистов, тысячи строк было бы достаточно.
Кевин Клайн
2

Модульное тестирование; Макет приложений / симуляторов.

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

При правильном использовании эти инструменты гарантируют, что до того, как вы приблизитесь к внешним системам, вы на 99,9% уверены, что в случае сбоя кода это вызвано чем-то во внешней системе / изменением среды, а не ошибкой в ​​вашем собственном коде.

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

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

Вектор
источник
1

Я обычно делаю много синтаксических ошибок и логических ошибок

Может быть, использование Linter может помочь вам немного здесь.

Я был в аналогичной ситуации с моим предыдущим работодателем. Наша кодовая база была действительно огромной, и для внесения любых изменений мне пришлось кодировать, скомпилировать, затем заменить .classфайлы на dev-сервере, затем перезапустить dev-sever с помощью скрипта restart. И, к моему ужасу, потребуется около получаса, чтобы снова запустить dev-сервер.

Позже я узнал, что удаленная отладка dev-сервера также возможна.

Итак, вот что я сделал, чтобы оптимизировать свой процесс

  • Первый начальный этап удаленной отладки, это позволило мне увидеть точный поток кода и точные значения / состояния переменных.

  • Планирую как и какие изменения я внесу.

  • Внесение изменений, а затем сравнение различий

  • Кэширование ошибок с использованием линтера или компиляцией.

  • Предоставление оперативного исправления путем замены .classфайлов и перезапуска.

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

Также использование IDE с хорошим авто-осложнением может значительно помочь в уменьшении опечаток.

Надеюсь это поможет.

Алаф Азам
источник