Есть ожидаемое поведение и ожидаемые значения.
Есть - фактические.
Кроме реализации функционала контроля всех промежуточных состояний объектов (реестр состояний UML-диаграммы) и переменных в исполняемом коде с возможностью быстрого отключения данного функционала - других путей нет и быть не может.
/*BEFORE*/
////////TEST SECTION N////////
if (TEST) {
//test variables and object states (+update UML states registry)
}
//////END TEST SECTION N/////
/* MAIN WORK BLOCK CODE (from UML diagramm)
.....
*/
/*AFTER*/
////////TEST SECTION N////////
if (TEST) {
//test variables and object states (+update UML states registry)
}
//////END TEST SECTION N/////
Проверять нужно не только подготавливаемые перед использованием значения переменных на конкретном шаге, но и состояния всех контролируемых объектов на этом шаге.
PS: в regex и особенно, в условиях - довольно легко можно ошибиться и не заметить...