Execute um único método de teste com o maven


519

Eu sei que você pode executar todos os testes em uma determinada classe usando:

mvn test -Dtest=classname

Mas eu quero executar um método individual e -Dtest = classname.methodname parece não funcionar.


3
Eu também estaria interessado em saber como fazer isso. No entanto, se me vi fazendo isso com bastante frequência, acho que esse teste pode ser um candidato a ser dividido em sua própria classe, para que você possa usar a mvn test -Dtest=classnamesintaxe.
— 9139 John Paulett

Deseja saber como fazê-lo apenas pela linha de comando? Ou usar um IDE (eclipse) funcionaria para você?
— Diego Dias

1
Eu estava olhando para uma linha de comando. Eu acho que o plugin junit eclipse permitirá que você faça isso.
— 9159 BillMan

Fiz isso no Maven 1. Como me lembrei, isso envolvia fazer alterações no JUnit, responsável pela introspecção da classe de teste.
— Kdgregory

Respostas:


698

Para executar um único método de teste no Maven, você precisa fornecer o comando como:

mvn test -Dtest=TestCircle#xyz test

onde TestCircleé o nome da classe de teste e xyzé o método de teste.

Caracteres curinga também funcionam; no nome do método e no nome da classe.

Se você estiver testando em um projeto de vários módulos, especifique o módulo em que o teste está -pl <module-name>.

Para testes de integração, use a it.test=...opção em vez de test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test

4
Fixa o "não testes foram executados" erro por desclassificação para infalível 2.9
— QWERTY

15
Corrigi "Nenhum teste foi executado!" atualizando para 2.14:
— alfonx 17/03/2013

54
Se você estiver testando em um projeto com vários módulos, também precisará especificar o módulo em que o teste está -pl <module-name>.
— 19413 Jon

22
Use -DfailIfNoTests=falsepara pular projetos sem teste. No Tests Were Executedacontece quando você tenta executar o teste do projeto raiz e há módulos sem testes.
— Cherry

4
Este comando funciona !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Observe que "-DTest" começa com MAIÚSCULAS 'T'.
— vikas

25

Há um problema com o surefire 2.12. Foi o que aconteceu comigo ao mudar o maven-surefire-plugin de 2.12 para 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Resultado:
    [ERRO] Falha ao executar a meta org.apache.maven.plugins: maven-surefire-plugin: 2.12 : test (teste padrão) no projeto pmd: nenhum teste foi executado!

  2. mvn test -Dtest=DesignRulesTest

    Resultado: [INFO] --- maven-surefire-plugin: 2.11 : test (padrão-teste) @ pmd --- ... Executando net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Testes executados: 5 , Falhas: 0, erros: 0, ignorados: 4, tempo decorrido: 4.009 seg


5
Funciona novamente no 2.12.1 ou posterior.
— yurez

Corrigido "Nenhum teste foi executado!" atualizando para 2.14
— alfonx 17/03/2013

Se você usar @Category(IntegrationTest.class), use -Dit.test=ClassName, caso contrário, você ficará No tests were executed!atualizado com as versões mais recentes do plugin.
— uvsmtid

16

O que faço com meus casos de teste TestNG (desculpe, o JUnit não suporta isso) é que posso atribuir um grupo ao teste que quero executar

@Test(groups="broken")

E então simplesmente execute 'mvn -Dgroups = broken'.


1
Esta é uma boa resposta. No meu caso, o teste tentou executar, mas alguns componentes do Seam não foram configurados corretamente, portanto parece que isso também está ignorando uma parte do código de instalação.
— Chris Williams

1
Corrigir. Você precisa ambos os grupos de venda = quebrado em sua @BeforeMethod, ou @BeforeMethod (AlwaysRun = true)
— tunaranch

Por favor, deixe-me saber o que é grupo aqui, pois estou recebendo um problema de compilação.
— Paramesh Korrakuti

14

Executando um conjunto de métodos em uma única classe de teste Com a versão 2.7.3, você pode executar apenas n testes em uma única classe de teste.

NOTA: é suportado para junho 4.xe TestNG.

Você deve usar a seguinte sintaxe

mvn -Dtest=TestCircle#mytest test

Você também pode usar padrões

mvn -Dtest=TestCircle#test* test

A partir do surefire 2.12.1, você pode selecionar vários métodos (apenas o JUnit4X no momento, os patches são bem-vindos)

