Como se faz o teste de unidade em um mecanismo de jogo?


23

Para minha vergonha, nunca escrevi um teste de unidade adequado, apenas pequenos programas de teste não organizados que eu descartaria depois que o teste fosse bem-sucedido. Eu realmente não tenho uma idéia clara de como o teste de unidade deve ser realizado em um projeto de jogo. (Minha linguagem é C ++.)

Devo ter um projeto separado para cada subsistema no meu mecanismo e um teste associado a ele e, em seguida, ter um projeto / solução maior que construa o mecanismo real? Digamos, por exemplo, eu tenho o eventmódulo no meu mecanismo; como devo lidar com isso?


pergunta interessante: quando você desenvolve seu mecanismo, é muito fácil testar a funcionalidade, mas e o grande projeto no teste de jogos?
Yevhen 24/01

2
Não é uma pena: testes de unidade não são automaticamente uma coisa boa.
o0 '.

1
Se você nunca tentou usar testes de unidade, isso é definitivamente uma pena.
precisa

Respostas:


18

Primeiro, você precisaria de uma estrutura de teste de unidade. No passado, eu usei o UnitTest ++ e o Google Test . O primeiro é muito leve e o segundo é mais destacado, mas um pouco mais pesado. Ele se integra bem ao Google Mock, caso você precise desse tipo de coisa. Obviamente, existem muitas outras opções: consulte esta lista (pelo eventual autor do UnitTest ++) e a Wikipedia, por exemplo.

O teste de unidade trata da escrita de testes focados para enfatizar determinados bits de código independentes isolados ("unidades") em vários cenários. Embora em alguns casos você possa testar tudo, geralmente não é prático obter 100% de cobertura e, especialmente em jogos, pode ser bastante difícil - é discutível se o teste de unidade da saída do renderizador é ou não significativo, útil ou um teste de unidade "verdadeiro" independentemente.

É importante lembrar que qualquer teste (automatizado) é melhor do que nenhum teste (automatizado). Portanto, você não deve se estressar demais com o fato de seus testes não serem "verdadeiros testes de unidade" e se orgulhar de ter simplesmente testes. As estruturas de teste de unidade geralmente são úteis para criar testes "não unitários", mais frouxos, pois incluem funcionalidade para testes de empacotamento e relatório de falhas de maneira uniforme.

Gostaria de encorajá-lo a ressuscitar seus testes antigos e transformá-los em um projeto de teste usando uma das estruturas disponíveis - algo que você pode executar facilmente de tempos em tempos (ou automaticamente como parte de uma versão ou integração) que executa todos os seus testes. Escreva novos testes para bits de código, pois fica aparente que seria útil para você; por exemplo, se você descobrir um bug sutil que poderia ter detectado com um teste, poderá adicionar um para capturar todas as regressões que fizer no futuro.

Você provavelmente descobrirá que esse código de utilidade de nível inferior é passível de teste de unidade em jogos. Tudo bem - é o código básico que pode perturbar muitas camadas mais altas se quebrar.

Você não irá ao purgatório do programador por não ter testes para todas as funções e portas lógicas da sua base de código; portanto, não gaste mais tempo do que precisa para escrever testes. Se você precisar pensar mais ou gastar significativamente mais tempo escrevendo os testes de um módulo do que o necessário para criar o módulo, pode estar desperdiçando seu tempo. Teste de unidade - teste em geral - é uma ferramenta que você aprende a usar adequadamente para ajudá-lo, não uma tarefa que você deve executar para tudo.


3
If you have to [...] spend significantly more time writing the tests [...] than it took you to author the module... Então seu módulo é muito complexo. Simplifique agora, você agradecerá a si mesmo no futuro!
Jess Telford

3
@ Jess Um módulo desproporcionalmente difícil de testar não precisa necessariamente ser simplificado. Existem muitas áreas em que o teste de unidade simplesmente não é um bom uso do tempo. Isso inclui gráficos, onde a saída pode variar bastante e ainda ser aceitável; código que provavelmente não será alterado no futuro; ou código em que o tipo de design abstrato e desacoplado que seria necessário para facilitar o teste de unidade é muito mais feio, mais suscetível a erros, menos desempenho ou menos intuitivo.
Casey Rodarmor

@rodarmor - concordou. Existe uma escala móvel do que é apropriado e do que não é. Tal como acontece com todos esses tipos de respostas, um tamanho não serve para todos :)
Jess Telford

Para o UnitTest ++, vá para github.com/unittest-cpp/unittest-cpp . Todo o resto está desatualizado.
Markus


4

Uma "unidade" é o menor pedaço de código testável, geralmente uma única função ou classe. Um teste de unidade é outro trecho de código que exercita essa unidade de código para garantir que ela se comporte conforme o planejado. Uma única unidade de código pode ter muitos testes, para cobrir todos os casos.

Normalmente, os testes não são incluídos na construção principal de um projeto. Em vez disso, há uma configuração de compilação separada para teste que inclui todo o código de teste e produz um programa que executa todos os testes e relata os resultados. Uma estrutura de teste fornecerá todo o andaime para isso e é recomendada, embora não seja estritamente necessária. Se você é totalmente novo no teste, pode ser melhor escrever primeiro seu próprio equipamento de teste ad-hoc, para garantir que você entenda tudo o que está acontecendo.

Cubra o máximo de código possível com os testes, priorizando o código que você não confia ou o código que é frágil e que pode ser quebrado por alterações futuras. Você deve executar os testes com frequência, idealmente após cada alteração de código.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.