Estou trabalhando em um comparador de lista para ajudar a classificar uma lista não ordenada de resultados de pesquisa por requisitos muito específicos de nosso cliente. Os requisitos exigem um algoritmo de relevância classificada com as seguintes regras em ordem de importância:
- Correspondência exata no nome
- Todas as palavras de consulta de pesquisa em nome ou sinônimo do resultado
- Algumas palavras de consulta de pesquisa em nome ou sinônimo do resultado (% decrescente)
- Todas as palavras da consulta de pesquisa na descrição
- Algumas palavras da consulta de pesquisa na descrição (% decrescente)
- Data da última modificação decrescente
A escolha do design natural para esse comparador parecia ser uma classificação pontuada com base em potências de 2. A soma de regras menos importantes nunca pode ser mais do que uma correspondência positiva em uma regra de maior importância. Isso é alcançado pela seguinte pontuação:
- 32.
- 16
- 8 (Pontuação secundária do desempate com base em% descendente)
- 4
- 2 (Pontuação do desempate secundário com base em% descendente)
- 1
No espírito do TDD, decidi começar com meus testes de unidade primeiro. Ter um caso de teste para cada cenário único seria no mínimo 63 casos de teste exclusivos, sem considerar casos de teste adicionais para a lógica secundária do desempatador nas regras 3 e 5. Isso parece arrogante.
Os testes reais serão realmente menores. Com base nas próprias regras reais, certas regras garantem que as regras mais baixas sempre sejam verdadeiras (por exemplo, quando 'Todas as palavras da consulta de pesquisa aparecerem na descrição', então regra 'Algumas palavras da consulta de pesquisa aparecerão na descrição' sempre será verdadeira). Ainda vale o nível de esforço em escrever cada um desses casos de teste? Esse é o nível de teste normalmente exigido quando se fala em 100% de cobertura de teste no TDD? Caso contrário, qual seria uma estratégia de teste alternativa aceitável?