No que se refere a testes automatizados de aplicações comuns, temos muitas opções para testes unitários, funcionais, ferramentas de BDD, etc. Mas vocês já procuraram automatizar testes funcionais para jogos? Por exemplo, escrever um teste do tipo “Dado que a nave está no centro da tela, quando eu pressiono o direcional direito a nave deve ocupar a posição (X, Y)” ou coisa parecida.
Claro, podemos sempre escrever tests unitários para testar a lógica de uma classe SpaceShip, por exemplo. Mas quando se trata de testar uma feature do jogo em si, a coisa fica mais complicada, principalmente quando precisamos fazer asserções em cima da interface do jogo. Será que existe uma espécie de “Capybara” para jogos?
Vocês tem testado os jogos que vocês tem desenvolvido? Como?
Mas realmente é difícil automatizar o teste jogo. Até porque, boa parte das inteligências artificiais não é determinística e seu comportamento correto é não se comportar de maneira idêntica em toda situação.
Você até poderia fazer um mock e testar o desempenho da IA simulando você mesmo o lançar dos dados, mas isso gera uma explosão de comportamentos e situações de teste.
Outra coisa é que a entrada de dados de um game é extremamente rica. Muito mais completa e complexa do que se tem num formulário web. Dados os mesmos 2 ou 3 segundos, o jogador pode direcionar a nave em milhares de posições diferentes. Alguns sistema levariam meses, se não anos, para testar um número significativo de transições de estado. E os sistemas não são tão inteligentes quanto humanos para determinar quais dessas transições são importantes, e quais não.
É Vini, colocando dessa forma realmente fica complicado automatizar testes de interface.
Fazer TDD com a lógica do jogo não é tão difícil, porém. Pode-se criar testes unitários para as classes que modelam as entidades do jogo, como Player, Enemy, Ship, etc. Pode-se inclusive mockar ou fazer um stub do objeto que a entidade receberia em um provável método draw() (por exemplo, mockar ou stubar o objeto Graphics do Java2D). Já é alguma coisa pelo menos.
Obrigado pelos links, eu os lerei e postarei algum feedback quando terminar.
Um livro muito bom sobre jogos com é http://corehtml5canvas.com/
É o que eu uso como base no curso que eu ministro.
Para testes, a minha abordagem é programar a lógica de interface de uma maneira bastante modular, por exemplo, uma classe específica para tratar o controle direcional, outra para direcional com aceleração/freio, outra para sequência ou combinação de teclas, e por aí vai. Não digo o tratamento da lógica de negócio, que logicamente está distribuído entre N classes, mas o tratamento de diferentes tipos de interação, Ex.:
O controlador principal da GUI captura evento – detectada a sequência “frente-baixo-frente-soco”
Determina o tratador a ser usado de acordo com o tipo da interação definido por uma interface apropriada – chama o TratadorSequenciaTeclas associado a essa sequência. Imagine que ali foi injetado uma instância de ShoryukenAction.
O Action associado ao evento dispara a lógica para alterar o estado do objeto Ryu e provocar a atualização do sprite de acordo com esse estado.
Aí eu faria o controlador poder receber eventos programaticamente, por exemplo:
Desta forma, eu não precisaria ter um jogo inteiro funcionando para testar somente uma interação específica. Eu instancio apenas os seguintes objetos indicados no diagraminha.
Vou escrever um post no meu blog sobre isso, aí logo eu disponibilizo um exemplo para download! Abraços e Feliz Natal a todos!