Unidade
Funções próprias de normalização de texto, conversão de unidade e formatação de parâmetro. Execução em milissegundos, sem dependência externa.
Material de leitura sobre o que testar e como testar uma interação conduzida em linguagem natural: níveis de teste, construção do oráculo, detecção automática de falhas da própria automação, não repúdio e benchmarking de serviços de processamento de linguagem natural.
O texto antecede o encontro. A segunda metade da aula é destinada à produção de dois artefatos do projeto: o plano de teste dos requisitos não funcionais e a tabela de benchmarking dos serviços de processamento de linguagem natural considerados. A leitura prévia das seções 4 a 17 é o que torna essa produção viável no tempo disponível.
As seções 15 a 17 correspondem ao Autoestudo 1; a seção 7 corresponde ao Autoestudo 2; a seção 18 corresponde ao Autoestudo 3, de realização opcional. As seções 9 e 10 tratam da linguagem Gherkin e da demonstração conduzida em sala. As demais consolidam a exposição do encontro.
A pergunta que organiza o encontro é a seguinte: o que testar e como testar uma aplicação cuja interação com o usuário se dá em linguagem natural.
Em uma aplicação convencional, a entrada é um formulário com campos tipados e domínio conhecido, e a saída esperada é única. O teste compara o resultado observado com o resultado previsto. Em uma aplicação operada por enunciados, três propriedades dessa situação desaparecem.
A primeira é a enumerabilidade da entrada. O conjunto de frases que um usuário pode proferir não é finito nem previsível, e a especificação por casos de uso cobre apenas uma fração dele. A segunda é a unicidade da saída correta: formulações distintas podem ser igualmente adequadas, de modo que a comparação literal reprova respostas válidas e aprova respostas inadequadas que coincidam com o texto esperado. A terceira é a estabilidade: modelos estatísticos produzem resultados distintos entre versões, e a mesma entrada pode gerar saídas diferentes ao longo do tempo.
Uma residência automatizada é operada por assistente de voz integrado a iluminação, climatização, fechaduras e compras em comércio eletrônico. Registram-se acionamentos divergentes do que o morador declara ter solicitado: compras confirmadas sem pedido reconhecido, comandos disparados por conversa ambiente e ordens executadas com parâmetro distinto do enunciado. O caso é retomado a cada bloco conceitual. Referência audiovisual da Instrução 2: Smart House, Rema 1000.
A consequência para a engenharia é a seguinte: a especificação do requisito precisa declarar, antes da implementação, qual evidência será aceita como prova de conformidade — métrica, limiar, conjunto de referência e procedimento de medição.
A interação em linguagem natural não é uma operação única. Constitui uma cadeia de etapas, cada uma com entrada, saída e critério de correção próprios. Testar a cadeia inteira sem testar suas etapas produz reprovação sem diagnóstico: sabe-se que o sistema errou, não onde.
| Etapa | O que se verifica | Falha característica |
|---|---|---|
| Captura | Qualidade do sinal, truncamento do enunciado, detecção do início e do fim da fala. | Corte da primeira palavra, que altera a intenção reconhecida. |
| Transcrição | Taxa de erro por palavra sob ruído, sotaque e vocabulário do domínio. | Termo técnico substituído por palavra comum foneticamente próxima. |
| Interpretação | Acurácia da intenção, completude dos parâmetros e confiança atribuída. | Transcrição correta com intenção errada, ou parâmetro ausente substituído por valor padrão. |
| Ação | Correspondência entre parâmetro extraído e comando emitido; idempotência da execução. | Comando executado duas vezes por reenvio, sem identificador de operação. |
| Resposta | Adequação da confirmação, pedido de desambiguação e possibilidade de cancelamento. | Execução de intenção de baixa confiança sem confirmação prévia. |
Cada pergunta é respondida no nível em que o defeito é isolável com o menor custo. A escolha do nível determina a velocidade da execução, a estabilidade do resultado e a precisão do diagnóstico.
Funções próprias de normalização de texto, conversão de unidade e formatação de parâmetro. Execução em milissegundos, sem dependência externa.
Interpretador de intenção isolado por duplo do serviço externo. Verifica o contrato do componente sobre classes de entrada definidas.
Componente e serviço de processamento de linguagem natural em conjunto, com verificação do contrato de dados e do tratamento de erro e de tempo limite.
Percurso completo do enunciado ao acionamento, incluindo latência, custo por transação e produção do registro de auditoria.
Conformidade com o requisito acordado com o parceiro, sobre conjunto de enunciados representativo do domínio de uso.
A pergunta “o sistema entendeu o usuário?” pertence ao nível de aceitação. A pergunta “o interpretador devolve a intenção correta para esta classe de enunciado?” pertence ao nível de componente, e é nela que a automação produz diagnóstico aproveitável pela equipe.
Entende-se por teste automatizado o programa que exercita outro programa, compara o resultado observado com o critério declarado e reprova a execução quando há divergência. A precedência da automação sobre a inspeção humana decorre de três propriedades: repetição sem custo marginal, precisão de medição e capacidade de detectar regressão.
A inspeção humana permanece necessária onde o julgamento é o próprio critério: adequação do tom da resposta, clareza do pedido de desambiguação, aceitabilidade cultural do comportamento e razoabilidade do percurso no domínio de aplicação. Essa inspeção ocorre uma vez por entrega; a execução automatizada ocorre a cada alteração do repositório.
Verificações repetitivas, numerosas, sensíveis a regressão ou dependentes de medição precisa devem ser automatizadas antes de qualquer inspeção manual. A inspeção manual de item automatizável constitui desperdício e não produz registro comparável entre execuções.
A reflexão proposta para o encontro consiste em identificar, no próprio projeto, os requisitos não funcionais cuja verificação por pessoas é impraticável. A tabela abaixo relaciona os casos recorrentes em aplicações de linguagem natural.
| Requisito | Por que a pessoa não verifica | Procedimento automatizado |
|---|---|---|
| Latência sob concorrência | Depende de carga simultânea e de medição no percentil, não da percepção individual. | Ensaio de carga com carga sintética e registro da distribuição de tempos. |
| Custo por transação | Só se manifesta no volume acumulado de milhares de execuções. | Contagem instrumentada de requisições associada à tabela de preço do fornecedor. |
| Robustez a ruído | Exige reprodução controlada e repetível de condições acústicas. | Execução do corpus com ruído sobreposto em níveis calibrados. |
| Regressão de acurácia | Exige recomparação de centenas de casos a cada versão do modelo. | Execução do conjunto anotado a cada alteração, com comparação ao histórico. |
| Comportamento sob falha | A falha do serviço externo não ocorre sob demanda durante a inspeção. | Injeção de erro, atraso e tempo limite no duplo do serviço. |
| Estabilidade prolongada | Exige execução contínua por horas com observação de memória e conexões. | Ensaio de longa duração com coleta periódica de indicadores do processo. |
Corresponde ao Autoestudo 2, apoiado nas páginas 372 a 387 de Pressman. Entende-se por componente a menor unidade de software com interface declarada e responsabilidade própria. A questão central do autoestudo é por que o teste nesse nível é condição para localizar o defeito em um sistema composto por serviços de terceiros.
As técnicas de caixa-branca derivam os casos de teste da estrutura interna do código. O teste de caminho básico utiliza o grafo de fluxo de controle, e a complexidade ciclomática estabelece o limite superior de caminhos independentes a exercitar. Acrescentam-se a cobertura de condição, de decisão e o tratamento sistemático de laços. Aplicam-se ao código próprio: normalização do enunciado, roteamento da intenção, validação do parâmetro e política de confirmação.
As técnicas de caixa-preta derivam os casos da especificação, sem acesso à estrutura interna. Compreendem o particionamento em classes de equivalência, a análise de valor-limite e o teste baseado em tabela de decisão. Aplicam-se ao serviço de processamento de linguagem natural contratado, cujo código não é acessível à equipe.
O componente só é testável isoladamente quando a dependência externa é acessada por interface própria, substituível por um duplo em tempo de teste. A ausência dessa fronteira transforma toda verificação em teste de integração, com execução lenta, custo por requisição e resultado dependente da disponibilidade do fornecedor.
Entende-se por oráculo o critério que decide se a saída observada está correta. Sem oráculo declarado não existe teste, apenas execução. Em linguagem natural, o oráculo é construído por três caminhos, frequentemente combinados.
Enunciados coletados no domínio e anotados com a intenção e os parâmetros corretos. Produz acurácia, precisão, revocação e medida F1 por intenção.
Regras que valem para toda entrada, independentemente da formulação, e que podem ser asseridas em cada execução.
Execução do mesmo conjunto em dois serviços ou em duas versões, com investigação das divergências observadas.
“Acurácia de intenção igual ou superior a 0,92 no conjunto de validação v3, com taxa de falso acionamento de comando financeiro igual a zero.” O enunciado declara métrica, limiar e conjunto, e por isso é verificável por terceiro.
Entende-se por Gherkin a linguagem estruturada em que o critério de aceitação é redigido em texto legível pelo parceiro e, simultaneamente, executado como teste. A linguagem provém da prática de desenvolvimento guiado por comportamento e é interpretada por arcabouços como Cucumber, behave, pytest-bdd e SpecFlow.
Em uma aplicação de linguagem natural, o cenário em Gherkin cumpre a função descrita na seção anterior: declara o oráculo no vocabulário do domínio, sem referência à implementação, e por isso permanece válido quando o serviço de processamento é substituído ou atualizado.
| Palavra-chave | Função | Observação |
|---|---|---|
Funcionalidade | Nomeia o comportamento sob especificação e abre o arquivo. | Um arquivo .feature por funcionalidade. |
Regra | Enuncia a norma de negócio que agrupa os cenários seguintes. | Torna explícita a ligação entre requisito e casos. |
Contexto | Pré-condições comuns a todos os cenários do arquivo. | Evita a repetição da mesma cláusula Dado. |
Cenário | Um caso concreto, com estado, evento e resultado. | Cada cenário é independente dos demais. |
Esquema do Cenário e Exemplos | O mesmo cenário executado sobre cada linha de uma tabela de dados. | Recebe o corpus anotado descrito na seção 8. |
Dado, Quando, Então, E, Mas | As cláusulas de cada passo do cenário. | Tratadas em detalhe adiante. |
Etiquetas com @ | Marcam subconjuntos selecionáveis na execução. | Exemplo: executar apenas os cenários de não repúdio. |
A primeira linha do arquivo pode declarar o idioma com # language: pt, o que habilita as palavras-chave em português. O acervo adota essa forma, de modo que o parceiro leia a especificação sem tradução.
As três cláusulas repartem o cenário em estado anterior, evento único e resultado observável. A troca de função entre elas produz cenários que executam sem verificar comportamento.
| Cláusula | O que declara | Exemplo do caso | Erro recorrente |
|---|---|---|---|
| Dado (Given) | Estado do mundo anterior à ação, posto sem descrever interação do usuário. | O limiar de confiança para execução direta é 0,85. | Descrever a ação do usuário como pré-condição. |
| Quando (When) | O evento único cujo efeito se quer verificar. | O usuário enuncia “compra mais leite”. | Mais de uma cláusula Quando no mesmo cenário. |
| Então (Then) | Resultado observável na fronteira do sistema. | O sistema solicita confirmação explícita. | Verificar estado interno ou registro do banco de dados. |
| E e Mas | Continuação da cláusula imediatamente anterior. | E nenhum pedido é emitido ao comércio eletrônico. | Alternar de cláusula sem retomar a palavra-chave correspondente. |
“Quando o usuário abre o aplicativo, toca no botão do microfone, aguarda dois segundos e fala.” O cenário depende da interface e é reescrito a cada alteração de tela.
“Quando o usuário enuncia ‘compra mais leite’.” O cenário permanece válido sob qualquer interface e é compreendido pelo parceiro sem tradução.
# language: pt
Funcionalidade: Confirmação de comando de compra por voz
Contexto:
Dado que o assistente está ativo na cozinha
E que o limiar de confiança para execução direta é 0,85
Regra: Comando de efeito financeiro exige confirmação quando a confiança é insuficiente
Cenário: Intenção reconhecida com confiança insuficiente
Dado que o serviço reconhece a intenção "comprar_item" com confiança 0,62
Quando o usuário enuncia "compra mais leite"
Então o sistema solicita confirmação explícita
E nenhum pedido é emitido ao comércio eletrônico
E a interação é registrada na trilha de auditoria
Esquema do Cenário: Enunciado captado do ambiente
Quando o sistema processa "<enunciado>" sem palavra de ativação
Então nenhum comando é executado
E o evento é registrado como descartado
Exemplos:
| enunciado |
| acho que acabou o leite |
| ela mandou comprar pilhas ontem |
| preciso trancar a porta amanhã |
@nao-repudio
Cenário: Reconstituição de comando contestado
Dado que o usuário "u-1183" executou o comando "abrir_fechadura" em 18/09/2026 às 21:14
Quando o perito consulta a trilha pelo identificador de correlação "c-99f2"
Então o registro apresenta autor, enunciado, confiança, parâmetros e instante
E a assinatura do registro é validada com a chave pública do serviço emissor
O arquivo .feature não executa por si. Cada passo é associado a uma definição escrita em código, que concentra a chamada ao sistema e a asserção correspondente. O exemplo abaixo utiliza a sintaxe do arcabouço behave.
@given('que o limiar de confiança para execução direta é {limiar:f}')
def passo_limiar(context, limiar):
context.assistente = Assistente(limiar_confianca=limiar)
@when('o usuário enuncia "{enunciado}"')
def passo_enunciar(context, enunciado):
context.resposta = context.assistente.processar(enunciado)
@then('o sistema solicita confirmação explícita')
def passo_confirmacao(context):
assert context.resposta.tipo == 'confirmacao', context.resposta
Um cenário útil declara um único Quando, verifica resultado observável na fronteira do sistema, emprega termos do domínio do parceiro e permanece compreensível sem consulta ao código. Cenário que descreve cliques e seletores verifica a interface, não o comportamento especificado.
A relação com o Autoestudo 3 é direta: o conjunto de arquivos .feature especifica o comportamento, afere a conformidade a cada execução e vincula requisito, teste e alteração de código, que são as três dimensões tratadas na seção 18.
Trinta minutos do encontro são destinados à demonstração do percurso completo entre um requisito do projeto e o teste que o executa. A demonstração é conduzida no projetor, com o repositório aberto, a partir de um requisito enunciado por um dos grupos.
| Tempo | Passo | O que se observa |
|---|---|---|
| 4 min | Do requisito ao arquivo | Conversão do enunciado em prosa para Funcionalidade e Contexto, com discussão sobre o que pertence a cada cláusula. |
| 6 min | Primeiro cenário | Redação de Dado, Quando e Então. A execução acusa passos indefinidos e imprime os esqueletos das definições. |
| 6 min | Definições de passo | Implementação das definições com chamada ao sistema. A execução reprova por comportamento ausente, com a mensagem de asserção exibida. |
| 5 min | Comportamento mínimo | Implementação da regra de confirmação sob baixa confiança até a aprovação do cenário. |
| 5 min | Esquema e corpus | Conversão em Esquema do Cenário, com a tabela de Exemplos alimentada por linhas do conjunto de referência. |
| 4 min | Oráculo removido | Remoção deliberada da cláusula Então de efeito: a suíte aprova comportamento incorreto, o que introduz a seção seguinte. |
O arquivo produzido durante a demonstração é versionado no repositório da turma e serve de modelo para o primeiro cenário que cada grupo redige na atividade do encontro.
A suíte de testes é software e contém defeitos. O defeito mais grave é aquele que produz aprovação indevida, porque suprime o sinal de erro em vez de emiti-lo. A pergunta do encontro — como detectar erros automaticamente quando a própria automação falha — é respondida por procedimentos que verificam a capacidade de detecção da suíte.
| Falha | Manifestação | Detecção automática |
|---|---|---|
| Asserção ausente | O teste percorre o caminho e não verifica o resultado, aprovando qualquer saída. | Teste de mutação: defeitos injetados deliberadamente no código devem reprovar a suíte; o escore de mutação mede a proporção detectada. |
| Duplo permissivo | O substituto do serviço externo devolve sempre resposta válida, ocultando o tratamento de erro. | Teste de contrato executado contra o serviço real, somado à injeção de erro e de tempo limite no duplo. |
| Oráculo obsoleto | O conjunto de referência deixa de representar o vocabulário em uso; a métrica permanece alta com desempenho degradado em campo. | Amostragem periódica do tráfego real e comparação da distribuição com a do conjunto de referência. |
| Teste instável | O resultado alterna sem alteração do código, e a equipe passa a reexecutar a suíte até a aprovação. | Reexecução programada sem alteração do código e registro do índice de instabilidade por caso. |
| Cobertura inerte | Linhas executadas sem verificação de comportamento elevam a cobertura sem ganho de detecção. | Cobertura de decisão combinada ao escore de mutação, tratados em conjunto. |
A ausência prolongada de reprovações não evidencia ausência de defeitos. Quando nenhuma execução falha por período extenso, verifica-se primeiro a capacidade de detecção da própria suíte.
Considere o falso acionamento de compra por conversa ambiente, descrito na situação-problema. A falha da automação em detectá-lo produz três ordens de consequência: financeira, pela transação indevida e pelo custo de estorno; contratual, pela violação do acordo de nível de serviço e pela eventual sanção regulatória; e de confiança, pela desistência do usuário em utilizar o comando por voz para operações de efeito irreversível. A terceira é a de reversão mais lenta.
Parte dos defeitos de uma aplicação de linguagem natural só se manifesta com entrada real, em condições que o conjunto de referência não reproduz. A detecção depende de instrumentação declarada em projeto, e não acrescentada após o incidente.
Entende-se por não repúdio a propriedade que impede o autor de uma ação de negar validamente tê-la praticado, por existir evidência verificável por terceiro. A propriedade se distingue de duas outras com as quais é frequentemente confundida.
Estabelece a identidade no momento do acesso. Isoladamente, não sustenta prova posterior sobre um comando específico.
Garante que o registro permanece como foi gravado. Sem vínculo com o autor, não atribui a ação a ninguém.
Vincula autor, ação, parâmetros e instante em registro íntegro, verificável por quem não participou da operação.
A retenção de gravação e de transcrição constitui tratamento de dado pessoal e observa base legal, finalidade declarada, minimização e prazo definido. A evidência é desenhada para sustentar a prova com o menor conjunto de dados suficiente.
A propriedade é verificada por procedimento que simula a contestação descrita no encontro: o usuário alega não ter acionado um comando executado pelo sistema, e o especialista precisa estabelecer, a partir dos registros, se houve interação.
A reconstituição é suficiente quando um terceiro sem acesso privilegiado estabelece que determinado usuário emitiu determinado enunciado em determinado instante, e que o comando executado corresponde ao enunciado registrado. O ensaio é conduzido por pessoa que não participou do desenvolvimento.
Corresponde ao Autoestudo 1, apoiado em Hayahi, Arakaki e Ruggiero (2020), páginas 1 a 3. A questão inicial do artigo é como avaliar uma solução sem depender do discurso comercial do fornecedor.
A alegação do fornecedor descreve o comportamento do produto em condições escolhidas por ele: corpus, carga, região de processamento e configuração. A decisão técnica exige medição conduzida pelo comprador, no contexto de uso previsto, com procedimento reproduzível. Entende-se por benchmarking o experimento comparativo que submete alternativas ao mesmo conjunto de casos, sob condições idênticas, com métricas declaradas antes da execução.
Corresponde à página 5 do artigo. O atributo de qualidade é extraído de três fontes e convertido em especificação mensurável.
Funções expostas ao usuário e condições de execução: comando por voz, operação contínua, resposta imediata.
Propriedades do ambiente: ruído, sotaque regional, vocabulário técnico, intermitência de rede, presença de terceiros.
Resultado esperado pela organização: redução do custo de atendimento, retenção do cliente, obrigação regulatória, prazo contratual.
Para o profissional de engenharia de software, os adjetivos “bom”, “rápido” e “barato” não constituem requisito. O atributo é evidenciado por especificação técnica com valor, unidade, condição de medição e estatística de referência, e a solução é medida para verificar se o atende.
| Enunciado inadequado | Especificação técnica correspondente | Instrumento de medição |
|---|---|---|
| “Precisa ser rápido” | Latência de resposta no percentil 95 igual ou inferior a 800 ms com 50 sessões concorrentes. | Ensaio de carga com carga sintética e registro da distribuição. |
| “Precisa ser preciso” | Acurácia de intenção igual ou superior a 0,92 e medida F1 de extração de parâmetros igual ou superior a 0,88. | Execução sobre corpus anotado versionado do domínio. |
| “Precisa ser barato” | Custo por transação igual ou inferior a R$ 0,012 no volume mensal projetado. | Contagem instrumentada de transações e tabela de preço do fornecedor. |
| “Precisa ser seguro” | Registro assinado e encadeado de cem por cento dos comandos de efeito irreversível, com retenção de cinco anos. | Verificação automatizada da cadeia de resumos sobre amostra do período. |
Corresponde às páginas 10 a 14 do artigo. A pergunta prática é se os serviços de processamento de linguagem natural dos grandes fornecedores atendem ao projeto e qual deles é o mais adequado. A comparação se organiza em tabela com critérios homogêneos e pesos declarados antes da medição.
| Critério | Unidade | Como medir | Observação para a decisão |
|---|---|---|---|
| Custo | R$/transação | Preço por requisição no volume projetado, incluindo tarifa mínima e excedente. | Verificar degraus de preço por faixa e o custo de reprocessamento. |
| Desempenho | ms | Latência média e percentil 95 sob concorrência, medida a partir da região de uso. | Separar tempo do serviço, tempo de rede e tempo de fila interna. |
| Precisão | 0 a 1 | Acurácia de intenção e medida F1 de parâmetros sobre o mesmo corpus anotado. | O corpus decide a comparação; conjunto genérico mede outro problema. |
| Complexidade | porte | Esforço de integração, dependências operacionais e conhecimento exigido da equipe. | Considerar retenção de dados, região de processamento e dependência do fornecedor. |
A tabela é acompanhada do conjunto de casos utilizado, da data da medição e da versão de cada serviço. Sem esses três elementos o resultado não é reproduzível nem contestável, e a comparação perde valor probatório para a decisão de arquitetura.
O artigo propõe reexaminar a escolha na hipótese de aplicação em ambiente crítico, como uma mina de extração mineral, com equipamentos em operação, pessoas e ruído intenso. O conjunto de critérios permanece; alteram-se os pesos, os limiares e o desenho do experimento.
Corresponde ao Autoestudo 3, de realização opcional, que avalia o desenvolvimento dirigido por testes aplicado ao módulo de processamento de linguagem natural em três dimensões.
Examinar, no repositório do grupo, se um leitor externo reconstitui os requisitos do módulo a partir dos testes existentes, e registrar as lacunas encontradas.
Quarenta e cinco minutos em grupo, com entrega registrada no repositório do projeto ao final da aula. São produzidos dois artefatos.
Quando e resultado observável em Então.Cada linha do plano declara como o resultado é obtido por execução automatizada. Item verificável apenas por inspeção humana é registrado com a justificativa da impossibilidade de automação.