Como os testes de unidade do Guava foram gerados automaticamente?

31

A goiaba tem casos de teste de unidade gerados automaticamente :

A goiaba possui um número impressionante de testes de unidade: em julho de 2012, o pacote goava-tests inclui mais de 286.000 casos de teste individuais. A maioria deles é gerada automaticamente , não escrita à mão, mas a cobertura de teste do Guava é extremamente completa, especialmente para com.google.common.collect.

Como eles foram gerados? Quais técnicas e tecnologias foram usadas para projetá-las e gerá-las?

dzieciou
fonte
Lembro-me de ter visto uma conversa de algum cara do Google que tocou nesse assunto. Nenhuma pista sobre o nome, porém, a conversa era em algum convenção java eu acho
Zavior
3
o pacote com.google.common.collect.testing possui muitas classes com "Generator" em seus nomes - fazendo com que pareça uma estrutura para a geração de testes. Também existem subpacotes com classes documentadas como "esqueletos" ou "classes base" para testes ... #
3013
1
@gnat Sim, eu tinha certeza que já vi em algum lugar. com.google.common.collect.testing.features, por exemplo, mostra as características / restrições que uma classe de coleção deve satisfazer e um caso de teste é uma combinação delas. Dessa forma, eles podem parametrizar testes
dzieciou
Você pode ter mais sorte em Software Quality Assurance e Testing.SX
Reintegrar Monica - M. Schröder
A pergunta recebeu muita atenção da comunidade, mas nenhuma resposta razoável até agora, então segui a sugestão de Martin e a coloquei aqui: sqa.stackexchange.com/questions/5214/… .
dzieciou

Respostas:

8

Uma grande parte dessa massa de testes é para as implementações da coleção Guava. Eles escreveram testes genéricos que testam exaustivamente as interfaces de coleta, e isso gera um conjunto por implementação. Veja, por exemplo, aulas de chamadas CollectionAddAllTester, ListIndexOfTester.

Tudo isso é apoiado por uma biblioteca chamada testlib, que é fornecida como parte do Guava. Isso é bastante genérico. Ele suporta a gravação de testes genéricos para qualquer interface (não apenas coleções). Você pode especificar Features de possíveis implementações e testá-las (por exemplo, se seu conjunto não for modificável, você espera um resultado diferente set.add()) e, ao executar os testes, especifica quais recursos sua implementação suporta.

É baseado no JUnit 3, não no 4. Normalmente, você tem uma classe que se estende TestCasecheia de métodos nomeados testSomething(), e o JUnit os executa de forma reflexiva. A biblioteca testlib se conecta à execução desses testes para que o ciclo de vida seja assim:

  • Para cada implementação que você deseja testar
  • Para cada método de teste (aplicável)
  • Crie a TestCaseinstância
  • Inicialize a TestSubjectGenerator- esta é a interface testlib que você estende onde realmente cria o assunto do teste
  • Execute reflexivamente o método de teste. Durante esse método, getSubjectGenerator()dá acesso ao sujeito do teste

O bit principal é a etapa de inicialização extra que permite injetar um assunto de teste específico no caso de teste genérico.

Eu escrevi um post sobre como escrever TestLib suites geradoras para suas próprias interfaces.

(Também publicado na mesma pergunta no site sqa .)

Joe Kearney
fonte
6

Existem geradores de teste de unidade. Por exemplo, no mundo .NET, algo como o Microsoft Pex poderia fazer isso.

Por exemplo, o Microsoft Pex tenta, com base na análise de código, todos os valores possíveis como argumentos para um método. Alguns argumentos devem deixar o método lançar uma exceção. Essas coisas podem testar automaticamente criadas para. Valores estáticos, como uma string vazia retornada em certos casos, também podem ser testados automaticamente.

Sebazzz
fonte
2
Esse é um teste aleatório útil apenas para testes de caminho negativo (exceções, entrada inválida, falha-es, tempo limite). Acredito que eles geraram testes também para o caminho feliz, e isso requer mais design, não apenas o lançamento da ferramenta de análise estática.
dzieciou
E eu sei que existem maneiras e ferramentas para a geração de teste para caminho feliz (por exemplo, veja esta resposta ), mas eu estou interessado como isso foi feito, em particular caso de Goiaba
dzieciou