Estratégia de teste para jogos

13

Eu herdei um jogo educacional baseado na Web. No ano passado, trabalhei para estabilizar o código e adicionar novos recursos. A maior parte da lógica está no front-end; portanto, os testes de unidade de back-end, embora úteis, cobrem uma pequena porcentagem do código.

O jogo chegou ao ponto em que está começando a ficar complexo. Existem dois modos diferentes para cada jogo e o jogo se comporta de maneira diferente, dependendo do modo. Existem também várias bandeiras que afetam o jogo.

Sou desenvolvedor de aplicativos há mais de 10 anos e isso me deixa perplexo. No mundo corporativo, um algoritmo sempre funciona da mesma maneira. Vou escrever um teste de unidade para um algoritmo, espero o valor 42 e haverá erro se não obtiver esse valor.

Quando se trata de jogos, estou perdido. Como faço para testá-los? Eu tenho testadores disponíveis para mim. Eu posso gastar tempo escrevendo testes de unidade.

Os testadores não são confiáveis. Eles não são os melhores em resolver problemas e eu não lhes dei a melhor direção. Sem gastar muito tempo a cada ciclo de lançamento testando todas as permutações e combinações do jogo, como devo usá-las como um recurso?

Os testes de unidade parecem limitados. Como a maior parte da lógica é javascript (e eu herdei o código espaguete), posso usar um pacote de front-end como Cucumber ou selenium para garantir que certos recursos estejam funcionando.

Essa é a melhor estratégia? Como as empresas de jogos testam jogos?

Eu li a pergunta " Desenvolvimento orientado a testes para jogos complexos " (entre outros no site), mas não aborda o que estou procurando. Estou pedindo estratégias, não exemplos específicos de como testar.

jeffkolez
fonte
as recomendações de recursos de livro / fora do site são explicitamente fora de tópico por centro de ajuda . Veja meta.programmers.stackexchange.com/questions/6483/...
mosquito
Não é uma duplicata. Essa pergunta está perguntando como escrever testes de unidade. Estou pedindo estratégia.
jeffkolez 8/09/2014
2
FWIW, quando se trata de testar a GUI é testes de unidade não mais - é mais como testes de integração ou testes de aceitação
slebetman

Respostas:

16

No mundo corporativo, um algoritmo sempre funciona da mesma maneira. Vou escrever um teste de unidade para um algoritmo, espero o valor 42 e haverá erro se não obtiver esse valor.

Isso não é muito diferente nos jogos. A presença de dois modos e vários sinalizadores no jogo em que você trabalha não muda nada: se você usar um modo específico com um conjunto específico de sinalizadores, continuará recebendo o mesmo valor repetidamente ao testar uma parte do o código fonte.

Com muitos modos e sinalizadores, o jogo pode rapidamente se tornar muito difícil de testar, devido ao número de variantes possíveis. Para reduzir o risco de encontrar essa dificuldade mais cedo, você deve:

  • Mock / stub severamente . Mantenha as peças testadas pequenas e zombe de tudo em que elas confiam.

    Se eles dependem do tempo, zombe do objeto time para sempre fornecer um resultado específico ou um conjunto de resultados específicos, independentemente da hora real.

    Se eles confiarem random(), zombe para fornecer uma constante sempre.

  • Refatorar . Se os testes começarem a ser excessivamente complicados ou se você perceber que uma classe, para ser testada, requer doze argumentos após a implementação da Injeção de Dependência, enquanto ela exigia apenas dois antes, você precisa refatorar o código.

  • Questione as regras de negócios reais do aplicativo. Parei de contar o número de projetos quase impossíveis de testar por causa do número de variações diferentes exigidas pelos requisitos funcionais que ninguém precisava nem entendia - nem mesmo as partes interessadas.

    Quando um pequeno site de comércio eletrônico precisa de dez páginas para explicar os requisitos funcionais usados ​​para determinar como os preços das remessas são calculados, não se deve começar escrevendo testes ou códigos, mas sim, retornar às partes interessadas e trabalhar com elas para produzir requisitos sãos .

Por fim, automatize todos os testes . Os testadores são necessários para descobrir situações em que o aplicativo falha. O uso de testadores para executar, repetidamente, a mesma ação a cada revisão é contraproducente e desrespeita os testadores: o teste de regressão deve ser feito por máquinas, não por pessoas. As pessoas, por outro lado, são muito melhores em encontrar possíveis erros. "E se eu ..." é uma das técnicas que eles podem usar ("E se eu inserir alguns megabytes de dados binários contendo vários \ x00 em um campo que pergunta a minha idade e ver o que vai acontecer?"), mas abordagens mais formais também podem ser usadas.

Arseni Mourzenko
fonte
Obrigado por seus comentários. Parece que tenho muito trabalho a fazer!
jeffkolez