Digamos que temos nosso algoritmo de localização de rotas:
def myHeuristicTSP(graph):
/*implementation*/
return route
Agora queremos fazer o teste de unidade:
class TestMyHeuristicTSP:
def testNullGraphRaiseValueError(self):
self.assertRaises(ValueError, myHueristicTSP(None))
def testSimpleTwoNodeGraphReturnsRoute:
self.assertEquals(expectedResult, myHeuristicTSP(input))
A questão é que, para um algoritmo TSP não heurístico, podemos fornecer uma variedade de gráficos e verificar se eles sempre retornam absolutamente a rota mais curta.
Mas como um algoritmo heurístico, embora ainda seja determinístico, é menos previsível, serve apenas para entender como o algoritmo está funcionando e para encontrar esses casos extremos?
unit-testing
heuristics
Dwjohnston
fonte
fonte
Respostas:
Para um algoritmo heurístico que supostamente não retorna a solução ideal, mas uma solução "suficientemente boa", você teria vários casos de teste e checaria
fonte
A maioria dos algoritmos de otimização (incluindo heurística) funciona em algumas configurações (no seu exemplo, uma rota) aplicando operações nelas. As operações por si só devem garantir que eles entreguem apenas configurações válidas; portanto, primeiro deve haver testes de unidade para cada uma delas. Quando você tem certeza de que o algoritmo de otimização usa apenas essas operações, normalmente não há necessidade de um teste de validade do resultado do algoritmo.
Para criar bons testes de unidade para qualquer tipo de algoritmo mais complexo, é preciso conhecer o próprio algoritmo em detalhes . Para heurísticas simples como "escalada", normalmente você pode prever o resultado para pequenas entradas. Por exemplo, para rotas iniciais de 3 a 5 pontos, quando fornecidas em uma determinada ordem, você pode prever o que acontecerá. Isso permanecerá verdadeiro para a maioria dos algoritmos heurísticos determinísticos que conheço, portanto esse é provavelmente um bom lugar para começar.
Para algoritmos mais complexos e tamanho maior da entrada, quando você apenas insere a entrada no algoritmo e tenta verificar a saída, na verdade você não está mais fazendo um teste de unidade, está fazendo um teste de aceitação ou integração. A razão pela qual você tem problemas para "testar a unidade" é algo que geralmente consiste em várias partes menores (unidades individuais). Portanto, para testar realmente esse algoritmo, você precisará identificar essas partes e testá-las individualmente. Além disso, você pode usar a cobertura de código ou técnicas de cobertura de filial para garantir que você tenha casos de teste suficientes.
Se você não está procurando testes de unidade, mas testes de aceitação ou integração automatizados, pode tentar o que o @Phillip sugeriu em (2) ou (3) .
fonte