Pergunta

Como você automatizar integração testar ? Eu uso JUnit para alguns destes testes. Esta é uma das soluções ou é totalmente errado? O que você sugere?

Foi útil?

Solução

JUnit funciona. Não há limitações que restringem-lo de ser apenas testes de unidade. Nós usamos JUnit, Maven e CruiseControl para fazer CI.

Pode haver ferramentas que são específicas para testes de integração, mas eu acho que a sua utilidade depende de que tipo de componentes do sistema que está integrando. JUnit vai funcionar bem para ensaios não tipo interface do usuário.

Outras dicas

Eu usei JUnit para fazer um monte de testes de integração. Integração teste pode, é claro, significar muitas coisas diferentes. Para mais testes de integração de nível de sistema, eu prefiro deixar scripts de conduzir o meu processo de teste a partir do exterior.

Aqui está uma abordagem que funciona bem para mim para aplicações que usam http e bancos de dados e eu quero verificar toda a pilha:

  1. Use Hypersonic or H2 no modo em memória como um substituto para o banco de dados (isso funciona melhor para ORMs)
  2. Inicializar o banco de dados em @BeforeSuite ou equivalente (de novo: mais fácil com ORMs)
  3. Use Jetty iniciar um servidor web dentro do processo.
  4. @Before cada teste, limpar o banco de dados e inicializar os dados necessários
  5. Use JWebUnit para executar solicitações HTTP para a Jetty

Isto dá-lhe testes de integração que podem ser executados sem qualquer configuração de banco de dados ou aplicativo de servidor e que exerce a pilha de http para baixo. Uma vez que não possui dependências de recursos externos, este teste funciona muito bem no servidor de compilação.

Aqui alguns do uso de código I:

@BeforeClass
public static void startServer() throws Exception {
    System.setProperty("hibernate.hbm2ddl.auto", "create");
    System.setProperty("hibernate.dialect", "...");
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setJdbcUrl("jdbc:hsqldb:mem:mytest");
    new org.mortbay.jetty.plus.naming.Resource(
             "jdbc/primaryDs", dataSource);


    Server server = new Server(0);
    WebAppContext webAppContext = new WebAppContext("src/main/webapp", "/");
    server.addHandler(webAppContext);
    server.start();
    webServerPort = server.getConnectors()[0].getLocalPort();
}

// From JWebUnit
private WebTestCase tester = new WebTestCase();

@Before
public void createTestContext() {
    tester.getTestContext().setBaseUrl("http://localhost:" + webServerPort + "/");
    dao.deleteAll(dao.find(Product.class));
    dao.flushChanges();
}

@Test
public void createNewProduct() throws Exception {
    String productName = uniqueName("product");
    int price = 54222;

    tester.beginAt("/products/new.html");
    tester.setTextField("productName", productName);
    tester.setTextField("price", Integer.toString(price));
    tester.submit("Create");

    Collection<Product> products = dao.find(Product.class);
    assertEquals(1, products.size());
    Product product = products.iterator().next();
    assertEquals(productName, product.getProductName());
    assertEquals(price, product.getPrice());
}

Para aqueles que gostaria de saber mais, eu escrevi um artigo sobre testes de integração incorporado com Jetty e JWebUnit em Java.net.

Ao usar Maven para construir um projeto, eu tive um pouco mais de sorte com TestNG porque tem @BeforeSuite e operações @AfterSuite . Que são úteis porque Maven não irá executar o 'pós-integração-test` se algum dos testes de integração falhar. Não é um problema com Ant, então eu só usar jUnit fora de preferência com ele.

Em ambos os casos, a segmentação dos ensaios tanto TestNG e JUnit fazer é útil com testes de integração também.

Em nosso trabalho aqui, a nossa solução de teste de integração tem três partes principais:

  1. CruiseControl é o fundamento da nossa metodologia de integração contínua.
  2. A nossa CruiseControl configuração inicia uma build-teste rápido dentro de 3 minutos de qualquer um do check-in para Subversion . Os testes que acontecem aqui são "faz tudo ainda compilar?" e "fazer os testes de unidade tudo ainda passar?". JUnit é, obviamente, o principal facilitador em responder às segunda questões.
  3. A cada hora, ele começa uma construção maior, que constrói a ajuda on-line e instaladores que usamos em nossas várias plataformas de implantação. Esta etapa verifica os maiores questões de "ainda temos um produto implementável para cada uma de nossas plataformas de destino?"

O resultado final é que a maioria das pessoas aqui nunca se preocupar com testes de integração: ele simplesmente acontece. O teste de unidade, por outro lado, é prioridade de todos. JUnit torna mais fácil para construir testes, embora boa testes sempre exigem o pensamento e tempo de desenvolvimento.

Sim, você pode usar JUnit para testes de integração, mas isso depende do tipo de teste de integração que você precisa.

Testing um servlet:

  • configurar o contexto de servlet e de configuração
  • fazer os testes usando pedidos servlet simulada (Primavera tem suporte para isso, mas você também pode usar EasyMock ou suas próprias simulações)

Testando um aplicativo primavera:

  • uso AbstractDependencyInjectionSpringContextTests para configurar o contexto
  • testar o feijão com fio
  • também existem subclasses de AbstractDependencyInjectionSpringContextTests apoio manipulação de transações ao testar com um banco de dados.

Mas puro JUnit tem seu limite. Testando interfaces de usuário é um caso típico. Você pode usar o selênio para aplicações web, SoapUI para webservices ou outras ferramentas adequadas.

Mas o que você usar, deve ser possível integrá-lo em sua construção continious (controle de cruzeiro, cidade equipe ou qualquer outro).

Definitivamente! Usamos uma combinação de JUnit, tarefas Ant para executá-los e Hudson para continuar os testes de integração. Funciona como um encanto.

A sugestão depende da sua aplicação e seu objetivo.

Eu escrevi testes de integração em JUnit, mas eu também vi as pessoas usam HtmlUnit (extensão JUnit), Selenium, Watir, Fit / Fitness, e até mesmo ferramentas comerciais como WinRunner e seda.

Assim nos contar um pouco mais sobre o seu domínio e os objetivos de seus testes e provavelmente você pode obter uma resposta melhor.

Há uma muito boa extensão para JUnit chamado Jitr.

Jitr é um JUnit Integração Test Runner e permite que seus testes de integração de aplicações web de forma fácil correr contra um container web leve na mesma JVM como seus testes.

Veja seu site para obter mais detalhes: http://www.jitr.org/

Atualização para 2012:. Enquanto JUnit pode ser usado (e beneficia de apoio CI) JWebUnit e selênio parecem estar comendo o mindshare para testes de integração

Eu acho que testes de automação e integração não jogar bem juntos . O problema básico é configuração do ambiente antes de cada teste. O teste mais do tipo de integração é necessária configuração maior.

Os meus pensamentos sobre a automação de teste sobre camada de integração: http://blog.aplikacja.info/2012/03/whats-wrong-with-automated-integration-tests/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top