2017-01-18 228 views
8

私は非常に小さなプロジェクト(依存関係の点で)で作業しています。ユニットテストを実行するときは、実際のテストを0.2秒間実行する前にJVMをロードするのに8秒かかります。JUnitの起動時間が遅い

私の環境:

  • Java 8
  • Spring Tool Suite 3.8.1.RELEASE
  • JUnit 4
  • Windows 8

私はこれがそう長く取るために引き起こしている私の環境で何かがなければならない恐怖、そして私は誰かがこれを前に見て、見つけたと思っています問題の原因とおそらく解決策? など。私のPATH環境変数が本当に長い場合、それはまったく問題になりますか? JUnitテストを実行するとどうなりますか?

私が実行しようとしている実際のテストは、次のとおりです。

public class TemplateLocationCalculatorTest { 

    private TemplateLocationCalculator target = new TemplateLocationCalculator(); 

    @Test 
    public void whenGivenRootReturnIndex(){ 
     Assert.assertEquals("index", target.calculate("/")); 
    } 
} 

とターゲットクラスです:

public class TemplateLocationCalculator { 

    public String calculate(String string) { 
     return "index"; 
    } 

} 

私は、これはいけないと言うとき、あなたは私と一緒に同意いただければ幸いですロードに時間がかかる

+1

@PieterDeBieしました。第二段落。 コンピュータハードウェアのパフォーマンスは問題ではありません。 – kinbiko

+0

読み込みが速すぎ、コメントを削除しました:) –

+1

8秒間の起動時に何が起こるかをプロファイルできますか?さまざまなJVMブートストラップイベントを記録するには、[この質問](http://stackoverflow.com/questions/39321345/how-do-i-Imasure-jvm-startup-time)に記載されている方法を試してください。 – apangin

答えて

2

OPはこちら。私はMicrosoft Process Monitorを使用し、フィルタリングのたくさん後、私はAVソフトウェアAvecto DefendPointは私のマシン上で実行されている、これがボトルネックだったようにそれが見えたということであったことを発見しsuggestion given in the chat

。私がテストを始めると、それは約25%で実行されます。これは私の4つのコアのうちの1つのスレッドでフルスピードで動作していることを示しているようです。私はこのマシンの管理者ではないので、この仮説を検証するために無効にすることはできませんでしたが、一般に、あなたのウイルス対策ソフトウェアである可能性がある場合、

-1

潜在的なreasonは、スタートアップ時のコンポーネントのスキャンと自動配線です。これは、hereのように、コンポーネントの検索スペースを制限するテスト用に別のconfigファイルを作成することで制限できます。あなたはどちらかlazy load beans<beans default-lazy-init="true">または明示的には豆を配線することができます設定で

は、

<beans ...> 
    <!-- this bean will be injected into the OrderServiceTest class --> 
    <bean id="target" class="TemplateLocationCalculator" /> 

    <!-- other beans --> 
</beans> 

(詳細hereで説明)次に、テストクラスで、私たちは、新しい設定ファイルを指定:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:/path/to/test-config.xml" }) 
public class TemplateLocationCalculatorTest { 

    @Autowired 
    private TemplateLocationCalculator target; 

    @Test 
    public void whenGivenRootReturnIndex(){ 
     Assert.assertEquals("index", target.calculate("/")); 
    } 

} 

@Bean 
public class TemplateLocationCalculator { 

    public String calculate(String string) { 
     return "index"; 
    } 

} 
+1

ここでは春が使用されていません。これはSpring Tool Suite(STS)です。または、単純で簡単なJUnitテストが実行されても、STSが自動実装されていることを意味しましたか? – Roland

+0

STSは、Spring IDEコンポーネントをプリインストールするプラグインです。 JUnitテストであっても、アプリケーションをビルドして実行する必要があるため、自動配線が実行されます。ここでのアイデアは、このプロセスを簡素化することです。 –

+0

ok ...私は、Springがここでは直接使用されていないことを意味しました。 STSが処理を遅くしているあなたの答えを解決するボンネットの下でいくつかの配線を行っているなら、すべてが問題ありません;-) – Roland