Como desenvolver testes eficientes?
Olá a todos.
Venho trabalhando desde 2020 em uma empresa que fornece serviços de Pesquisa e Desenvolvimento (P&D) na área de inteligência artificial e visão computacional.
Hoje, para o software que vai realizar a computação da IA e resolver os problemas de visão computacional, utilizamos C++ e Python.
Recentemente, por volta do meio de 2023, a gente começou a trabalhar com APIs, também feitas em Python usando FastAPI, e a desenvolver front-ends usando React.js. Também estamos trabalhando com Java para desenvolvimento Mobile e Swift para iOS.
De 2020 para cá, aprendi muita coisa (ainda bem). Contudo, uma coisa que certamente não consegui desenvolver muito bem é a parte de teste de software. Uma das coisas que eu menos tenho conhecimento é sobre teste de software. Hoje, no projeto em que estou encarregado, a gente faz testes manuais, ou seja, a gente roda o software que precisamos em um computador de borda, que nada mais é do que um mini PC cujo hardware foi desenvolvimento focando nos modelos de inteligência artificial. Que são as famosas Jetson NVIDIA.
Então nosso processo de software hoje se reside em:
- Tem uma pessoa encarregada de pegar este computador e instalar o software do zero. Simulando um computador novo.
- Rodamos o software em um vídeo onde a gente sabe qual o comportamento esperado da IA nele.
- Conecta uma câmera na rede, ou no próprio computador.
- Roda o software novamente nessa câmera que está livestreaming o nosso escritório.
Esta é a nossa rotina de testes, porém, tenho plena certeza de que isso não é o ideal. Há formas de melhorar. A questão que fica é, como?
Eu sei que existem ferramentas como PyTest, GoogleTest para C++, e etc... Porém o que me falta é uma metodologia para saber:
- o que eu preciso testar?
- o que eu consigo automatizar?
- como que eu vou testar?
- quais testes eu preciso fazer?
Fazendo algumas buscas, eu encontrei este site que comenta sobreThe Four Levels of Software Testing:
- Unit Test
- Integration Test
- System Testing
- Acceptance Testing
Isso já me dá um norte de como eu posso estruturar o processo de teste. Entretanto, eu ainda não consigo ter claro na minha cabeça o que exatamente eu preciso testar.
Vou dar um exemplo:
A gente possui uma classe que lê uma câmera, através de um link RTSP ou arquivo de vídeo, essa classe lê os frames em uma thread para que sempre estejamos lendo o frame mais recente da câmera. Normalmente, os leitores de vídeo como OpenCV, ou até as próprias câmeras, possuem um buffer de frames, para algumas aplicações é crucial lermos o mais recente. Caso não seja possível ler o frame naquele momento, a gente cria um frame em preto e continua o streaming. O que nós precisamos é que este leitor sempre esteja operando. Contudo, se ele ficar mais do que 30 segundos sem ler nada, ele encerra a leitura.
Nesse exemplo, como que eu poderia testar o comportamento esperado? Uma das formas que eu vejo é utilizando um vídeo, criar o teste automatizado e fazer o assert se ele parou de rodar depois do tempo especificado. Porém, eu precisaria também testar com uma câmera real, e aí surge um grande problema, pois existem algumas possibilidades que podem ocorrer com uma câmera real que não são tão simples de replicar.
Outro exemplo:
O leitor de câmera acima, é um dos componentes que o meu software precisa. A gente possuem outros componentes que são classes que encapsulam o modelo de IA para fazer detecção de objetos em imagens, outro componente é um escritor de dados no formato de JSON. Este JSON possui o conteúdo da imagem, em base64, os objetos que foram detectados e a timestamp do evento que foi detectado.
Neste caso, eu acredito que se trata de um integration test.
Dado este contexto, minhas perguntas são:
- Quais metodologias de testes vocês adotam, no sentido de: o que eu vou testar e como eu vou testar.
- Eu comentei mais da parte de software embarcado, porém como que eu posso desenvolver testes para componentes de UI, no caso dos componentes de React.js. Existe metodologia para isso também?
Desde já agradeço a todos.