O que você está procurando?
Hero background image
Dicas de teste e garantia de qualidade para projetos Unity
Esta página foi traduzida por máquina. Para ver a versão original a fim de obter uma fonte confiável e precisa,

Este artigo fornece uma introdução a diferentes práticas de teste que o ajudarão a enviar um projeto mais estável com o Unity.

O teste, ou garantia de qualidade (QA), é um processo essencial que deve ser executado durante todo o ciclo de desenvolvimento do jogo. Como os desenvolvedores experientes sabem, qualquer código que você escreve precisa ser testado.

Há uma série de métodos de teste e controle de qualidade que podem ser empregados, seja você um desenvolvedor independente ou parte de uma grande equipe (os estúdios estabelecidos geralmente têm engenheiros de controle de qualidade dedicados).

Se você gosta de jogar e/ou assistir a esportes, sabe que, em muitas partidas, é a defesa que vence os campeonatos. Pense no seu processo de controle de qualidade como sua estratégia de defesa que não deixa nada ao acaso quando se trata de lançar um jogo com o melhor desempenho e estabilidade possíveis.

Por que os testes e a garantia de qualidade são importantes?

Os testes são essenciais para descobrir problemas como bugs no código, artefatos visuais na arte ou problemas de experiência do usuário no design e na jogabilidade do jogo. Você pode desenvolver o jogo mais impressionante do ponto de vista técnico, mas se ele travar nove em cada dez vezes, seus usuários desistirão dele rapidamente.

Quando você deve implementar testes no ciclo de desenvolvimento de jogos?

Evite deixar os testes para o final do processo de desenvolvimento do jogo. Em vez de pensar no teste como um estágio em uma sequência, pode ser útil vê-lo como um processo contínuo que sustenta os outros estágios do desenvolvimento do jogo. Teste suas ideias e protótipos durante a produção e antes do envio. Repita esse processo para cada atualização lançada para o seu jogo.

Há uma série de técnicas de teste diferentes que podem se adequar melhor a diferentes estágios de seu projeto.

Quem é responsável pelos testes e pelo controle de qualidade?

Você faz parte de um pequeno estúdio sem uma equipe de controle de qualidade dedicada? Reúna um grupo de trabalho de amigos para ajudar nos testes ou escolha um provedor de controle de qualidade terceirizado para ajudar. Mesmo os estúdios com uma equipe interna de controle de qualidade geralmente usam uma empresa externa para serviços de teste adicionais, como teste de localização (LQA).

O teste de jogador, que pode ser visto como um subconjunto de controle de qualidade, ajuda a garantir que o seu jogo seja bem aceito pelo público-alvo e pelo mercado. É um processo que pode fornecer feedback valioso dos jogadores para aprimorar o jogo durante o estágio de desenvolvimento.

As pessoas que devem participar do teste de jogadores variam de acordo com os objetivos específicos do teste. Entretanto, em geral, é importante envolver um grupo diversificado de jogadores que representem o público-alvo do jogo. Ao envolver diferentes tipos de jogadores nos testes de jogadores, os desenvolvedores de jogos podem obter feedback de várias perspectivas e garantir que o jogo agrade a um público amplo.

Como fazer o controle de qualidade e testar um jogo?

Nas seções a seguir, você pode ler sobre técnicas de teste comuns. Esses métodos podem ser combinados para garantir que sua base de código tenha o melhor desempenho possível.

Também é importante testar o jogo em uma variedade de dispositivos em suas plataformas de destino. Isso se aplica especialmente a jogos para celular; você deve testar em diferentes sistemas operacionais, tamanhos de tela e nos dispositivos móveis de menor especificação. Isso ajudará a avaliar os requisitos mínimos do seu dispositivo, e cada categoria deve ser constantemente revisada quando você adicionar mais recursos ao seu aplicativo.