mvn -Dtest=TestCircle#testOne+testTwo test

Verifique este link sobre testes únicos


2
No meu caso eu tive que aspas duplas do TestClass # nome do teste como mvn -Dtest = "TestCircle # myTest" test
— Pratik Khadloya

@PratikKhadloya Alguma idéia de como funciona para testes dependentes? Digamos, eu tenho os métodos test1 (), test2 (), test3 () no TestClass e test2 depende do teste1. Como posso executar apenas test2 ()?
— Ziska 28/10

3
Acho que se você tem dependências entre os testes, está fazendo algo errado. Cada teste deve ser independente de outros testes. Você precisa remover o acoplamento entre eles.
— Pratik Khadloya

11

Você pode executar classes e métodos específicos de teste usando a seguinte sintaxe:

  1. pacote completo: mvn test -Dtest = "com.oracle.tests. **"

  2. todo o método em uma classe: mvn test -Dtest = CLASS_NAME1

  3. método único da classe única: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. método múltiplo de várias classes: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2


9

Este comando funciona !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testObserve que "-DTest" começa com MAIÚSCULAS 'T'.


4
Será que não trabalhar com SureFire 2.18.x; apenas executa todos os testes.
— Janaka Bandara

4

O parâmetro de teste mencionado por tobrien permite especificar um método usando um # antes do nome do método. Isso deve funcionar para JUnit e TestNG. Eu nunca tentei, basta lê-lo na página do Surefire Plugin :

Especifique este parâmetro para executar testes individuais pelo nome do arquivo, substituindo os parâmetros de inclusão / exclusão. Cada padrão que você especificar aqui será usado para criar um padrão de inclusão formatado como ** / $ {test} .java, para que você possa digitar "-Dtest = MyTest" para executar um único teste chamado "foo / MyTest.java". Este parâmetro substitui os parâmetros de inclusão / exclusão e o parâmetro TestNG suiteXmlFiles. desde 2.7.3 Você pode executar um número limitado de métodos no teste adicionando #myMethod ou # my * ethod. Tipo Si "-Dtest = MyTest # myMethod" suportado para junho 4.xe testNg


3

Novas versões do JUnit contêm o corredor Categorias: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Mas o procedimento de liberação do JUnit não é baseado em maven, portanto, os usuários maven precisam colocá-lo manualmente em seus repositórios.


1
Agradável. Mas não vejo como isso responde à pergunta.
— 22810 Pascal Thivent

2
Subj é suportada a partir 2.7.3 versão do Maven-infalível-plugin: maven.apache.org/plugins/maven-surefire-plugin/examples/...
— Andriy Plokhotnyuk

3

A partir da versão do plugin surefire 2.22.1 (possivelmente anterior), você pode executar o teste único usando a propriedade testnames ao usar o testng.xml

Dado um testng.xml a seguir

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="all-tests">
        <classes>
            <class name="server.Atest"/>
            <class name="server.Btest"/>
            <class name="server.Ctest"/>
        </classes>
    </test>
    <test name="run-A-test">
        <classes>
            <class name="server.Atest"/>
        </classes>
    </test>
    <test name="run-B-test">
        <classes>
            <class name="server.Btest"/>
        </classes>
    </test>
    <test name="run-C-test">
        <classes>
            <class name="server.Ctest"/>
        </classes>
    </test>
</suite> 

com o pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    [...]
    <properties>
        <selectedTests>all-tests</selectedTests>
    </properties>
    [...]
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
                <suiteXmlFiles>
                    <file>src/test/resources/testng.xml</file>
                </suiteXmlFiles>
                <properties>
                    <property>
                        <name>testnames</name>
                        <value>${selectedTests}</value>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
    [...]
</project>

Na linha de comando

mvn clean test -DselectedTests=run-B-test

Leitura adicional - plugin Maven surefire usando testng


-5

Você pode executar uma única classe de teste, mas não um único método dentro de uma classe de teste. Você usa o nome simples da classe e não o nome completo da classe. Portanto, se você tiver um teste em "org.sonatype.test.MyTest" e esse for o único teste que você deseja executar, sua linha de comando ficará assim:

mvn test -Dtest=MyTest

Testei a solução descrita nos comentários anteriores em um projeto de módulo único, portanto, o que este comentário está dizendo não é verdade.
— tonio 11/05

5
Pode ter sido verdade em 2009, quando foi respondida originalmente.
— flurdy

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.