Я создавал модульные тесты, используя JUnit в Eclipse, и основные принципы JUnit мне ясны. Тесты выполняются так, как должны, и теперь пришло время найти хороший способ сообщить о неудачных тестах. В большинстве примеров, которые я встречаю в Интернете, используется какая-то встроенная система, такая как Ant, Maven или Hudson, для запуска тестов одновременно с созданием проекта, но эта интеграция не требуется в процессе сборки. Тесты должны иметь возможность запускаться независимо от системы сборки. В конце концов, эти системы просто берут информацию, которую они получают от JUnit, и помещают ее в красивый макет HTML.
Я узнал, что информацию JUnit можно прочитать, создав пользовательский прослушиватель с помощью класса RunListener JUnitCore и обрабатывать сбои по мере их возникновения с помощью метода testFailure. При создании своих тестов я всегда предоставлял собственное сообщение об ошибках утверждения. Моя проблема в том, что это сообщение не отображается в трассировке сбоев JUnit. Вместо этого трассировка сбоя будет показывать «java.lang.Exception: не удалось вызвать *». Когда я смотрю на консоль, я вижу ту же трассировку стека, но ниже также следует строка, которой предшествует «Вызвано: *», и здесь я вижу свое собственное сообщение об ошибке.
Caused by: java.lang.AssertionError: <my custom error message>
at *
Поскольку я только начинаю работать с JUnit и не знаю, является ли это нормальным поведением JUnit или что-то не так в том, как я реализовал свои тесты, и должен ли я просто видеть свои пользовательские сообщения в трассировке сбоев? Я также заметил, что когда я обнаруживаю ошибку утверждения в методе, в котором я выполняю тест, я МОГУ получить доступ к сообщению, используя «error.getMessage()». Поэтому, если необходимо, это было бы решением, а также позволило бы мне включить в отчет дополнительную информацию, доступную в тот момент, когда я поймал ошибку (например, 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)