ti-enxame.com

Quais estruturas de teste de unidade existem para Java?

Eu usei TestNG e JUnit. Que outras estruturas existem? O que os torna especiais e/ou diferentes dos demais?

7
codeyoung

Scala Especificações obtém meu voto! :-)

Specs é uma estrutura de teste de desenvolvimento orientado por comportamento escrito em Scala. Pode ser usado para escrever testes para Java e Scala. Foi inspirado em RSpec - um framework de teste muito popular no Ruby = mundo.


Um exemplo de teste escrito em Especificações:

import org.specs._

object ElementSpecification extends Specification {
  "A UniformElement" should {
    "have a width equal to the passed value" in {
      val ele = elem('x', 2, 3)
      ele.width must be_==(2)
    }

    "have a height equal to the passed value" in {
      val ele = elem('x', 2, 3)
      ele.height must be_==(3)
    }

    "throw an IAE if passed a negative width" in {
      elem('x', 2, 3) must throwA(new IllegalArgumentException)
    }
  }
}

Impressionante, não é? :-)

12
missingfaktor

Eu sugiro usar TestNG como estrutura de teste de unidade principal para Java, porque TestNG é mais avançado em teste de parametrização, teste de dependência e teste de suíte (conceito de agrupamento). TestNG destina-se a testes de alto nível e testes de integração complexos. Sua flexibilidade é especialmente útil com grandes suítes de teste. Além disso, o TestNG também cobre toda a funcionalidade principal do JUnit4. Simplesmente não há razão para eu usar o JUnit mais.

6
Sankar Ganesh

Um novo mundo de frameworks de teste para Java existe via JRuby. Por exemplo: Test :: Unit, RSpec, Shoulda, ZenTest, RSpec Mocks, Mocha e Cucumber.

Eu acho que é ótimo escrever Java testes na elegante linguagem Ruby. Claro, isso depende se você está no clima de ter várias linguagens em seu SCM.

2
Chiron

Eu posso recomendar scalacheck (facilmente confundido com scalatest).

Você escreve as especificações e a estrutura constrói os casos de teste aleatoriamente para você e, ao violar uma verificação, tentará simplificar o teste, para encontrar a maneira mais simples de falhar.

Amostra de código do site:

object StringSpecification extends Properties("String") {
  property("startsWith") = Prop.forAll((a: String, b: String) => (a+b).startsWith(a))

  // Is this really always true?
  property("concat") = Prop.forAll((a: String, b: String) => 
    (a+b).length > a.length && (a+b).length > b.length
  )

  property("substring") = Prop.forAll((a: String, b: String) => 
    (a+b).substring(a.length) == b
  )
}
2
user unknown

Se você precisar disso para escolher uma estrutura de teste de unidade, eu sugeriria o seguinte:

Escolha aquele que o resto da sua equipe usa.

Se sua equipe não usa um, ou você não tem um, use aquele que seu IDE suporta fora da caixa na configuração padrão.

Se você ainda não decidiu, comece com JUnit 4, que é o padrão de fato.

1
user1249

Com versões JUnit recentes, Hamcrest foi integrado à biblioteca. Hamcrest adiciona correspondências adicionais que melhoram a legibilidade, mas não alteram a semântica de seus testes. Portanto, pode ser um bom complemento para a configuração do teste.

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;

...

Person tom = new Person("Tom");
Person jerry = new Person("Jerry");

assertThat(tom, is(not(equalTo(jerry))));
0
BenR