Teste metamórfico: por que quase ninguém sabe sobre essa técnica promissora

imagem

Eu tenho que admitir: estou lendo a ACM Magazine . Isso me torna um "nerd", mesmo para os padrões dos programadores. Entre outras coisas, aprendi com esta revista sobre "testes metamórficos". Eu nunca tinha ouvido falar dele antes, como todas as pessoas que perguntei. Mas a literatura científica sobre esse assunto é surpreendentemente volumosa: existem muitos exemplos incrivelmente bem-sucedidos de sua aplicação em campos de pesquisa completamente diferentes. Então, por que não ouvimos falar dele antes? Existe apenas um artigo para pessoas fora da comunidade científica. Agora deixe haver dois deles.

Breve histórico


A maioria dos testes escritos usa oráculos . Ou seja, você conhece a resposta e verifica explicitamente se os cálculos fornecem a resposta correta.

def test_dist(): p1 = (0, 3) p2 = (4, 0) assert dist(p1, p2) == 5 

Além dos testes da Oracle, também existem testes manuais. O testador senta-se no computador e compara os dados de entrada com os resultados. À medida que os sistemas se tornam mais complexos, os testes manuais estão se tornando cada vez menos úteis. Cada um deles verifica apenas um ponto em um espaço de estado muito maior, e precisamos de algo que explore todo o espaço de estado.

Isso nos leva a testes generativos : escrever testes cobrindo um conjunto aleatório em um espaço de estado. O estilo mais popular de teste generativo é o teste baseado em propriedade ou PBT. Encontramos a "propriedade" da função e, em seguida, geramos os valores de entrada e verificamos se os valores de saída correspondem a essa propriedade.

 def test_dist(): p1 = random_point() p2 = random_point() assert dist(p1, p2) >= 0 

A vantagem do PBT é que ele cobre mais espaço. Sua desvantagem é a perda de especificidade. Isso não é mais um teste do oracle! Não sabemos qual deve ser a resposta e a função pode estar errada, mas de uma maneira que possua a mesma propriedade. Aqui contamos com heurísticas.

Um problema sério com o PBT é encontrar boas propriedades. A maioria das funções possui propriedades simples e gerais e propriedades complexas e específicas. Propriedades gerais podem ser aplicadas a um grande número de funções, mas elas não nos fornecem muita informação. Propriedades mais específicas fornecem mais informações, mas são mais difíceis de encontrar e são aplicáveis ​​apenas em áreas de tarefas limitadas. Se você possui uma função que determina se um gráfico é acíclico, quais testes de propriedade você escreverá? Eles vão lhe dar confiança de que a função está correta?

Motivação


Agora considere uma tarefa mais complexa. Imagine que você deseja escrever um conversor de fala em texto (STT) para inglês. Ele recebe um arquivo de som e exibe o texto. Como você testaria isso?

A maneira mais fácil de usar um oráculo de mão. Dite a frase e verifique se o texto de saída corresponde a ela. Mas isso nem chega perto! O alcance do discurso humano é enorme . Seria melhor testar 1.000 ou até 10.000 arquivos de som diferentes. Oráculos de mão com transcrição seriam muito caros. Isso significa que precisamos usar testes baseados em propriedades.

Mas como geramos entrada? Por exemplo, podemos criar linhas aleatórias, passá-las por um conversor de texto em fala (texto em fala, TTS) e, em seguida, garantir que nosso STT produza o mesmo texto. Mas isso novamente nos dá uma gama muito limitada de voz humana. O TTS pode criar mudanças na entonação, “engolir” palavras, imitar um forte sotaque? Se não conseguirmos lidar com eles, o STT será particularmente útil? É melhor usar textos arbitrários, por exemplo, gravações de rádio, podcasts e vídeos online.

