1

私はEclipseでJUnitを使用して単体テストを作成してきましたが、JUnitの基本原則は明らかです。テストは正常に実行され、失敗したテストについて報告するための適切な方法を見つけるときが来ました。私がWebで遭遇するほとんどの例は、Ant、Maven、Hudsonなどのある種のビルドシステムを使用して、プロジェクトのビルドと同時にテストを実行していますが、ビルドプロセスでこの統合は必要ありません。テストは、ビルドシステムから独立して実行できる必要があります。最終的に、これらのシステムはJUnitから取得した情報を取得し、それを適切なHTMLレイアウトに配置します。

JUnitCoreのRunListenerクラスを介してカスタムリスナーを作成することでJUnit情報を読み取り、「testFailure」メソッドを使用して発生した障害を処理できることを学びました。テストを作成するとき、私は常にアサーションエラーのカスタムメッセージを提供しました。私の問題は、このメッセージがJUnitの障害トレースに表示されないことです。代わりに、障害トレースには「java.lang.Exception:couldnotinvoke*」と表示されます。コンソールを見ると、同じスタックトレースが表示されますが、以下に「Caused by:*」が前に付いた行が続き、ここにカスタムエラーメッセージが表示されます。

Caused by: java.lang.AssertionError: <my custom error message>
    at *

JUnitを使い始めたばかりで、これがJUnitの正常な動作なのか、テストの実装方法に問題があるのか​​わからないので、失敗トレースにカスタムメッセージを表示する必要がありますか?また、テストを実行するメソッドでアサーションエラーをキャッチすると、「error.getMessage()」を使用してメッセージにアクセスできることに気付きました。したがって、必要に応じて、これは解決策であり、エラーをキャッチしたときにアクセスできる追加情報(つまり、WebページのURLなど)をレポートに含めることができますが、すべてのアサーションの周りにtry-catchブロックを配置します私の意見ではその目的を打ち負かすでしょう。

私が言ったように、私は単体テストだけでなく、一般的なJava開発にも慣れていないので、いくつかのばかげた間違いを犯している可能性が非常に高いです。どんなポインタでも大歓迎です!

更新2:コンソール上 のスタックトレースの匿名化されたバージョンの下。多分それは私の質問を明確にするのに役立ちます。

    java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at xxxxx.xxxxxxxxxxxx.xxxxxxxxx(xxxxxxxxxxx.java:103)
        at xxxxx.xxxxxxxxxxxxxx.xxxxxx(xxxxxxxxxxx.java:62)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at xxxxx.xxxxxxxxxxxx.xxxxx(xxxxxxxxxxxx.java:90)
        at junit.framework.TestSuite.runTest(TestSuite.java:243)
        at junit.framework.TestSuite.run(TestSuite.java:238)
        at xxxxx.xxxxxxxxxxxxxxxxxxxx.xxxx(xxxxxxxxxxxxxxxx.java:87)
        at junit.framework.TestSuite.runTest(TestSuite.java:243)
        at junit.framework.TestSuite.run(TestSuite.java:238)
        at xxxxx.xxxxxxxxxxxxxxxxxxxxxx.xxxxx(xxxxxxxxxxxxxx.java:87)
        at junit.framework.TestSuite.runTest(TestSuite.java:243)
        at junit.framework.TestSuite.run(TestSuite.java:238)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    Caused by: java.lang.AssertionError: <xx my custom message xx>.
        at xxx.xxxxxxxx.xxxxxxxxxxxxxx(xxxxxxxx.java:100)
        ... 27 more

以下では、 JUnit java.lang.Exceptionによって報告されたスタックトレースの匿名バージョン :現在のページでアクションを呼び出すことができませんでした

java.lang.Exception: could not invoke action <xx action name xxx> on current page class xxxx.xxxxxxx: [Ljava.lang.StackTraceElement;@71d382ab
at xxxxx.xxxxxxxxxxxxxxxxx.xxxxx(xxxxxxxxxxxxxxxxxxxx.java:65)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at xxxxx.xxxxxxxxxxxxxxxxx.xxxxx(xxxxxxxxxxxxxxxxxxxx.java:90)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at xxxxx.xxxxxxxxxxxxxxxxx.xxxxx(xxxxxxxxxxxxxxxxxxxx.java:87)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at xxxxx.xxxxxxxxxxxxxxxxx.xxxxx(xxxxxxxxxxxxxxxxxxxx.java:87)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at org.junit.runner.JUnitCore.run(JUnitCore.java:136)
at org.junit.runner.JUnitCore.run(JUnitCore.java:117)
at xxxxx.<xx class that initiates the RunListener xx>.main(<xx class that initiates the RunListener xx>.java:11)
4

1 に答える 1

1

テストは、ビルドシステムから独立して実行できる必要があります。

ビルドシステムを使用している場合でも、テストは独立しています。その目的は長期的にあなたの生活を楽にすることですので、私はあなたがそれを使うことを検討することを提案します。ディレクトリのようなものをレイアウトする方法を教えてくれるので、最初は気に入らなかったMavenを提案しますが、これであなたの生活が楽になることがわかりました。

コンソールを見ると、同じスタックトレースが表示されますが、以下に「Caused by:*」が前に付いた行が続き、ここにカスタムエラーメッセージが表示されます。

ほとんどのツールはこれを削除するため、必要なものだけが表示されます。たとえば、ほとんどのIDEでは、スタックトレースをクリックして、問題の原因となっているコード行に移動できます。Mavenを使用する場合、IDEはMaven構成と同期するため、責任のあるコードを見つけることができます。

また、テストを実行するメソッドでアサーションエラーをキャッチすると、「error.getMessage()」を使用してメッセージにアクセスできることに気付きました。

MavenやIDEを使用している場合は、これを行う必要はありません。

私はいくつかの愚かな間違いを犯している可能性が非常に高いです。

そうではないようです。ほとんどの開発者が使用するツール(IDEやMavenなど)を使用することをお勧めします。これらの問題のほとんどは自動的に処理されます。(また、あなたがそれがあなたのためにしたことをあなたが決して知らないかもしれない他の多くの問題;)

于 2012-07-31T08:10:23.873 に答える