Testar em várias plataformas não significa apenas identificar possíveis problemas de quebra de jogos, mas também é importante entender as implicações indiretas ou de longo prazo, como drenagem da bateria ou superaquecimento térmico para jogos móveis.

Diálogo de teste do Unity no Unity Editor
Teste de unidade

O teste de unidade é uma técnica que envolve o teste de unidades ou componentes individuais de um jogo isoladamente, ajudando a garantir que os erros sejam detectados no início do processo de desenvolvimento e que as alterações no código não prejudiquem a funcionalidade existente.

O teste de unidade é feito escrevendo pequenos casos de teste que exercitam comportamentos específicos do código. Os testes podem ser executados em scripts individuais, GameObjects ou recursos específicos do jogo.

Os métodos manuais e automatizados de teste de unidade devem ser usados no desenvolvimento de jogos.

Teste de unidade manual

O teste manual envolve pessoas que jogam o jogo para testar seus recursos e funcionalidades. É importante executar testes manuais porque há problemas que os testes automatizados podem não detectar, como bugs na interface do usuário, jogabilidade ou design desequilibrados ou mal executados.

Um exemplo de teste de unidade manual no Unity seria adicionar uma condição de teste para uma função e usar Debug.Log para gerar os critérios de aprovação ou reprovação (a saída dos cenários de teste) usando o modo Play do Unity.

Testes unitários automatizados

O teste automatizado de unidades requer a criação de código para testar automaticamente unidades individuais ou partes de código isoladamente. No Unity, você pode escrever testes para scripts, componentes e outras unidades de código de jogo que podem ser executados como parte de um conjunto de testes.

O pacote Unity Test Framework (UTF) fornece uma estrutura para que os desenvolvedores escrevam seus próprios testes automatizados nos modos Editar e Reproduzir no Unity Editor. O UTF procura um teste dentro de qualquer conjunto que faça referência ao NUnit. Esses conjuntos são chamados de TestAssemblies. Os testes do modo de reprodução e do modo de edição precisam estar em montagens separadas.

A UTF fornece uma janela do Test Runner no Editor para ajudá-lo a executar e gerenciar seus casos de teste.

Como o UTF usa uma definição de montagem de teste, você precisará dividir seu projeto em definições de montagem de tempo de execução. Isso é mais fácil de fazer quando se planeja no início do processo de desenvolvimento; isso também o incentiva a escrever um código mais modular.

O pacote Unity, Performance Testing Extension, é uma extensão que você pode usar com o UTF. Ele fornece APIs adicionais para fazer medições e fornecer métricas personalizadas de seus casos de teste.

Saiba como começar a usar a estrutura de teste do Unity lendo o tutorial da estrutura de teste do Unity para desenvolvimento de videogames.

Gráfico e tabela do histórico de cobertura
Desenvolvimento orientado por testes

O desenvolvimento orientado por testes (TDD) é uma técnica que envolve a criação de testes para uma parte da funcionalidade antes de escrever o código real para implementá-la. O processo geralmente envolve escrever um teste que falhou, escrever a quantidade mínima de código necessária para que o teste seja aprovado e, em seguida, refatorar o código para torná-lo mais sustentável antes de prosseguir com o projeto do próximo caso de teste.

O TTD é bastante raro no desenvolvimento de jogos (é mais comum no desenvolvimento de software convencional). Isso provavelmente se deve ao fato de ser um processo contraintuitivo para a criação de protótipos e de uma jogabilidade divertida e atraente.

No entanto, ele pode acelerar o processo de identificação de partes defeituosas de seus jogos, pois qualquer alteração que cause uma quebra no jogo criará imediatamente casos de teste com falha.

Para saber mais sobre TDD no Unity, consulte a postagem do blog "Testing Test-Driven Development with the Unity Test Runner".

Cobertura de código

Se você quiser implementar TDD ou testes de unidade, considere usar o pacote Unity Code Coverage. Quando usado com o UTF, o pacote Code Coverage pode mostrar quais linhas de código do seu projeto estão sendo testadas para ajudá-lo a identificar partes vulneráveis ou não testadas do seu projeto.