Agora surge um novo problema. Ao usar o TTS, começamos com texto escrito. No caso de arquivos de som arbitrários, não temos e, ao mesmo tempo, não queremos transcrever manualmente. Em vez disso, estamos limitados ao uso de propriedades. Quais propriedades precisamos testar? Exemplos das propriedades mais simples: “o programa não trava com nenhum dado recebido” (uma boa propriedade) ou “não converte música acústica em palavras” (talvez?). Essas propriedades não cobrem muito bem a verificação da tarefa principal do programa e aumentam ligeiramente a confiança em sua qualidade.

Então, nós temos duas tarefas. Primeiro, precisamos de uma grande quantidade de informações na forma de fala. Em segundo lugar, precisamos entender como convertê-los em testes úteis sem passar longas horas transcrevendo manualmente as vozes em oráculos.

Teste metamórfico


Por tudo isso, a saída é considerada separadamente. E se os incorporarmos em um contexto mais amplo? Por exemplo, se um clipe de som é transcrito para a saída de saída, devemos sempre out com:

  • Aumento de volume duplo
  • Aumento da frequência
  • Aumentar o ritmo
  • Adicionando ruído de fundo
  • Adicionando ruído do veículo
  • Qualquer combinação dos itens acima.

Todas essas são transformações "simples" que podemos testar facilmente. Por exemplo, para um teste com "ruído do veículo", podemos coletar 10 amostras de ruído do carro, colocá-las em um clipe de som e verificar se os resultados do reconhecimento das 11 versões correspondem. Podemos dobrar ou aumentar o volume, transformando 11 versões em 33 versões e, em seguida, dobrar o ritmo para obter 66 versões. Esse princípio pode ser aplicado a cada clipe de som em nosso banco de dados, expandindo significativamente o espaço dos dados recebidos.

A presença de 66 versões para comparação é bastante conveniente. Mas isso não é tudo: ainda não precisamos saber qual deve ser o resultado. Se todas as 66 conversões retornarem, o teste foi aprovado com êxito, se pelo menos uma retornar outra coisa, o teste falhou. Em nenhum momento precisamos verificar o que está contido. Isto é extremamente importante. Portanto, aumentamos significativamente o espaço de teste com muito pouco envolvimento humano. Por exemplo, podemos fazer o download de um episódio da série, realizar conversões e verificar se todos os resultados de sua conversão para o texto 1 correspondem. Fizemos testes úteis sem ouvir o clipe de voz . Agora podemos gerar testes complexos e profundos sem usar um oráculo!

Dois conjuntos de dados de entrada, bem como os dados de saída, são conectados um ao outro. Essa propriedade relacionada ao conjunto de dados de entrada / saída é chamada de link metamórfico 2 . O teste que aplica essa propriedade é chamado de teste metamórfico . Em sistemas complexos, relacionamentos metamórficos interessantes podem ser encontrados mais facilmente do que propriedades interessantes de dados de entrada / saída individuais.

Vamos declarar um pouco mais formalmente: se temos x e f(x) , podemos realizar algumas transformações de x para obter x2 f(x2) . No caso do STT, basta verificar f(x) = f(x2) , mas podemos usar qualquer relacionamento entre os dois conjuntos de dados. Pode haver relações metamórficas como f(x2) > f(x) ou "é f(x2)/f(x) um valor inteiro". De maneira semelhante, esse princípio pode ser estendido a vários conjuntos de dados de entrada usando f(x) f(x3) . Um exemplo disso é comparar os resultados de um mecanismo de pesquisa sem filtros com os resultados de um mecanismo com um ou dois filtros. Na maioria das descrições de casos de uso que eu leio, apenas dois conjuntos de dados de entrada são usados, porque eles são suficientes para encontrar erros malucos.

Exemplos de uso


Falando em casos de uso: qual a eficácia do teste metamórfico na prática? Uma coisa é falar abstratamente de uma técnica ou dar exemplos artificiais. Os estudos de caso são úteis por três razões. Primeiramente, mostra se o método realmente funciona. Em segundo lugar, com eles, você pode aprender sobre as possíveis dificuldades ao usar o MT. Terceiro, os exemplos nos mostram como podemos usar a técnica. Qualquer conexão metamórfica usada no exemplo de uso pode ser tentada para se adaptar à solução de nossos problemas.

