Cobertura de código Scala

Nas ferramentas tradicionais de cobertura de código, a cobertura de linha tem sido a principal métrica. Isso é bom para linguagens como Java, que são muito prolixas e raramente têm mais de uma instrução por linha, e geralmente têm uma instrução espalhada por várias linhas.

Em linguagens poderosas e expressivas como Scala, muitas vezes várias instruções ou até mesmo ramos são incluídos em uma única linha, por exemplo, um exemplo muito simples:

if (age < 18) "No beer" else "Beer for you"

Se você tivesse um teste de unidade que executasse o valor 18, obteria 100% de cobertura de linha, mas só teria 50% de cobertura de instrução.

Vamos expandir este exemplo para ser multifacetado, embora um tanto artificial:

if (religion == "Pentecostalist") "No beer" else if (age < 18) "Underage" else "Beer for you"

Agora teríamos 100% de cobertura de código para passar os valores (“Buddist”, 34) porque algum código nessa linha teria sido executado.

Outras ferramentas de cobertura de código scala usam instrumentação de bytecode que contorna esse problema. Ferramentas como https://github.com/sbt/jacoco4sbt se integram muito bem com Scala e oferecem cobertura precisa, mas apresentam dois problemas.

  1. Scala gera muitos bytecodes com os quais você, como desenvolvedor de aplicativos, não se importa. Isso pode ser atenuado pela ferramenta que está sendo programada com casos a serem ignorados.
  2. Não há como voltar do bytecode para a fonte, pois Scala tem um nível de abstração muito mais alto do que o bytecode pode representar. Em Java, isso é menos problemático, pois está mais próximo de um mapeamento 1-1 de bytecode e construções de nível de origem.

Scoverage é uma ferramenta de cobertura de código que escrevi e está disponível no github e é licenciada pela Apache.
https://github.com/scoverage/scalac-scoverage-plugin

O foco está na cobertura de declarações e nem mesmo inclui a cobertura de linhas como métrica. Esta é uma mudança de paradigma que esperamos se torne popular. O projeto foi testado por alguns meses em um grande banco onde eu trabalhava, então espero que a maioria dos bugs tenham sido corrigidos. A saída é compatível com a cobertura, então deve encaixar na maioria das outras ferramentas, como o sonar.