O Code Coverage também pode gerar relatórios enquanto você testa o jogo no modo Play. Isso mostrará partes do seu código nas quais você executa testes regularmente, mesmo que não sejam cobertas por testes unitários. No entanto, embora os relatórios de cobertura de código mostrem quais linhas de código foram cobertas no teste, eles não mostrarão os diferentes caminhos pelos quais a lógica fluiu no código.

Consulte a postagem do blog "Code Coverage: Identifique as lacunas em seus testes" para obter mais informações.

Teste de integração

O teste de integração é uma técnica que testa diferentes componentes de um sistema em conjunto para garantir que funcionem corretamente. Isso pode incluir o teste de como diferentes GameObjects, scripts ou sistemas interagem uns com os outros no jogo. Devido ao seu escopo mais amplo, o teste de integração pode ajudar a detectar erros que talvez não apareçam no teste de unidade, como problemas com o fluxo de dados ou com a comunicação entre os componentes.

Por exemplo, em vez de usar testes unitários individuais, um teste de integração poderia ser escrito para toda esta sequência: um jogador disparando uma arma que instancia uma bala, a bala atingindo um inimigo e matando-o, o jogador recebendo pontos por matar o inimigo e uma conquista sendo desbloqueada quando o jogador atinge uma determinada pontuação.

Você pode usar o UTF para criar testes de integração no Unity. Usando os métodos SetUp e TearDown, você pode criar um ambiente para testar vários sistemas de uma só vez. A lógica e a entrada do jogador podem ser simuladas, especialmente se você as tiver implementado usando o padrão de comando (e se estiver usando o novo sistema de entrada, provavelmente o fez), para que você possa testar o fluxo completo da entrada do jogador na lógica do jogo.

Teste de regressão

O teste de regressão é um método para verificar se o software ou os recursos funcionam corretamente após serem modificados ou atualizados. O objetivo do teste de regressão é garantir que as alterações na base de código não introduzam novos bugs ou regressões no software. Essa técnica é melhor aplicada a aplicativos grandes e complexos com atualizações frequentes, como um jogo ao vivo, em que pode haver muitos componentes diferentes que podem interagir de maneiras inesperadas.

À medida que o mundo e a mecânica do seu jogo se expandem, também aumenta a necessidade de testes de regressão, o que pode torná-los caros. Portanto, é importante automatizá-lo sempre que possível. Os testes de regressão devem ser feitos paralelamente ao desenvolvimento de novos recursos, especialmente se você estiver visando a várias plataformas.

Embora o teste de regressão seja mais adequado para jogos maiores e ao vivo, outros fatores, como a complexidade do software, a frequência de alterações ou atualizações e a importância crítica dos recursos afetados (sistemas de missão ou segurança crítica) também determinam sua necessidade.

Teste funcional

O teste funcional avalia a funcionalidade de um sistema ou aplicativo de software, testando-o em relação aos seus requisitos funcionais. Envolve testar os recursos do sistema, as interfaces de usuário, as interações com o banco de dados e outros aspectos que afetam seu comportamento e funcionalidade. O objetivo do teste funcional é verificar se o sistema ou aplicativo atende aos requisitos e às especificações fornecidos pelo cliente ou usuário final.

A maioria dos testes de unidade se concentra em um caminho específico do código, testando se ele retorna os resultados corretos com base em determinadas entradas. Ele não é capaz de testar se o jogo faz o que foi projetado para fazer.

O teste funcional é a abordagem para isso. Cada função ou recurso é comparado com o projeto original para verificar se o resultado atende às expectativas. Isso pode incluir o teste dos controles do jogo, da mecânica de jogo e da experiência geral do usuário.

