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.

BillMan
fonte
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
Mudit Srivastava
fonte
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

Duccio Fabbri
fonte
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'.

tunaranch
fonte
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

Prasanth Kumar Diddi
fonte
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

Nazmul Hoque Shafin
fonte
9

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

vikas
fonte
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

Wesley Hartford
fonte
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.

Andriy Plokhotnyuk
fonte
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

bsk
fonte
-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
Tim O'Brien
fonte
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
-9

Que eu saiba, o plugin surefire não fornece nenhuma maneira de fazer isso. Mas fique à vontade para abrir um problema :)

Pascal Thivent
fonte