Como definir os parâmetros JVM para testes de unidade Junit?

95

Tenho alguns testes de unidade Junit que requerem uma grande quantidade de espaço de pilha para serem executados - ou seja, 1G. (Eles testam a funcionalidade que consome muita memória para um aplicativo webstart que só será executado com espaço de heap suficiente e será executado internamente em máquinas Win 7 de 64 bits - portanto, redesenhar os testes não é uma sugestão prática).

Estou desenvolvendo no Intellij IDEA, então sei que posso definir os parâmetros JVM (por exemplo, -Xmx1024M) para a classe de teste. No entanto, isso é apenas para executar toda a classe de teste - se eu quiser executar um teste individual, tenho que recriar as configurações de execução para esse método de teste.

Além disso, são IDE e específicos para cada caixa - portanto, se eu alternar entre as caixas (desenvolvo em várias máquinas) ou um dos meus colegas tentar executar os testes, essas configurações não serão transferidas. (Além disso, outros IDEs como Eclipse e NetBeans são usados ​​por meus colegas.) FWIW, estamos usando mercurial para controle de código-fonte.

Para o ciclo de construção, estamos usando o Maven, então sei como especificar os parâmetros JVM para isso.

Portanto: - Estou procurando uma maneira de especificar os parâmetros JVM que se aplicam a toda a classe de teste e aos métodos de teste individuais; e - Eu gostaria de compartilhar essas especificações entre IDEs em qualquer máquina (tendo obtido o código do repositório).

amaidment
fonte
Duvido que seja viável. Entre máquinas, para um determinado IDE, deve ser viável. Mas entre IDEs não vejo como.
JB Nizet
@JBNizet - Eu ficaria feliz em levar várias máquinas para um determinado IDE (desde que seja Intellij IDEA).
amaidment

Respostas:

48

No IntelliJ, você pode especificar as configurações padrão para cada configuração de execução. Na caixa de diálogo de configuração Executar / Depurar (aquela que você usa para configurar o heap por teste), clique em Padrões e JUnit . Essas configurações serão aplicadas automaticamente a cada nova configuração de teste JUnit. Eu acho que uma configuração semelhante existe para o Eclipse.

No entanto, não há uma opção simples para transferir essas configurações (pelo menos no IntelliJ) entre ambientes. Você pode enviar arquivos de projeto IntelliJ para o seu repositório: pode funcionar, mas eu não o recomendo.

Você sabe como configurá-los maven-surefire-plugin. Boa. Esta é a forma mais portátil (veja a resposta de Ptomli para um exemplo).