Pode ser útil ter em mente os testes funcionais ao desenvolver seu jogo e criar tarefas com a abordagem "quando isso, então aquilo". Por exemplo, quando o jogador pressiona a barra de espaço, o personagem deve pular: Essa é uma instrução para o desenvolvedor sobre como ele deve implementar um recurso e um critério de aceitação para o testador testar. Às vezes, um recurso pode incluir alguns critérios de aceitação relacionados, como quando um recurso pode ou não ser usado. Mas, em geral, eles devem se concentrar em uma única funcionalidade.

O teste funcional é mais eficaz quando os requisitos são claramente definidos e delimitados. Portanto, pode ser útil para contratar freelancers ou estúdios para fornecer componentes de sua jogabilidade ou ativos do mundo do jogo.

Você pode executar testes funcionais automatizados e manuais. Devem ser executados testes de "caixa preta" (testar o sistema sem conhecimento de seu funcionamento interno) e testes de "caixa branca" (testar o sistema com conhecimento de seu funcionamento interno).

Gráfico da GPU para o jogo
Teste de desempenho

O teste de desempenho envolve testar o jogo para garantir que ele seja executado de forma suave e eficiente em diferentes configurações de hardware e software. Isso está intimamente relacionado à criação de perfis e aos fluxos de trabalho gerais de otimização de desempenho, e essa prática pode ajudar a identificar gargalos de desempenho ou problemas que possam afetar o desempenho do jogo.

O principal objetivo é avaliar o desempenho de um sistema ou aplicativo em diferentes condições de carga de trabalho. No desenvolvimento de jogos, o teste de desempenho mede se o jogo é executado em um nível aceitável de desempenho, taxa de quadros, capacidade de resposta e estabilidade, e se usa a memória de forma mais eficiente.

Os diferentes tipos de testes de desempenho incluem:

  • Testes de carga: Determina o desempenho do jogo quando submetido a cargas de trabalho pesadas
  • Testes de estresse: Avalia como o jogo lida com situações inesperadas, como aumentos repentinos na atividade dos jogadores
  • Testes de resistência: Avalia o desempenho do jogo em longos períodos de tempo

O Unity Profiler

A ferramenta Profiler no Unity ajuda você a analisar o desempenho do seu jogo à medida que o desenvolve. Ele funciona tanto no Editor, fornecendo uma visão geral enquanto você desenvolve, quanto em qualquer dispositivo conectado à sua máquina por cabo ou por uma rede local, fornecendo uma análise precisa de como o jogo é executado em um dispositivo de destino.

O Profiler pode ser estendido para personalizar a apresentação do tipo de dados que você deseja capturar e como eles serão apresentados visualmente na janela do Profiler.

Saiba mais sobre a personalização do Profiler na sessão do Unite 2022 "Como personalizar as métricas de desempenho no Unity Profiler".

Você também pode escrever suas próprias ferramentas para criar testes de desempenho automatizados. Para uma discussão interessante sobre como abordar isso, dê uma olhada na palestra dos desenvolvedores do Monument Valley, ustwo Games, na Unite 2022: “Making Alba: Como criar um jogo de mundo aberto com bom desempenho."

Testes A/B em métricas e eventos
Teste A/B

Os testes não se limitam a encontrar bugs e monitorar o desempenho. Às vezes, você pode querer comparar duas versões de um recurso de jogo para determinar qual delas obtém mais envolvimento dos jogadores e tem melhor desempenho. Isso é chamado de teste A/B.

O teste A/B é útil para modificar as estatísticas de um personagem ou de armas que afetariam o equilíbrio do jogo, mas em que a mecânica do jogo não foi alterada. Outros exemplos podem ser testes realizados para comparar a eficácia de diferentes tutoriais, mecânicas de jogos ou interfaces de usuário. Ao analisar os dados coletados dos dois grupos, você pode identificar qual versão do jogo ou recurso é mais eficaz e tomar decisões baseadas em dados sobre quais alterações devem ser incorporadas ao produto final.

