Если вы имеете дело с большим количеством унаследованного кода, который в настоящее время не тестируется, то получить тестовое покрытие сейчас, а не ждать гипотетического большого переписывания в будущем, - верный шаг. Начинать с написания юнит-тестов нет.
Без автоматического тестирования, после внесения каких-либо изменений в код, вам необходимо выполнить ручное сквозное тестирование приложения, чтобы убедиться, что оно работает. Начните с написания высокоуровневых интеграционных тестов, чтобы заменить это. Если ваше приложение считывает файлы, проверяет их, обрабатывает данные некоторым образом и отображает результаты, которые вы хотите тестировать, которые фиксируют все это.
В идеале вы либо будете иметь данные из плана тестирования вручную, либо сможете получить образец фактических производственных данных для использования. Если нет, то, поскольку приложение находится в производстве, в большинстве случаев оно делает то, что должно быть, поэтому просто составьте данные, которые достигнут всех высших точек, и предположите, что вывод является правильным на данный момент. Это не хуже, чем брать небольшую функцию, предполагая, что она делает то, что называется, или любые комментарии говорят о том, что она должна делать, и писать тесты, предполагая, что она работает правильно.
IntegrationTestCase1()
{
var input = ReadDataFile("path\to\test\data\case1in.ext");
bool validInput = ValidateData(input);
Assert.IsTrue(validInput);
var processedData = ProcessData(input);
Assert.AreEqual(0, processedData.Errors.Count);
bool writeError = WriteFile(processedData, "temp\file.ext");
Assert.IsFalse(writeError);
bool filesAreEqual = CompareFiles("temp\file.ext", "path\to\test\data\case1out.ext");
Assert.IsTrue(filesAreEqual);
}
После того, как вы получите достаточно этих высокоуровневых тестов, написанных для записи нормальной работы приложений и наиболее распространенных случаев ошибок, количество времени, которое вам нужно потратить, стуча по клавиатуре, чтобы попытаться поймать ошибки из кода, выполняя что-то кроме того, что Вы думали, что это должно было значительно упасть, что значительно упростит будущий рефакторинг (или даже большую переписку).
Поскольку вы можете расширить охват модульных тестов, вы можете сократить или даже отказаться от большинства интеграционных тестов. Если ваше приложение читает / записывает файлы или обращается к БД, тестирование этих частей по отдельности и либо их макетирование, либо начало ваших тестов с создания структур данных, считанных из файла / базы данных, являются очевидным местом для начала. На самом деле создание этой инфраструктуры тестирования займет намного больше времени, чем написание набора быстрых и грязных тестов; и каждый раз, когда вы запускаете 2-минутный набор интеграционных тестов, вместо того, чтобы тратить 30 минут на ручное тестирование части того, что охватывало интеграционные тесты, вы уже добиваетесь больших успехов.