Para o resto - você deve se lembrar que os casos de teste JUnit são apenas um grupo de classes Java, não um programa independente. Cabe ao runner (que seja um runner JUnit autônomo, seu IDE, maven-surefire-plugindefinir essas opções. Dito isso, não há uma maneira "portátil" de defini-las, de modo que as configurações de memória são aplicadas independentemente do runner.

Para dar um exemplo: você não pode definir Xmxparâmetros ao desenvolver um servlet - cabe ao contêiner definir isso. Você não pode dizer: "este servlet sempre deve ser executado com Xmx=1G.

Tomasz Nurkiewicz
fonte
onde está a configuração Executar / Depurar? Não vejo isso nas preferências ou no menu de contexto quando executo o teste.
Dean Hiller
2
Observe que isso NÃO mudará as configurações de execução do JUnit existentes, apenas aquelas que são criadas após você alterar os padrões. Você tem que alterar os existentes manualmente.
MikeFHay
78

No Maven você pode configurar o plugin infalível

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-Xmx256M</argLine>
    </configuration>
</plugin>

Se você usar o Maven para compilações, essa configuração será carregada na árvore de origem e aplicada quando os testes forem realizados. Consulte a documentação do plug-in Maven Surefire .

ptomli
fonte
1
@ptomli - Sempre desconfio de comentários que começam com "Certamente ...". A integração do Intellij maven usa a configuração do plugin pom ao executar tarefas no ciclo de construção do maven. A execução dos testes de unidade no IDE é um processo separado e, por padrão, não tem conhecimento do processo de construção. Que eu saiba, não há como conectar isso - embora eu esteja feliz em saber o contrário. Isso é algo que você tem conhecimento / fez - nesse caso, você pode compartilhar como fazer?
amaidment
1
Não tenho certeza se isso é possível no Intellij. TBH, mesmo que fosse, eu não gostaria de usar essa abordagem, já que provavelmente, se estou executando os testes de unidade no IDE, quero aproveitar o depurador do IDE, o que não poderia fazer executando um teste mvn.
amaidment
5
Na verdade, a integração Maven do IntelliJ não usar a configuração Maven Surefire durante a execução de testes de unidade individuais. Usar a configuração do Maven acima fará com -Xmx256Mque seja passado para a linha de comando Java ao executar seus testes de unidade diretamente do IntelliJ. Isso só me deixou confuso :-(
Kkkev
1
Para sua informação: Netbeans também usa Maven Suefire para executar seus testes
Ferrybig
1
A integração do Maven do @Kkkev IntelliJ é diferente de executar um teste individual no IntelliJ. O primeiro usa uma configuração de execução do Maven (e portanto lê o argumento), o segundo usa uma configuração JUnit, TestNG ....
andresp
14

De acordo com esta pergunta de suporte https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

o argumento -Xmx para uma execução de teste IntelliJ junit virá do plug-in maven-surefire, se estiver definido.

Este snippet pom.xml

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>-Xmx1024m</argLine>
            </configuration>
        </plugin>

parece passar o argumento -Xmx1024 para a execução de teste junit, com IntelliJ 2016.2.4.

Mark K.
fonte
13

Concordo com os outros que disseram que não existe uma maneira simples de distribuir essas configurações.

Para Eclipse: peça a seus colegas para definir o seguinte:

  • Preferências do Windows / Java / JREs instalados:
  • Selecione o JRE / JDK adequado (ou faça isso para todos eles)
  • Editar
  • Argumentos de VM padrão: -Xmx1024m
  • Concluir, ok.

Depois disso, todos os testes serão executados com, -Xmx1024mmas infelizmente você os configurou em todas as instalações do Eclipse. Talvez você possa criar um pacote Eclipse customizado que contenha essa configuração e fornecê-lo a seus colegas de trabalho.

O seguinte processo de trabalho também pode ajudar: Se o IDE não puder executar um teste, o desenvolvedor deve verificar se o Maven pode executar esse teste ou não.

  • Se o Maven pudesse executá- lo, a causa da falha geralmente são as configurações do IDE do desenvolvedor. O desenvolvedor deve verificar essas configurações.
  • Se o Maven também não puder executar o teste, o desenvolvedor sabe que a causa da falha não é o IDE, portanto, ele pode usar o IDE para depurar o teste.
palacsinto
fonte
Dizer que o projeto precisa ser construído com o maven não ajuda muito. (Estamos apenas construindo com o maven.) No entanto, implícito em sua sugestão é que só devemos executar testes como parte do ciclo de construção do maven - geralmente usamos os mesmos testes para depuração no IDE. (Com a vantagem adicional de que, uma vez que algo foi depurado, é fácil manter esses testes no ciclo de compilação.)
amaidment
ok - mas agora você está apenas repetindo a resposta de Tomasz, mas com especificações do Eclipse ...
amaidment
2

Você pode usar systemPropertyVariables (java.protocol.handler.pkgs é o nome do seu argumento JVM):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <systemPropertyVariables>
            <java.protocol.handler.pkgs>com.zunix.base</java.protocol.handler.pkgs>
            <log4j.configuration>log4j-core.properties</log4j.configuration>
        </systemPropertyVariables>
    </configuration>
</plugin>

http://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html

sendon1982
fonte
1

Uma alternativa específica do eclipse limitada ao parâmetro java.library.path JVM permite defini-lo para uma pasta de origem específica, em vez de para todo o jdk, conforme proposto em outra resposta:

  1. selecione a pasta de origem na qual reside o programa a ser iniciado (geralmente source / test / java)
  2. digite alt enter para abrir a página de propriedades dessa pasta
  3. selecione nativo no painel esquerdo
  4. Edite o caminho nativo. O caminho pode ser absoluto ou relativo à área de trabalho, sendo o segundo mais resiliente às alterações.

Para aqueles interessados ​​em detalhes sobre por que a tag maven argline deve ser preferida a systemProperties, veja, por exemplo:

Pegue arquivos JNI nativos no teste Maven (lwjgl)

Paswar
fonte