O teste A/B envolve a atribuição aleatória de jogadores a dois grupos: Um grupo joga a versão original do jogo ou recurso (o grupo de controle), enquanto o outro grupo joga uma versão modificada do jogo ou recurso (o grupo experimental).

A chave é coletar dados sobre como um pequeno grupo de jogadores foi afetado pelas diferentes alterações para ajudá-lo a tomar uma decisão de design sobre qual abordagem deve ser lançada como uma atualização generalizada.

Os testes A/B podem ajudar a melhorar a experiência do usuário e aumentar o envolvimento e a retenção dos jogadores. É particularmente útil para jogos que têm grandes bases de usuários, em que até mesmo pequenas melhorias no envolvimento ou na retenção de usuários podem ter um impacto significativo.

Os testes A/B geralmente são fornecidos como um serviço de back-end, e os jogadores nem sequer sabem que estão usando uma variante diferente. O Unity Gaming Services (UGS) tem ferramentas para ajudá-lo a executar testes A/B em seu jogo, sobre as quais você pode saber mais aqui. Você também pode conferir os Casos de uso do UGS, uma coleção de amostras de nossos serviços de back-end, para explorar exemplos de como configurar testes A/B em um jogo.

Ferramentas de teste de diagnóstico

O Cloud Diagnostics Advanced é uma ferramenta de análise e relatório de falhas, desenvolvida pela Backtrace, que se integra ao Unity para fornecer aos desenvolvedores informações detalhadas sobre falhas e exceções em seus jogos. Quando ocorre uma falha, o Cloud Diagnostics Advanced captura um instantâneo do estado do jogo no momento da falha, incluindo informações sobre o ambiente, a pilha de chamadas, o heap e os registros. Esse instantâneo é enviado para os servidores da Backtrace, onde é analisado para determinar a causa raiz da falha.

O Cloud Diagnostics Advanced também oferece ferramentas detalhadas de análise e geração de relatórios, que podem ajudá-lo a identificar tendências e padrões no desempenho e na estabilidade de seus jogos ao longo do tempo. Um algoritmo de deduplicação agrupa falhas comuns por sua causa raiz no código, que pode ser usado para ajudar a priorizar quais erros devem ser corrigidos primeiro para melhorar a estabilidade para o maior número possível de jogadores.

Mais recursos de garantia de qualidade para desenvolvedores de jogos

Independentemente das técnicas de teste que você usar, é importante ter um plano para testar o jogo e garantir que os testes sejam parte integrante do processo de desenvolvimento. Ao usar uma combinação dessas técnicas, você pode garantir que seu jogo Unity seja da mais alta qualidade e esteja pronto para a produção.

Uma nova série de livros eletrônicos para programadores está disponível gratuitamente na Unity. Cada guia é de autoria de programadores experientes e fornece práticas recomendadas para tópicos específicos que são importantes para as equipes de desenvolvimento.

Criar um guia de estilo C#: Escreva um código mais limpo e escalonável orienta as equipes no desenvolvimento de um guia de estilo para ajudar a unificar a abordagem para criar uma base de código mais coesa.

Eleve o nível de seu código com padrões de programação de jogos destaca as melhores práticas para usar os princípios SOLID e os padrões de programação comuns para criar uma arquitetura de código de jogo escalável em seu projeto Unity.

Crie uma arquitetura de jogo modular no Unity com ScriptableObjects fornece as práticas recomendadas para a implantação de ScriptableObjects na produção de jogos.

Criamos essa série para fornecer dicas práticas e inspiração para nossos criadores mais experientes. Mas eles não são livros de regras! Há muitas maneiras de estruturar seu projeto Unity; avalie as vantagens e desvantagens de cada recomendação, dica e padrão com seus colegas antes de implementá-los.

Encontre guias e artigos mais avançados no hub de práticas recomendadas do Unity.

Você gostou deste conteúdo?