私は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)