La maggior parte degli algoritmi di ottimizzazione (inclusa l'euristica) funzionano su alcune configurazioni (nell'esempio un percorso) applicando le operazioni su di esse. Le operazioni per sé dovrebbero garantire di fornire solo configurazioni valide, quindi prima di tutto dovrebbero esserci test unitari per ciascuno di essi. Quando sai con certezza che l'algoritmo di ottimizzazione utilizza solo quelle operazioni, in genere non è necessario un test di validità del risultato dell'algoritmo.
Per creare buoni test unitari per qualsiasi tipo di algoritmo più complesso, è necessario conoscere l'algoritmo stesso in dettaglio . Per euristiche semplici come "hill climbing", in genere è possibile prevedere il risultato per piccoli input. Ad esempio, per i percorsi iniziali da 3 a 5 punti, se assegnati in un determinato ordine, puoi prevedere cosa accadrà. Questo rimarrà vero per la maggior parte degli algoritmi euristici deterministici che conosco, quindi è probabilmente un buon punto di partenza.
Per algoritmi più complessi e dimensioni maggiori dell'input, quando inserisci l'input nell'algoritmo e provi a controllare l'output, non stai più facendo un test unitario, stai facendo test di accettazione o integrazione. Il motivo per cui si hanno problemi a "testare l'unità" come un algo è perché in genere consiste in una manciata di parti più piccole (singole unità). Quindi per un vero test unitario di un tale algoritmo, dovrai identificare quelle parti e testarle individualmente. Inoltre, puoi utilizzare la copertura del codice o le tecniche di copertura delle filiali per assicurarti di avere abbastanza casi di test.
Se non stai cercando test unitari, ma test di accettazione o integrazione automatici, puoi provare ciò che @Phillip suggerito sotto (2) o (3) .