Teste metamórfico: uma revisão de desafios e oportunidades fornece uma lista de muitos estudos, mas todos são artigos científicos. Abaixo estão os mais interessantes. Os artigos marcados com (pdf) são apresentados, como você pode imaginar, em PDF.


O problema


Ah, então todas essas fontes estão em PDF.

Demorou várias horas para encontrar todos esses artigos. E esse problema está associado ao maior obstáculo ao desenvolvimento da MT: todos os links acima são pré - impressões ou primeiros rascunhos de futuros artigos científicos. Quando começo a entender técnicas pouco conhecidas, em primeiro lugar me pergunto: "por que elas são pouco conhecidas?" Às vezes a razão é óbvia, às vezes é um conjunto complexo de pequenas razões, às vezes o problema é simplesmente que a metodologia está “sem sorte”.

No caso do MT, o problema é óbvio. Quase todas as informações estão ocultas atrás do paywall científico. Se você deseja estudar o MT, precisa acessar o diário ou passar várias horas pesquisando as pré-impressões 3 .

Estudo adicional


O inventor do MT é Ty Chen . Ele se tornou a força motriz de muitos estudos. Outros pesquisadores nesta área são Zhi Quan Zhou e Sergio Segura ; os dois publicaram todas as suas pré-impressões na Internet. A maior parte do trabalho de pesquisa é realizada por uma dessas pessoas.

Provavelmente, o melhor lugar para começar é com testes metamórficos: uma revisão de desafios e oportunidades e uma pesquisa sobre testes metamórficos . Embora este artigo seja escrito sobre testes metamórficos, os pesquisadores também aplicaram relacionamentos metamórficos em geral a uma ampla variedade de outras disciplinas, por exemplo, verificação formal de código e depuração. Ainda não estudei essas áreas de aplicação da técnica em detalhes, mas provavelmente vale a pena examiná-las também.

Do ponto de vista da aplicabilidade, pode ser teoricamente possível adaptar a maioria das bibliotecas PBT para verificar propriedades metamórficas. De fato, o primeiro exemplo do Quickcheck é o teste de EM, e neste ensaio sobre PBT, o MS é aplicado indiretamente. Em geral, parece-me que a maioria das pesquisas PBT se concentra em gerar e aparar dados de entrada de maneira eficiente, e a pesquisa de MT se concentra principalmente em determinar o que realmente precisamos testar. Consequentemente, é provável que essas técnicas se complementem.

Agradecimentos a Brian Ng pela assistência à pesquisa.

Postscript: request


De fato, não surpreende que eu nunca tenha ouvido falar dessa técnica antes. Existem muitas técnicas realmente interessantes e úteis que não poderiam deixar sua pequena bolha. Descobri os MTs através da sorte, em vez de pesquisas ativas.

Se você souber algo que vale a pena usar amplamente, escreva-me .



  1. Bem, pode haver problemas óbvios: pode haver música no podcast, fragmentos de fala em outros idiomas etc. Mas a teoria é confiável: se conseguirmos obter amostras de fala, podemos usá-las como parte dos testes sem transcrição / marcação manual preliminar.
  2. Nas especificações, a ideia correspondente é hiperproperties - propriedades de conjuntos de comportamentos, em vez de comportamentos individuais. A maioria dos estudos hiperespecíficos está relacionada à segurança do HS. Pelo que entendi, seus HS são um superconjunto de MS.
  3. Eu tinha uma segunda hipótese, agora contestada: como a maioria dos principais pesquisadores da China e Hong Kong, talvez essa técnica seja mais conhecida nas comunidades de programadores que se comunicam em mandarim, em vez de em inglês. Brian Eun testou essa hipótese para mim, mas não encontrou nenhum sinal significativo do uso da técnica pelos chineses.

Source: https://habr.com/ru/post/pt454458/


All Articles