Вот простой, но эффективный общий метод отладки сложного приложения, а также пример на C#.

Введение

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

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

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

Добавление кода автоматизации

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

Недавно мне пришлось решать какую-то сложную задачу в какой-то огромной медицинской системе. Это была междисциплинарная программная система, которая годами разрабатывалась несколькими разработчиками. Его папка с исходным кодом объемом 30 ГБ содержит сотни библиотек и множество сторонних зависимостей. Самой сложной частью задачи была его отладка, потому что загрузка приложения и навигация между его экранами для перехода к нужной части занимала у меня каждый раз около 10 минут. Поэтому я решил добавить в него немного автоматизации, чтобы облегчить себе работу. Огромное программное обеспечение было написано на C# с помощью WPF, но технику, которую я использовал, можно применить на любом другом языке программирования.

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

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

Код C#, который я использую

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

Как это использовать

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

Вы можете скопировать этот фрагмент кода из следующего блока:

string user = DebugValues.GetValue("имя пользователя", "user");
string password = DebugValues.GetValue("password", "password");
if (DebugValues.IsOn( «пропустить вход»))
{
// добавьте сюда код, который заполняет поля имени пользователя и пароля
// и нажимает кнопку входа в систему

После первого запуска приложения и входа на экран входа в систему, предполагая, что имя исполняемого файла — «test.exe», файл CSV с именем «test.exe.debug.csv» будет создан автоматически в том же папка как исполняемый файл.

Теперь вы можете открыть этот файл с помощью Excel или любого текстового редактора.

Теперь, когда вы хотите пропустить экран входа в систему, просто измените значение параметра «пропустить вход» на «включено» (изменив ячейку B3). Вы можете предпочесть использовать простой текстовый редактор, потому что для сохранения изменений в CSV с помощью Excel требуется 4 раза нажать «да» перед закрытием файла.

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

Вывод

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

Первоначально опубликовано на https://www.orensifri.meddevsoft.com.