Dê a todos 30 segundos para pensar sobre o que é isso?
Este é o diagrama de classes inicial da função do módulo de login de um determinado sistema.
À medida que o software moderno continua a se tornar mais complexo, os Code Graphs fornecem aos testadores uma maneira intuitiva de tornar a lógica do código complexo fácil de entender. Este artigo se aprofundará nos gráficos de código e demonstrará como os gráficos de código visual podem aprimorar os recursos dos testadores de software e como conduzir testes por meio de cenários da vida real escavados e exemplos práticos.
1. O que é um diagrama de código?
Diagrama de código refere-se a uma ferramenta gráfica usada para representar a estrutura do código, relacionamentos entre classes ou interações entre elementos de código. Os tipos comuns incluem diagramas de classes, diagramas de sequência, diagramas de atividades, diagramas de componentes, etc.
O mapa de código consiste nas duas partes a seguir:
- Nós ( Nodes ) representam elementos de código, como classes, objetos e atividades;
- As arestas representam relacionamentos entre nós, como associação, herança e dependência .
Tomemos como exemplo o diagrama de classes de um relacionamento de combinação:
2. Benefícios da visualização de código
A visualização do código exibe graficamente a estrutura e os relacionamentos do código. Os membros da equipe têm muitos benefícios ao usar diagramas de código durante o processo de teste de software, como melhorar a comunicação e a colaboração entre si, aumentar a eficiência e a concentração, etc. Isso ajuda os testadores de software a compreender a lógica e os relacionamentos do código mais rapidamente, reduzindo o tempo gasto na leitura e compreensão do código.
1Melhore a comunicação e a colaboração
O importante papel dos diagramas de código é ajudar a preencher a lacuna entre pessoas técnicas e não técnicas. Os testadores podem explicar facilmente o fluxo do código para gerentes, clientes ou membros que não estão familiarizados com o código.
Stelios Manioudakis, ex-engenheiro de software da Siemens, tomou a si mesmo como exemplo para ilustrar completamente o papel dos diagramas de código na melhoria da comunicação e da colaboração.
Em seus primeiros dias como testador de software, ele trabalhou em um projeto para desenvolver um novo aplicativo de monitoramento de condicionamento físico. Eles analisam os dados dos sensores por meio de algoritmos de rastreamento do sono para determinar os estágios do sono (sono leve, sono profundo) e gerar relatórios de sono. Mas no processo de teste do algoritmo, eles encontraram muitas dificuldades, porque é difícil para pessoas não técnicas entenderem a lógica do algoritmo apenas por meio do código.
É aqui que os diagramas de código são úteis. Eles usam fluxo de algoritmo visual e pontos de decisão para diferentes leituras de sensores e cálculos de padrões de sono para permitir que gerentes de produto e designers de UI entendam cenários potenciais que precisam ser testados por meio de diagramas de código, como padrões de sono instáveis ou dados de sensores ausentes.
Além disso, os mapas de código facilitam a colaboração com os desenvolvedores. Durante as revisões de código, testadores e desenvolvedores podem identificar melhor possíveis diferenças entre a lógica pretendida e a implementação real consultando o mapa de código. No final, o algoritmo de rastreamento do sono no aplicativo de monitoramento de condicionamento físico passou no teste com sucesso e o diagrama de código desempenhou um papel importante.
2 Melhore a eficiência e a concentração
Os testadores podem planejar, escrever e executar testes com mais eficiência por meio de diagramas de código, reduzindo o trabalho repetitivo e melhorando assim a cobertura e a qualidade dos testes.
Tomemos como exemplo o algoritmo de envio de notícias. Esse algoritmo faz recomendações personalizadas aos usuários com base em seus interesses e interações. Inicialmente, os testadores precisam analisar cuidadosamente o código linha por linha, uma abordagem demorada e trabalhosa que dificulta a identificação de todos os possíveis cenários de teste. Mas os diagramas de código exibem fatores de influência, como preferências do usuário, pós-interações e atualização do conteúdo de uma forma intuitiva. Além disso, os diagramas de código fornecem pontos de decisão claros e caminhos de ramificação.
- Tópicos em destaque: concentre-se em testar cenários onde os tópicos em destaque são exibidos primeiro no fluxo de informações para garantir que os usuários não perderão conteúdo popular.
- Recomendações personalizadas: Priorize testes de diferentes perfis de usuários com diferentes interesses e interações para verificar se o algoritmo recomenda com precisão conteúdo relevante.
- Casos extremos: casos extremos potenciais, como usuários inativos ou usuários com interação limitada, são destacados. Os testadores podem projetar casos de teste específicos para garantir que o algoritmo não falhe nessas circunstâncias.
É óbvio que usar diagramas de código é muito mais rápido do que inspecionar o código linha por linha. Isso permite que os testadores priorizem áreas-chave do algoritmo, garantindo testes completos e proporcionando aos usuários uma experiência de feed de notícias mais confiável e personalizada.
3Melhore a capacidade de manutenção dos documentos
A documentação pode ajudar os membros da equipe a compreender mais rapidamente o fluxo do programa e possíveis pontos de teste após a refatoração do código ou quando novos membros da equipe precisarem revisar o código.
Por exemplo: o sistema de gestão de inventário de uma plataforma de comércio eletrónico foi criado há muitos anos. Hoje em dia, a manutenção tornou-se cada vez mais complexa e as novas funções tornaram-se cada vez mais difíceis de implementar. Durante o processo de ajuste do sistema, diante de uma lógica complexa de gerenciamento de estoque, o diagrama de código exibe intuitivamente tudo, desde a adição e atualização de produtos até o processamento de pedidos e gerenciamento do nível de estoque.
Dessa forma, os testadores podem garantir que o sistema de gerenciamento de estoque ajustado seja mantido de forma eficiente e que a função dos diagramas de código seja evidente.
- Comunique-se com mais clareza: Use diagramas de código para explicar a funcionalidade do sistema aos novos membros da equipe. Juntamente com comentários de código, esses diagramas fornecem uma visão geral clara e concisa, tornando mais rápido compreender a lógica do sistema e as considerações de teste.
- Revisão de código eficiente: durante a revisão de código, fazer referência a diagramas de código e comentários de código pode ajudar a identificar possíveis problemas antecipadamente. Ao visualizar o impacto das mudanças no processo geral, as equipes podem garantir que as modificações não tenham efeitos colaterais indesejados em outras partes do sistema.
- Manutenção preparada para o futuro: À medida que o sistema evolui e novos recursos são adicionados, os diagramas de código servem como valiosos pontos de referência. Mesmo os testadores que não estiveram envolvidos no projeto podem compreender facilmente a lógica existente e as áreas de impacto potencial, permitindo esforços de teste mais eficientes e direcionados.
4. Detecte problemas antecipadamente
Os diagramas de código podem revelar problemas que podem passar despercebidos em uma revisão de código de texto simples, porque diagramas de código mais confusos indicam códigos mais complexos, que são mais propensos a erros.
Por exemplo, o sistema de agendamento de consultas do hospital introduziu um novo recurso durante o processo de atualização: permitir que os pacientes remarcassem consultas online. Após a revisão do código e o design dos casos de teste, novos recursos podem ser colocados em uso se nenhum problema grave for encontrado.
Contudo, dada a complexidade envolvida no tratamento de partes específicas de compromissos conflitantes, os testadores decidiram empregar diagramas de código para inspeção e validação adicionais. Os diagramas de código ilustram possíveis problemas que podem ser ignorados em uma revisão somente de texto:
- Vários pontos de decisão: Vários pontos de decisão baseados em vários fatores, como consultas existentes, disponibilidade do médico e restrições de tempo. Essa estrutura ramificada complexa significa um risco maior de erro, pois é difícil considerar todos os cenários possíveis durante os testes.
- Lógica oculta: A natureza complexa dos diagramas torna muito difícil a compreensão visual da lógica do código. Isto levanta preocupações sobre possíveis condições ocultas ou comportamento inesperado no código.
Como resultado, os testadores reajustaram as novas funções com base no diagrama de código:
- Priorize os testes: Priorize os testes de cenários que envolvam datas conflitantes. Concentre-se em casos extremos e combinações que podem expor possíveis erros em lógica complexa.
- Colabore com os desenvolvedores: com a ajuda de representações visuais, os testadores discutem as complexidades descobertas com os desenvolvedores. A colaboração resultou em esforços de refatoração de código que simplificaram a lógica e reduziram a complexidade ciclomática.
Os testadores usam mapas de código para identificar proativamente possíveis problemas e trabalhar com os desenvolvedores para resolvê-los. Isso garante a integridade e confiabilidade do sistema de agendamento de consultas hospitalares.
5 Conexões de programação estruturada
Os diagramas de código se adaptam perfeitamente aos princípios da programação estruturada (sequência, seleção e repetição). Essas estruturas básicas são mapeadas diretamente para padrões gráficos específicos, simplificando o teste dessas estruturas comuns.
(1) Projeto de teste simplificado: A programação estruturada enfatiza estruturas claramente definidas, como sequência, seleção (if-else) e repetição (loop). Os mapas de código mapeiam essas estruturas diretamente para padrões específicos:
- Sequência: um nó em linha reta que representa uma instrução após outra instrução
- Seleção: uma estrutura ramificada com um único nó de entrada, um nó condicional e duas arestas de saída (uma para verdadeiro e outra para falso), levando a uma sequência separada de instruções
- Repetir: Um padrão de loop com um nó de entrada, um nó de condição, uma aresta retornando o nó de condição e uma aresta apontando para o corpo do loop (sequência de instruções)
(2) Visualização mais fácil dos casos de teste: Ao identificar esses padrões familiares nos diagramas de código, os testadores podem compreender rapidamente o fluxo do programa e os casos de teste correspondentes. Por exemplo, o padrão de loop no diagrama representa a necessidade de casos de teste para cobrir várias iterações do loop, incluindo condições de contorno e comportamento esperado.
6 Mais sobre medição de complexidade
O número do ciclo é uma medida baseada na complexidade do gráfico do código que ajuda a avaliar a dificuldade de testar um programa. Quanto maior a complexidade (quanto mais caminhos), mais completo será o teste. Mas vamos mergulhar em mais detalhes.
- Contagem de loops: esta métrica é derivada da estrutura do gráfico de código e é usada para estimar o número de caminhos de execução independentes em um programa. Quanto maior a contagem de loops, maior a complexidade, geralmente devido a fatores como loops aninhados, vários pontos de decisão ou instruções GOTO .
- Planejamento inteligente de testes: os números dos ciclos servem como guia para os testadores, indicando a quantidade de esforço necessária para testes abrangentes. Um programa com uma contagem de loops mais alta requer mais casos de teste para cobrir todos os possíveis caminhos de execução do que um programa com uma contagem de loops mais baixa. Isso ajuda os testadores a priorizar seu trabalho e garantir uma cobertura abrangente de seções complexas.
Aqui está um exemplo rápido, considere um programa simples com duas instruções if-else consecutivas :
if condition1:
# statements for if condition1 is true
else:
if condition2:
# statements for if condition2 is true
else:
# statements for both conditions false
nó:
- Nó 1 : O ponto inicial do programa, representando o início da execução do código.
- Nó 2 : Nó de decisão condição1 . Este nó avalia a condição e determina o fluxo de execução com base no resultado (verdadeiro ou falso).
- Nó 3 : O bloco de instruções condição1 é executado se for verdadeiro . Este nó representa todo o código dentro do bloco "if" da condição1 .
- Nó 4 : o nó "else" associado à condição1 . Este nó representa o caminho alternativo se a condição2 não estiver marcada (ou seja, a condição1 é falsa).
- Nó 5 : Nó de decisão da condição2 . Este nó avalia a condição e decide o fluxo de execução com base no resultado (verdadeiro ou falso).
- Nó 6 : O bloco de instrução executado quando a condição2 é verdadeira. Este nó representa todo o código no bloco de código "if" da condição2 .
- Nó 7 : O nó "else" associado à condição2 - este nó representa o final do programa e representa o código que é executado se a condição1 e a condição2 forem falsas.
lado:
- Borda 1 : Conecta o nó 1 e o nó 2 , representando o fluxo inicial do ponto inicial ao primeiro ponto de decisão
- Edge 2 (true): condição1 conecta o nó 2 e o nó 3 , indicando o processo a ser executado caso seja verdadeiro.
- Borda 3 (falso): condição1 conecta o nó 2 e o nó 4 , indicando que se for falso, o fluxo alternativo será adotado
- Edge 4 : Conecta o nó 4 e o nó 5 , indicando o fluxo do bloco "else" até o segundo ponto de decisão da condição1
- Edge 5 (true): condição2 conecta o nó 5 e o nó 6 , indicando o processo a ser executado se verdadeiro
- Edge 6 (false): condição2 conecta o nó 5 e o nó 7 , indicando o endpoint quando for falso
O gráfico de código correspondente terá uma estrutura ramificada com três pontos de decisão e vários caminhos de execução. O número de ciclos deste gráfico é 4 (nós - arestas + 2 ). Isso indica que a lógica pode ser mais complexa e exigir mais casos de teste do que um programa com estrutura mais simples.
Ao compreender esses benefícios, os testadores de software podem aproveitar os diagramas de código para navegar com eficácia pela lógica do programa, projetar casos de teste eficazes e ajudar a fornecer software de alta qualidade.
Vamos explicar em detalhes como derivar o círculo número 4 .
- A complexidade ciclomática nos diz quantos caminhos independentes existem em um programa. Quanto mais caminhos houver, mais complexo será o teste.
- Neste código temos duas decisões (verificar condição1 e condição2 ). Cada decisão cria uma potencial bifurcação no caminho (verdadeira ou falsa).
- No entanto, como o bloco else condição1 aponta diretamente para a condição de decisão2 , não há nenhuma ramificação real ali. É como uma rua de mão única que leva a outro ponto de decisão.
- Portanto, contamos apenas pontos de decisão independentes: ponto inicial , condição1 (verdadeiro ou falso) , condição2 (verdadeiro ou falso).
Como temos 3 pontos de decisão, mas adicionar 1 por causa do ponto inicial é uma forma comum de calcular a complexidade ciclomática, o número final é 3 + 1 = 4 .
lembrar:
- Maior complexidade ciclomática não significa necessariamente que o código seja ruim, mas indica que mais cenários de teste podem precisar ser considerados.
- Com uma complexidade de 4 , este trecho de código não é muito complexo, mas à medida que o número de decisões e aninhamento de condições aumenta, a complexidade ciclomática e o esforço de teste aumentam significativamente.
3. Limitações dos diagramas de código
Embora os diagramas de código tenham as vantagens de melhorar a comunicação e a colaboração, aumentando a eficiência e o foco, os testadores também precisam prestar atenção ao seguinte:
1 não é possível executar o elemento
- Ignore comentários e declarações: Os diagramas de código concentram-se principalmente no fluxo de controle dentro de um programa, representado por instruções executáveis. Elementos não executáveis, como comentários e declarações de dados, geralmente são ignorados porque não afetam diretamente a execução do código.
- Potencial para mal-entendidos: Embora a omissão destes elementos possa simplificar o diagrama, pode causar alguns mal-entendidos. Os testadores precisam estar cientes desses elementos ignorados e garantir que eles sejam levados em consideração durante o teste para evitar ignorar possíveis problemas relacionados à inicialização de dados, comentários lógicos ou outras seções de código não executáveis.
2 Distinguir viabilidade do caminho
- Desafios na identificação de caminhos significativos: Nem todos os caminhos em um gráfico de código representam sequências de execução válidas ou significativas. Certos caminhos são tecnicamente viáveis (topologicamente viáveis) dependendo da estrutura do grafo, mas são ilógicos ou sem sentido (semanticamente inviáveis) no contexto da lógica do programa.
- Maior esforço de teste: identificar e priorizar caminhos de teste viáveis pode ser desafiador e exigir esforço adicional dos testadores. Eles precisam analisar a lógica e o contexto do programa para distinguir caminhos válidos de inválidos, o que pode resultar em design de casos de teste e tempo de execução adicionais.
3 Aliviando essas limitações
- Combine com outras técnicas de teste: Os diagramas de código funcionam melhor quando combinados com outras técnicas de teste, como revisão de código ou análise de fluxo de dados. Estas técnicas podem ajudar a identificar elementos não executáveis e o seu impacto potencial, ao mesmo tempo que ajudam a compreender a lógica de um programa para avaliar melhor a viabilidade de um caminho.
- Concentre-se em caminhos críticos: os testadores podem priorizar o teste de caminhos críticos ou de alto risco no gráfico de código. Isso envolve considerar fatores como condições de loop, entrada esperada do usuário e possíveis cenários de erro para determinar o caminho que terá o maior impacto no teste.
Ao compreender e contornar essas limitações, os testadores podem utilizar gráficos de código com eficácia. Testes abrangentes e eficientes podem ser realizados reconhecendo suas limitações inerentes e a necessidade de combiná-los com outros métodos de teste.
4. Escreva no final
O software de mensagens instantâneas corporativo desenvolvido de forma independente pela equipe de software ZenTao integra o aplicativo de código aberto draw.oi , que combina organicamente bate-papo e colaboração. Todos os diagramas de código neste artigo são concluídos usando esta função. Ao utilizar diagramas de código, os testadores de software podem obter uma compreensão mais profunda da lógica do programa. Eles podem projetar casos de teste mais eficazes e contribuir para o fornecimento de software de alta qualidade.
Temos que admitir que à medida que o cenário do software continua a evoluir, os diagramas de código continuarão a ser uma ferramenta importante para garantir a confiabilidade e robustez das aplicações.
*Referência: Gráficos de Código: Um Guia para Testadores por Stelios Maniooudakis
RustDesk suspendeu o serviço doméstico Taobao (taobao.com) devido a fraude desenfreada, reiniciou o trabalho de otimização da versão web, a Apple lançou o chip M4, estudantes do ensino médio criaram sua própria linguagem de programação de código aberto como uma cerimônia de maioridade - Internautas comentaram: Confiando em a defesa, Yunfeng renunciou ao Alibaba e planeja produzir no futuro o destino para programadores de jogos independentes o Visual Studio Code 1.89, é oficialmente anunciado pela Huawei. O ajuste de trabalho de Yu Chengdong foi pregado no “Pilar da Vergonha FFmpeg. ” 15 anos atrás, mas hoje ele tem que nos agradecer - Tencent QQ Video vinga sua vergonha anterior? A estação espelho de código aberto da Universidade de Ciência e Tecnologia Huazhong está oficialmente aberta ao acesso à rede externa