На прошлой неделе я провел некоторое исследование GWT, как его тестировать и варианты покрытия кода для тестов, расширяющих
GWTTestCase . Я сделал это потому, что обнаружил, что большинство написанных мною тестов GWT должны расширять GWTTestCase, и я хотел бы иметь отчеты о покрытии кода. Читайте ниже для получения дополнительной информации о моих выводах для тестирования классов GWT.
Есть довольно много статей о тестировании GWT-приложений. Вот несколько примеров:
- Test-First GWT
- Разработка через тестирование для кода GWT UI
- Разработка на основе тестирования для пользовательского интерфейса GWT с асинхронным RPC
- Включение тестовой разработки в коде клиента GWT
- JUnit тесты для виджетов — поток о том, какие компоненты тестировать.
Основная суть этих статей заключается в том, что вы должны структурировать свой код, чтобы сделать основные функциональные возможности вашего приложения тестируемыми без необходимости зависеть от GWTTestCase.
Все они также рекомендуют использовать шаблон MVC или MVP (Model View Presenter). В настоящее время я использую GXT и его MVC Framework. К сожалению, MVC GXT не имеет много документации . Хорошая новость заключается в том, что есть хорошая статья, которая достаточно объяснила, что я смог реорганизовать свой проект, чтобы использовать его.
Неудачной стороной этого рефакторинга было то, что я обнаружил, что классы, которые расширяют GXT MVC Framework , должны тестироваться с GWTTestCase . Недостатком расширения GWTTestCase является сложность создания отчетов о покрытии кода.
В выпуске 799 GWT есть некоторые исправления, которые должны сделать возможным покрытие кода. Я попытался реализовать покрытие кода с помощью Eclipse и EclEmma, используя этот README , но не получилось. В процессе, я обнаружил проблему с Eclipse 3.4 и JUnit на OS X . Возврат к Eclipse 3.3 решил эту проблему, но я все еще не мог заставить EclEmma работать с GWT .
После неудачи с Eclipse я попытался использовать плагин emma-maven-plugin. Я также был не в состоянии заставить это работать, с моими результатами, зарегистрированными в этой теме .
Наконец, мне повезло с работой встроенной функции покрытия кода в IDEA. Однако после того, как он заработал один раз, он не работал до конца дня, и с тех пор я не добился успеха.
Покрытие кода и GWT
Из-за этих проблем с GWT 1.5 и покрытия кода, я думаю, я подожду до GWT 1.6, чтобы беспокоиться об этом. Хорошая новость — 1.6 M1 был выпущен в прошлую пятницу . Если продолжение использования GWTTestCase становится проблемой, я могу написать свою собственную MVC Framework, которая не использует классы, которые вызывают собственный JavaScript. Надеемся, что фреймворк GXT MVC послужит хорошим примером.
В дополнение к попыткам заставить работать покрытие кода, я использовал интернет, чтобы выяснить, как запускать тесты GWT внутри Eclipse и IDEA. Я не помню, какие ресурсы использовал, но, надеюсь, эта обновленная документация поможет другим. Хорошая вещь об использовании IDE для запуска этих тестов состоит в том, что они обычно выполняются намного быстрее.
Выполнение тестов GWT в Eclipse
Вы должны быть в состоянии выполнить большинство ваших тестов GWT из Eclipse, используя следующие шаги.
- Щелкните правой кнопкой мыши по тесту, который расширяет GWTTestCase, и выберите « Запуск от имени» > « Тест JUnit» . Скорее всего, вы увидите сообщение об ошибке ниже.
Invalid launch configuration: -XstartOnFirstThread not specified.
On Mac OS X, GWT requires that the Java virtual machine be invoked with the
-XstartOnFirstThread VM argument.
Example:
java -XstartOnFirstThread -cp gwt-dev-mac.jar com.google.gwt.dev.GWTShell - Чтобы исправить эту ошибку, перейдите в Run > Open Run Dialog . Нажмите на вкладку Аргументы и добавьте следующие значения. 2-е значение — увеличить объем памяти, доступной для теста, и избежать ошибки OOM.
-XstartOnFirstThread -Xmx512M
- При повторном запуске теста вы, вероятно, увидите следующую ошибку:
com.google.gwt.junit.JUnitFatalLaunchException: The test class 'org.richresume.client.home.HomeControllerGwtTest'
was not found in module 'org.richresume.client.Application'; no compilation unit for that type was seen
at com.google.gwt.junit.JUnitShell.checkTestClassInCurrentModule(JUnitShell.java:193)
at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:628)
at com.google.gwt.junit.JUnitShell.runTest(JUnitShell.java:150)
at com.google.gwt.junit.client.GWTTestCase.runTest(GWTTestCase.java:219) - To fix this, open the Run Dialog again, click on the Classpath tab and click on User Entries. Click on the Advanced button and select Add Folders. In the Folder Selection dialog, select your source and test directories (e.g. src/main/java and src/test/java).
- Run the test again and you should see a green bar in your JUnit tab.
- To create a JUnit configuration that runs all tests, duplicate the previously mentioned run configuration. Then change the name to «All Tests» and select the 2nd radio button to run all tests in the project.
- Click Run to execute all the tests in the project.
Running GWT Tests in IDEA
You should be able to run your GWT tests from within IDEA using the following steps.
- Right-click on a test that extends GWTTestCase and go to Run «TestNameGwtTes…». It’s likely you will see the error message below.
Invalid launch configuration: -XstartOnFirstThread not specified.
On Mac OS X, GWT requires that the Java virtual machine be invoked with the
-XstartOnFirstThread VM argument.
Example:
java -XstartOnFirstThread -cp gwt-dev-mac.jar com.google.gwt.dev.GWTShell - If you get a compiler error instead, you may need to add the GWT Facet to your project. To do this, right-click on your project’s top-most folder in the left pane. Select Module Settings > Facets and enable GWT for your module.
- To fix the -XstartOnFirstThread issue, go to Run > Edit Configurations. Add the following values to the VM Arguments field. The 2nd value is to increase the amount of memory available to the test and avoid an OOM error.
-XstartOnFirstThread -Xmx512M
NOTE: If you still get a compiler error, see this page for a possible solution. - Run the test again and you should see a green bar in your Run tab.
- To create a JUnit configuration that runs all tests, duplicate the previously mentioned run configuration. Then change the name to «All Tests» and change the Test configuration to search for tests in the whole project.
- Run the new configuration to execute all the tests in the project.
Testing GWT applications isn’t as straightforward as writing JUnit tests, but I do believe it’s getting better. If you have any additional tips and tricks, please let me know.
From http://raibledesigns.com/rd/entry/testing_gwt_applications