Spring Boot + npm + Geb で入力フォームを作ってテストする ( その82 )( Gradle を 4.8.1 → 5.3.1 へ、Spring Boot を 2.0.4 → 2.1.4 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Gradle を 4.8.1 → 5.3.1 へ、Spring Boot を 2.0.4 → 2.1.4 へバージョンアップします。
- 依存関係にあるモジュールも一部を除き最新バージョンにバージョンアップします。
参照したサイト・書籍
目次
手順
Gradle を 4.8.1 → 5.3.1 へバージョンアップする
build.gradle の wrapper タスクの記述を以下のように変更します。
wrapper {
gradleVersion = "5.3.1"
distributionType = Wrapper.DistributionType.ALL
}
gradleVersion = "4.8.1"
→gradleVersion = "5.3.1"
に変更します。
コマンドプロンプトから gradlew wrapper --gradle-version=5.3.1
、gradlew --version
コマンドを実行します。
gradlew --version
コマンド実行時にファイルをダウンロードしていることを示す "Downloading" のメッセージが表示されませんでした。。。? gradlew wrapper
コマンドを実行してみると build.gradle にエラーがあるというメッセージが表示されます。
build.gradle の修正と gradlew wrapper
コマンドを繰り返し、最終的には build.gradle の以下の点を変更しました。
plugins { id "java" id "eclipse" id "idea" id "org.springframework.boot" version "2.0.4.RELEASE" id "io.spring.dependency-management" version "1.0.6.RELEASE" id "groovy" id "net.ltgt.errorprone" version "0.0.14" id "checkstyle" id "com.github.spotbugs" version "1.6.9" id "pmd" id "com.moowork.node" version "1.2.0" id "com.gorylenko.gradle-git-properties" version "1.5.1" // Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする // id "com.github.johnrengelman.processes" version "0.5.0" id "com.energizedwork.webdriver-binaries" version "1.4" } .......... // Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする //// for Geb + Spock Integration Test //task startServer(type: com.github.jengelman.gradle.plugins.processes.tasks.JavaFork) { // jvmArgs = [ // "-Dspring.profiles.active=develop", // "-Dlogging.level.root=OFF", // "-Dlogging.level.org.springframework.web=OFF", // "-Dlogging.level.jdbc.sqlonly=OFF", // "-Dlogging.level.jdbc.sqltiming=OFF", // "-Dlogging.level.jdbc.audit=OFF", // "-Dlogging.level.jdbc.resultset=OFF", // "-Dlogging.level.jdbc.resultsettable=OFF", // "-Dlogging.level.jdbc.connection=OFF" // ] // classpath += sourceSets.main.runtimeClasspath // main = "${mainClass}" // doLast { // Thread.sleep(15000) // } //} //task stopServer { // doLast { // startServer.processHandle.abort() // } //} webdriverBinaries { chromedriver "73.0.3683.68" geckodriver "0.24.0" } def drivers = ["chrome", "firefox"] drivers.each { driver -> task "${driver}Test"(type: Test) { // 前回実行時以降に何も更新されていなくても必ず実行する outputs.upToDateWhen { false } systemProperty "geb.env", driver exclude "ksbysample/**" // Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする // dependsOn startServer // finalizedBy stopServer } } task gebTest { dependsOn drivers.collect { tasks["${it}Test"] } enabled = false } ..........
- SpotBugs の gradle plugin が 1.6.2 だと Gradle 5.3.1 に対応していないようなので 1.6.9 にバージョンアップしました。plugins block で
id "com.github.spotbugs" version "1.6.2"
→id "com.github.spotbugs" version "1.6.9"
に変更しています。 - gradle-processes plugin の設定を記載している箇所でエラーが発生し、API changes with Gradle 5.3 という Issue も作成されていました。Gradle 5.3 で gradle-processes plugin が呼び出している internal API の仕様が変わったようです。gradle-processes plugin の設定を全てコメントアウトします。
これで gradlew wrapper
コマンドが正常終了するようになりました。また gradlew、gradlew.bat に DEFAULT_JVM_OPTS の設定が追加されたので set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
→ set DEFAULT_JVM_OPTS="-Xmx4096m" "-Xms4096m"
に変更します。
gradle/wrapper/gradle-wrapper.properties は以下の内容になります。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新した後、clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると "BUILD SUCCESSFUL" のメッセージが出力されました。
Spring Boot を 2.0.4 → 2.1.4 へバージョンアップする
以下の方針でバージョンアップします。
- Spring Boot を 2.0.4 → 2.1.4 にバージョンアップする。
- Gradle の Plugin も com.github.spotbugs 以外は最新バージョンにする。
- SpotBugs は gradle plugin(com.github.spotbugs) は 1.6.9、本体は 3.1.11 にする。
- error-prone は現状維持。バージョンアップは JDK 11 に上げる時に行う。
- checkstyle, pmd は後回し。
- JUnit 5 の導入は後回し。
build.gradle の以下の点を変更します。
buildscript { ext { group "ksbysample" version "2.1.4-RELEASE" } repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } } plugins { id "java" id "eclipse" id "idea" id "org.springframework.boot" version "2.1.4.RELEASE" id "io.spring.dependency-management" version "1.0.7.RELEASE" id "groovy" id "net.ltgt.errorprone" version "0.0.14" id "checkstyle" id "com.github.spotbugs" version "1.6.9" id "pmd" id "com.moowork.node" version "1.3.1" id "com.gorylenko.gradle-git-properties" version "2.0.0" // Gradle 5.3 で internal API が変更されて gradle-processes が動かなくなったのでコメントアウトする // id "com.github.johnrengelman.processes" version "0.5.0" id "com.energizedwork.webdriver-binaries" version "1.4" } .......... configurations { // annotationProcessor と testAnnotationProcessor、compileOnly と testCompileOnly を併記不要にする testAnnotationProcessor.extendsFrom annotationProcessor testImplementation.extendsFrom compileOnly // for Doma 2 domaGenRuntime } .......... spotbugs { // SpotBugs のレポートファイルは Firefox で見ると文字化けしない toolVersion = "3.1.11" ignoreFailures = true effort = "max" excludeFilter = file("${rootProject.projectDir}/config/spotbugs/spotbugs-exclude-filter.xml") spotbugsTest.enabled = false } tasks.withType(com.github.spotbugs.SpotBugsTask) { reports { xml.enabled = false html.enabled = true } } pmd { toolVersion = "6.6.0" sourceSets = [project.sourceSets.main] ignoreFailures = true consoleOutput = true ruleSetFiles = rootProject.files("/config/pmd/pmd-project-rulesets.xml") ruleSets = [] } pmdMain { def backupLoggerLevel doFirst { backupLoggerLevel = logger.context.level logger.context.level = LogLevel.QUIET } doLast { logger.context.level = backupLoggerLevel } } .......... dependencies { def spockVersion = "1.3-groovy-2.4" def domaVersion = "2.24.0" def lombokVersion = "1.18.6" def errorproneVersion = "2.3.1" def powermockVersion = "2.0.0" def seleniumVersion = "3.13.0" def spotbugsVersion = "3.1.11" // dependency-management-plugin によりバージョン番号が自動で設定されるもの // Appendix F. Dependency versions ( https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/html/appendix-dependency-versions.html ) 参照 implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-freemarker") implementation("org.springframework.boot:spring-boot-starter-mail") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-actuator") runtimeOnly("org.springframework.boot:spring-boot-devtools") implementation("org.springframework.session:spring-session-core") implementation("org.springframework.session:spring-session-jdbc") implementation("org.codehaus.janino:janino") implementation("org.flywaydb:flyway-core") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.security:spring-security-test") testImplementation("org.yaml:snakeyaml") // dependency-management-plugin によりバージョン番号が自動で設定されないもの、あるいは最新バージョンを指定したいもの implementation("com.integralblue:log4jdbc-spring-boot-starter:1.0.2") implementation("com.h2database:h2:1.4.192") implementation("com.github.rozidan:modelmapper-spring-boot-starter:1.0.0") implementation("com.google.guava:guava:27.1-jre") implementation("org.apache.commons:commons-lang3:3.8.1") testImplementation("org.dbunit:dbunit:2.6.0") testImplementation("org.assertj:assertj-core:3.12.2") testImplementation("org.spockframework:spock-core:${spockVersion}") testImplementation("org.spockframework:spock-spring:${spockVersion}") testImplementation("org.jsoup:jsoup:1.11.3") testImplementation("com.icegreen:greenmail:1.5.10") // for lombok annotationProcessor("org.projectlombok:lombok:${lombokVersion}") compileOnly("org.projectlombok:lombok:${lombokVersion}") // for Doma annotationProcessor("org.seasar.doma:doma:${domaVersion}") implementation("org.seasar.doma:doma:${domaVersion}") domaGenRuntime("org.seasar.doma:doma-gen:${domaVersion}") domaGenRuntime("com.h2database:h2:1.4.192") // for Error Prone ( http://errorprone.info/ ) errorprone("com.google.errorprone:error_prone_core:${errorproneVersion}") compileOnly("com.google.errorprone:error_prone_annotations:${errorproneVersion}") // PowerMock testImplementation("org.powermock:powermock-module-junit4:${powermockVersion}") testImplementation("org.powermock:powermock-api-mockito2:${powermockVersion}") // for Geb + Spock testImplementation("org.gebish:geb-spock:2.3.1") testImplementation("org.seleniumhq.selenium:selenium-chrome-driver:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-firefox-driver:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-support:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-api:${seleniumVersion}") testImplementation("org.seleniumhq.selenium:selenium-remote-driver:${seleniumVersion}") // for SpotBugs compileOnly("com.github.spotbugs:spotbugs:${spotbugsVersion}") compileOnly("net.jcip:jcip-annotations:1.0") compileOnly("com.github.spotbugs:spotbugs-annotations:${spotbugsVersion}") testImplementation("com.google.code.findbugs:jsr305:3.0.2") }
- buildscript block の ext block 内の以下の点を変更します。
version "1.0.2-RELEASE"
→version "2.1.4-RELEASE"
に変更します。今回から Spring Boot のバージョンに合わせます。mainClass = "ksbysample.webapp.bootnpmgeb.Application"
を削除します。
- plugins block の以下の点を変更します。
id "org.springframework.boot" version "2.0.4.RELEASE"
→id "org.springframework.boot" version "2.1.4.RELEASE"
id "io.spring.dependency-management" version "1.0.6.RELEASE"
→id "io.spring.dependency-management" version "1.0.7.RELEASE"
id "com.moowork.node" version "1.2.0"
→id "com.moowork.node" version "1.3.1"
id "com.gorylenko.gradle-git-properties" version "1.5.1"
→id "com.gorylenko.gradle-git-properties" version "2.0.0"
- configurations block に以下の2行を追加します。
testAnnotationProcessor.extendsFrom annotationProcessor
testImplementation.extendsFrom compileOnly
- spotbugs block 内で
toolVersion = "3.1.3"
→toolVersion = "3.1.11"
に変更します。 pmdMain { ... }
を追加します。- dependencies block の以下の点を変更します。
def spockVersion = "1.1-groovy-2.4"
→def spockVersion = "1.3-groovy-2.4"
(Geb が依存している groovy のバージョンが 2.4 なので、2.5 ではなく 2.4 にします)def domaVersion = "2.19.2"
→def domaVersion = "2.24.0"
def lombokVersion = "1.18.0"
→def lombokVersion = "1.18.6"
def powermockVersion = "2.0.0-beta.5"
→def powermockVersion = "2.0.0"
def spotbugsVersion = "3.1.3"
→def spotbugsVersion = "3.1.11"
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
に書いていたexclude group: "org.codehaus.groovy", module: "groovy"
を削除します。testImplementation("org.mockito:mockito-core")
を削除します。implementation("org.flywaydb:flyway-core:5.1.4")
→implementation("org.flywaydb:flyway-core:5.2.4")
implementation("com.google.guava:guava:25.1-jre")
→implementation("com.google.guava:guava:27.1-jre")
implementation("org.apache.commons:commons-lang3:3.7")
→implementation("org.apache.commons:commons-lang3:3.8.1")
testImplementation("org.dbunit:dbunit:2.5.4")
→testImplementation("org.dbunit:dbunit:2.6.0")
testImplementation("org.assertj:assertj-core:3.10.0")
→testImplementation("org.assertj:assertj-core:3.12.2")
testImplementation("com.icegreen:greenmail:1.5.7")
→testImplementation("com.icegreen:greenmail:1.5.10")
testImplementation("org.gebish:geb-spock:2.1")
→testImplementation("org.gebish:geb-spock:2.3.1")
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、特にエラーは出ずに更新されました。
src/main/java/ksbysample/webapp/bootnpmgeb/config/ApplicationConfig.java の以下の点も変更します。
@Bean public Validator mvcValidator() { LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); localValidatorFactoryBean.setValidationMessageSource(this.messageSource); return localValidatorFactoryBean; }
public Validator mvcValidator()
→public Validator validator()
に変更します。
clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると、テストが大量に失敗しました。
(.....途中省略.....)
エラーの原因を調べるために Project Tool Window で src/test/groovy/ksbysample でコンテキストメニューを表示して「Run 'Tests in 'ksbysample''」を選択してテストを実行してみると以下のエラーメッセージが出ていました。Spring Session の AutoConfiguration クラス(org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration)で定義されている sessionEventHttpSessionListenerAdapter Bean が原因で BeanDefinitionOverrideException が発生しているとのこと。
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'sessionEventHttpSessionListenerAdapter' defined in class path resource [org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration; factoryMethodName=sessionEventHttpSessionListenerAdapter; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration.class]] for bean 'sessionEventHttpSessionListenerAdapter': There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; factoryMethodName=sessionEventHttpSessionListenerAdapter; initMethodName=null; destroyMethodName=(inferred); defined in org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration] bound.
自分で定義していない Bean の override 定義はさすがに解消しようがないので Spring Boot 2.1 Release Notes - Bean Overriding に記載されている spring.main.allow-bean-definition-overriding=true
の設定を application.properties に記述することにします。application.properties の内容は以下のようになります。
doma.dialect=org.seasar.doma.jdbc.dialect.H2Dialect management.endpoints.web.exposure.include=health,info,loggers,shutdown,threaddump management.endpoint.shutdown.enabled=true spring.datasource.hikari.jdbc-url=jdbc:h2:mem:bootnpmgebdb spring.datasource.hikari.username=sa spring.datasource.hikari.password= spring.datasource.hikari.driver-class-name=org.h2.Driver spring.datasource.hikari.leak-detection-threshold=5000 spring.datasource.hikari.register-mbeans=true spring.freemarker.cache=true spring.freemarker.settings.number_format=computer spring.freemarker.charset=UTF-8 spring.freemarker.enabled=false spring.freemarker.prefer-file-system-access=false spring.main.allow-bean-definition-overriding=true spring.session.store-type=jdbc spring.session.jdbc.initialize-schema=embedded spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-h2.sql spring.session.jdbc.table-name=SPRING_SESSION spring.thymeleaf.mode=HTML logging.level.root=INFO logging.level.org.seasar.doma=ERROR
再度 clean タスク実行 → Rebuild Project 実行 → build タスク実行をすると、今度は BUILD SUCCESSFUL のメッセージが出力されました。
Tomcat を手動起動してから gebTest タスクを実行すると、こちらも BUILD SUCCESSFUL のメッセージが出力されました。これまで gebTest タスクの時は gradle-processes plugin で Tomcat を自動起動・停止させていましたが、なくなると意外に不便ですね。。。
Headless モードを解除してブラウザを表示させて gebTest タスクを実行してみましたが、画面の表示等も特に問題はありませんでした。
履歴
2019/04/14
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その81 )( eslint を 4.19.1 → 5.16.0 へ、windows-build-tools を 3.1.0 → 5.1.0 へ、jest を 23.4.1 → 24.7.1 へ、postcss-cli を 4.1.1 → 6.1.2 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
参照したサイト・書籍
- eslint-config-airbnb-base
https://www.npmjs.com/package/eslint-config-airbnb-base
目次
- eslint-config-airbnb-base を 13.0.0 → 13.1.0 へ、eslint を 4.19.1 → 5.16.0 へバージョンアップする
- windows-build-tools を 3.1.0 → 5.1.0 へバージョンアップする
- jest を 23.4.1 → 24.7.1 へバージョンアップする
- postcss-cli を 4.1.1 → 6.1.2 へバージョンアップする
- 最後に各種コマンドや build で問題がないか確認する
手順
eslint-config-airbnb-base を 13.0.0 → 13.1.0 へ、eslint を 4.19.1 → 5.16.0 へバージョンアップする
以下のコマンドを実行して eslint-config-airbnb-base を 13.1.0 へバージョンアップします。
npm info "eslint-config-airbnb-base@13.1.0" peerDependencies
npx install-peerdeps --dev eslint-config-airbnb-base@13.1.0
以下のコマンドも実行して eslint 関連のモジュールを最新のバージョンにします。
npm install --save-dev acorn@6.1.1
npm install --save-dev eslint@5.16.0
npm install --save-dev eslint-config-prettier@4.1.0
npm install --save-dev eslint-loader@2.1.2
npm install --save-dev eslint-plugin-import@2.16.0
npm install --save-dev eslint-plugin-prettier@3.0.1
npm test
コマンドを実行するとテストは全て成功し、
(.....途中省略.....)
npm run build
コマンドも特にエラーは出ずに終了しました。
windows-build-tools を 3.1.0 → 5.1.0 へバージョンアップする
管理者モードで Powershell を起動した後、以下のコマンドを実行します。install だけだとなぜか先に進まなかったので uninstall してから install するようにしました。
npm uninstall --global --production windows-build-tools
npm install --global --production windows-build-tools@5.1.0
jest を 23.4.1 → 24.7.1 へバージョンアップする
以下のコマンドを実行します。
npm install --save-dev jest@24.7.1
npm install --save-dev jest-html-reporter@2.5.0
レポートファイルを削除したいので最初に gradle から clean タスクを実行しておきます。npm test
コマンドを実行するとテストは全て成功しました。
レポートファイルは build/reports/jest/jest-html-reporter.html に生成されており、開くと以下のように表示されます。
postcss-cli を 4.1.1 → 6.1.2 へバージョンアップする
以下のコマンドを実行します。
npm install --save-dev postcss-cli@6.1.2
以前 は画面の表示が崩れたと書きましたが、今回バージョンアップ後に原因を確認したところ common.min.css が出来ずに common.css だけが作成されて、common.css の中は minimize されているという結果だったからでした。src/main/resources/templates/web/common/fragments.html で読み込んでいるファイルを common.min.css → common.css に修正すると画面が正常に表示されるようになりました。
最後に各種コマンドや build で問題がないか確認する
最後にコマンド、build で問題がないか一通り確認します。
npm test
コマンドは問題ありませんでした。
(.....途中省略.....)
npm run build
コマンドも問題ありません。
clean タスク実行 → Rebuild Project 実行 → build タスク実行も問題ありません。
gebTest タスクも問題ありませんでした。
IntelliJ IDEA の「Settings」ダイアログを開いて「Language & Frameworks」-「Node.js and NPM」を表示し、バージョンアップ後の状態も記載しておきます。eslint-plugin-import、prettier、webpack がもう新バージョンが出ていますが、今はバージョンアップしません。
次は Spring Boot や Java 側のモジュールをバージョンアップします。
履歴
2019/04/13
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その80 )( nodist を 0.8.8 → 0.9.1 へ、Node.js を 8.11.4 → 10.15.3 へ、npm を 6.2.0-next.1 → 6.9.0 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- nodist を 0.8.8 → 0.9.1 へ、Node.js を 8.11.4 → 10.15.3 へ、npm を 6.2.0-next.1 → 6.9.0 へバージョンアップします。
- また npm でインストールしているモジュールを一部を除き最新のバージョンにします。
参照したサイト・書籍
- nullivex/nodist
https://github.com/nullivex/nodist
目次
- まずは現在の状況を確認する
- nodist を 0.8.8 → 0.9.1 へバージョンアップする
- Node.js を 10.15.3 へ、npm を 6.9.0 へバージョンアップする
- モジュールを最新のバージョンにする
手順
まずは現在の状況を確認する
現在のバージョンは nodist が 0.8.8、Node.js が 8.11.4、npm が 6.2.0-next.1 です。
nodist を 0.8.8 → 0.9.1 へバージョンアップする
https://github.com/nullivex/nodist/releases から NodistSetup-v0.9.1.exe をダウンロードし、実行します。
- 「Welcome to Nodist Setup」画面が表示されます。「Next >」ボタンをクリックします。
- 「License Agreement」画面が表示されます。「I Agree」ボタンをクリックします。
- 「Choose Install Location」画面が表示されます。「Destination Folder」に 0.8.8 をインストールした時の
D:\Nodist\
が表示されているので、そのまま「Install」ボタンをクリックします。 - 「Installing」画面が表示されてインストールが実行されます。
- 「Completing Nodist Setup」画面が表示されます。「Finish」ボタンをクリックします。
インストールが完了すると nodist が 0.9.1 になりますが、Node.js も 11.13.0 になりました。npm は前と変わらず 6.2.0-next.1 のままでした。
Node.js を 10.15.3 へ、npm を 6.9.0 へバージョンアップする
https://nodejs.org/ja/ を見ると Node.js の推奨版は 10.15.3 LTS でした。
Node.js は nodist をバージョンアップした時に 11.13.0 になっていますので 10.15.3 へバージョンダウンします。
npm の最新バージョンは https://github.com/npm/cli/releases を見ると 6.9.0 でした。
6.9.0 にバージョンアップします。
モジュールを最新のバージョンにする
バージョンアップ可能なモジュールを確認します。IntelliJ IDEA のメインメニューから「File」-「Settings...」を選択して「Settings」ダイアログを開き、画面左側で「Language & Frameworks」-「Node.js and NPM」を選択します。
画面右側にモジュールの一覧と現行バージョン、最新バージョン一覧が表示されます。
今回は以下の方針でバージョンアップします。
- admin-lte、bootstrap、ionicons は現行のまま。
- mobx、mobx-utils は少し触ってみただけなのでバージョンアップしない。
- eslint、jest + widows-build-tools、postcss-cli は別に章を分けてバージョンアップする。ただし postcss-cli は 以前 正常にバージョンアップできなかったのでしない可能性あり。
- バージョンアップは
npm update
ではなくnpm install --save-dev autoprefixer@8.0.0
(package.json の dependencies に記載されているものは --save、devDependencies に記載されているものは --save-dev にする) のようにバージョンを指定しながらバージョンアップする。 - 1つずつ上からバージョンアップする。関連しそうなところを動作確認しながら進める。
- @vue/cli は boot-npm-geb-sample プロジェクトでは使用していないので、ここではバージョンアップしない。
特に問題がでなければ画面キャプチャは撮りません。
npm install --save-dev autoprefixer@9.5.1
npm install --save-dev browser-sync@2.26.3
npm install --save-dev cssnano@4.1.10
npm install --save-dev http-proxy-middleware@0.19.1
npm install --save jquery@3.4.0
npm install --save-dev jquery-mockjax@2.5.0
npm install --save-dev nock@10.0.6
npm install --save-dev npm-run-all@4.1.5
npm install --save-dev prettier@1.16.4
npm install --save-dev prettier-webpack-plugin@1.2.0
npm install --save-dev rimraf@2.6.3
npm install --save-dev stylelint@9.10.1
npm install --save-dev uglifyjs-webpack-plugin@2.1.2
npm install --save-dev webpack@4.29.6
npm install --save-dev webpack-cli@3.3.0
npm install --save-dev xhr-mock@2.4.1
コマンドラインから npm test
コマンドを実行すると、かなりのテストが失敗しました。
(.....途中省略.....)
実際に失敗したのは以下のテストで(IntelliJ IDEA から Jest のテストを実行しています)、xhr-mock が原因でした。
失敗しているテストを以下のように修正します。
xhrmock.setup();
→xhrmock.default.setup();
に変更します。xhrmock.teardown();
→xhrmock.default.teardown();
に変更します。xhrmock.get
→xhrmock.default.get
に変更します。- timeout のテストは https://www.npmjs.com/package/xhr-mock#simulate-a-timeout を参考に
xhrmock.default.get(..., (req, res) => { return res.timeout(true); });
→xhrmock.default.get(..., () => new Promise(() => {}));
に変更します。
またプロジェクトの root ディレクトリ直下に node-tar-extract というディレクトリが作成されていたので削除します(このディレクトリがいつ作成されたのか分かりませんでした)。
再度 npm test
コマンドを実行すると、今度は全てのテストが成功しました。
npm run build
コマンドも特にエラーは出ずに終了しました。
clean タスク実行 → Rebuild Project 実行 → build タスク実行は問題なく BUILD SUCCESSFUL のメッセージが出力されて成功し、
gebTest タスクも BUILD SUCCESSFUL のメッセージが出力されて成功しました。
履歴
2019/04/13
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その79 )( webdriver-binaries-gradle-plugin を利用して WebDriver の個別ダウンロードを不要にする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
参照したサイト・書籍
Learn Geb + Spock : The best of breed solution for all your UI automation needs
https://medium.com/automationschool/geb-spock-the-best-of-breed-solution-for-all-your-ui-automation-needs-94f01c998f18AutomationSchool/geb-and-spock-automation-examples
https://github.com/AutomationSchool/geb-and-spock-automation-exampleserdi/webdriver-binaries-gradle-plugin
https://github.com/erdi/webdriver-binaries-gradle-pluginChromeDriver - WebDriver for Chrome
http://chromedriver.chromium.org/downloadsmozilla/geckodriver
https://github.com/mozilla/geckodriver
目次
手順
まずは現在の状況を確認する
clean タスク実行 → Rebuild Project 実行 → build タスク実行は問題なく BUILD SUCCESSFUL のメッセージが出力されて成功します。
また Chrome のバージョンが 73.0.3683.103 で、
Firefox のバージョンが 66.0.3 ですが、
gebTest タスクを実行すると chromeTest タスクは成功しますが firefoxTest タスクは全てのテストが失敗します。ダウンロードしている geckodriver が今の Firefox に合っていないようです。
(.....途中省略.....)
build.gradle を変更する
geb-and-spock-automation-examples/twitter-app-ui-automation/build.gradle と erdi/webdriver-binaries-gradle-plugin を参考にして build.gradle を以下のように変更します。
plugins { .......... id "com.energizedwork.webdriver-binaries" version "1.4" } .......... webdriverBinaries { chromedriver "73.0.3683.68" geckodriver "0.24.0" } def drivers = ["chrome", "firefox"] drivers.each { driver -> task "${driver}Test"(type: Test) { // 前回実行時以降に何も更新されていなくても必ず実行する outputs.upToDateWhen { false } systemProperty "geb.env", driver exclude "ksbysample/**" dependsOn startServer finalizedBy stopServer } } task gebTest { dependsOn drivers.collect { tasks["${it}Test"] } enabled = false }
- plugins block に
id "com.energizedwork.webdriver-binaries" version "1.4"
を追加します。 webdriverBinaries { ... }
を追加します。chromedriver のバージョンは ChromeDriver - WebDriver for Chrome で、geckodriver のバージョンは mozilla/geckodriver で確認して記述します。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
GebConfig.groovy を変更する
import org.openqa.selenium.chrome.ChromeDriver import org.openqa.selenium.chrome.ChromeOptions import org.openqa.selenium.firefox.FirefoxDriver import org.openqa.selenium.firefox.FirefoxOptions //System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.24.0/geckodriver.bat") //System.setProperty("webdriver.chrome.driver", "D:/chromedriver/73.0.3683.68/chromedriver.exe") driver = { FirefoxOptions firefoxOptions = new FirefoxOptions() firefoxOptions.setHeadless(true) new FirefoxDriver(firefoxOptions) } baseUrl = "http://localhost:8080" waiting { timeout = 15 } environments { chrome { driver = { ChromeOptions chromeOptions = new ChromeOptions() chromeOptions.setHeadless(true) new ChromeDriver(chromeOptions) } } firefox { driver = { FirefoxOptions firefoxOptions = new FirefoxOptions() firefoxOptions.setHeadless(true) new FirefoxDriver(firefoxOptions) } } }
D:/geckodriver
の下に0.24.0
というディレクトリを作成した後、https://github.com/mozilla/geckodriver/releases/tag/v0.24.0 から geckodriver-v0.24.0-win64.zip をダウンロード・解凍して geckodriver.exe を配置します。D:/chromedriver
の下に73.0.3683.68
というディレクトリを作成した後、http://chromedriver.chromium.org/downloads から ChromeDriver 73.0.3683.68 のファイル(chromedriver_win32.zip)をダウンロード・解凍して chromedriver.exe を配置します。- 以下の2行をコメントアウトします。
System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.24.0/geckodriver.bat")
System.setProperty("webdriver.chrome.driver", "D:/chromedriver/73.0.3683.68/chromedriver.exe")
※IntelliJ IDEA から実行する時には個別の WebDriver と System.setProperty("webdriver.~.driver", ...)
の設定が必要なので、削除はせずにコメントアウトだけしておきます。
動作確認
gebTest タスクを実行してみると今度は chromeTest, firefoxTest のどちらもエラーが出なくなりました。
GebConfig.groovy で setHeadless(true)
の行をコメントアウトしてブラウザを表示して動作も見てみましたが、問題ないようです。
WebDriver のファイルを個別にダウンロードしてプロジェクトとは別のディレクトリに配置するのは避けたいと思っていたので、これは便利ですね!
履歴
2019/04/12
初版発行。
2019/04/13
* 最新の geckodriver、chromedriver をダウンロードしてディレクトリに配置する記述を追加した。
* System.setProperty("webdriver.gecko.driver", ...)
、System.setProperty("webdriver.chrome.driver", ...)
の記述を削除するのではなくコメントアウトするよう修正した(削除すると IntelliJ IDEA からテストを実行できなくなるため)。
* D:/geckodriver/
、D:/chromedriver/
のディレクトリを削除するという記述を削除した。
Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( 感想 )
記事一覧はこちらです。
Spring Boot 2.1 へのバージョンアップは現在使用している機能に関しては大きな変更はなかったのですが、
@ExtendWith(SpringExtension.class)
が自動で付くようになったので、-Xlint:all
オプションを付けた状態で JUnit 5 に切り替えていないと compileTestJava タスクで警告が出る。- gradle からテストを実行した時は何も出ないが、IntelliJ IDEA 上から実行すると
Command line is too long.
のエラーが表示される。
のようにいつもと違ったところで警告やエラーが出た印象です。
今回一番時間がかかったのは Spring Boot のバージョンアップよりも JUnit 5 への切り替えの方でした。JUnit 5 もバージョン 5.4 から BOM が提供されたり、junit-jupiter を指定すれば junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine の3つが依存関係に追加されるようになったり、Spring Boot 2.1 から
@ExtendWith(SpringExtension.class)
が自動で付与されるようになって記述する必要がなくなったり、とかなり導入しやすくなりました。テストも JUnit 4 と比較すると JUnit 5 の方が書きやすいですね。ただし Spock といまひとつ相性が良くありません。JUnit 5 の junit-vintage-engine 下だと Spock のテストが動かない場合がありました。Gradle だと Spock と JUnit 5 のテストのタスクを分けることが出来たので、とりあえずは問題ないかな。。。
JDK 11 へのバージョンアップは PowerMock と Groovy 周りで問題が発生しましたが、解決策も割と簡単に見つかって難しくはありませんでした。今回一番大変なところだろうと思っていたのですが、それ程でもありませんでした。error-prone も JDK 11 だと導入・設定が JDK 8 の頃と比べて簡単になった印象です。
さて、次に何を書くかを考えましょうか。。。
Spring Boot 2.0.x の Web アプリを 2.1.x へバージョンアップする ( その20 )( Spring Boot を 2.1.3 → 2.1.4 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Spring Boot を 2.1.3 → 2.1.4 へバージョンアップします。
参照したサイト・書籍
- Spring get ServletContext and provide it as a Bean
https://stackoverflow.com/questions/47269496/spring-get-servletcontext-and-provide-it-as-a-bean
目次
手順
Spring Boot を 2.1.3 → 2.1.4 へバージョンアップする
build.gradle の以下の点を変更します。
buildscript { ext { group "ksbysample" version "2.1.4-RELEASE" } repositories { mavenCentral() maven { url "https://repo.spring.io/release/" } maven { url "https://plugins.gradle.org/m2/" } } } plugins { id "java" id "eclipse" id "idea" id "org.springframework.boot" version "2.1.4.RELEASE" id "io.spring.dependency-management" version "1.0.7.RELEASE" id "groovy" id "checkstyle" id "com.github.spotbugs" version "1.6.9" id "pmd" id "net.ltgt.errorprone" version "0.7.1" id "de.undercouch.download" version "3.4.3" id "com.gorylenko.gradle-git-properties" version "2.0.0" }
- buildscript block 内で
version "2.1.3-RELEASE"
→version "2.1.4-RELEASE"
に変更します。 - plugins block 内で
id "org.springframework.boot" version "2.1.3.RELEASE"
→id "org.springframework.boot" version "2.1.4.RELEASE"
に変更します。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行してみるとテストが1件失敗しました。
失敗の原因を調べるために Project Tool Window で src/test/java/ksbysample でコンテキストメニューを表示して「Run 'Tests in 'ksbysample''」を選択すると java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
というエラーメッセージが表示されていました。
このエラーメッセージだけでは原因がまだ分からなかったので src/test/java/ksbysample/webapp/lending/web/LoginControllerTest.java の中の失敗しているテストを debug 実行してみたところ、下記の画像の赤枠の部分で IllegalStateException が throw されていました。
IllegalStateException が throw されるところも追ってみると、org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest#matches メソッドで WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
を呼び出していますが、
org.springframework.web.context.support.WebApplicationContextUtils#getRequiredWebApplicationContext メソッドでは WebApplicationContext が取得できないために IllegalStateException を throw していました。
つまり原因は、失敗しているテストでは MockServletContext のインスタンスを生成して SimpleRequestBuilder オブジェクトを生成してから org.springframework.test.web.servlet.MockMvc#perform メソッドを呼び出していますが、MockServletContext のインスタンスでは WebApplicationContext オブジェクトが取得できないため IllegalStateException が throw されてテストが失敗している、ということでした。
Mock ではない ServletContext を取得する方法を探してみると Spring get ServletContext and provide it as a Bean を見つけました。@Autowired すれば取得できるとのことなので src/test/java/ksbysample/webapp/lending/web/LoginControllerTest.java のテストを以下のように変更します。
@Nested @SpringBootTest class 次回から自動的にログインするのテスト { @RegisterExtension @Autowired public TestDataExtension testDataExtension; @RegisterExtension @Autowired public SecurityMockMvcExtension mvc; @Autowired ServletContext servletContext; @Test void 次回から自動的にログインするをチェックすれば次はログインしていなくてもログイン後の画面にアクセスできる() throws Exception { // ログイン前にはログイン後の画面にアクセスできない mvc.noauth.perform(get(Constant.URL_AFTER_LOGIN_FOR_ROLE_ADMIN)) .andExpect(status().isFound()) .andExpect(redirectedUrl("http://localhost/")) .andExpect(unauthenticated()); // 「次回から自動的にログインする」をチェックしてログインし、remember-me Cookie を生成する org.springframework.mock.web.MockHttpServletRequest request = formLogin() .user("id", mvc.MAILADDR_TANAKA_TARO) .password("password", "taro") .buildRequest(servletContext); request.addParameter("remember-me", "true"); SimpleRequestBuilder simpleRequestBuilder = new SimpleRequestBuilder(request); MvcResult result = mvc.noauth.perform(simpleRequestBuilder) .andExpect(status().isFound()) .andExpect(redirectedUrl(Constant.URL_AFTER_LOGIN_FOR_ROLE_ADMIN)) .andExpect(authenticated().withUsername(mvc.MAILADDR_TANAKA_TARO)) .andReturn(); Cookie[] cookie = result.getResponse().getCookies(); ..........
@Autowired ServletContext servletContext;
を追加します。// 「次回から自動的にログインする」をチェックしてログインし、remember-me Cookie を生成する
のコメントの下に記述していたMockServletContext servletContext = new MockServletContext();
を削除します。
再度 clean タスク実行 → Rebuild Project 実行 → build タスクを実行してみると今度は "BUILD SUCCESSFUL" のメッセージが出力されました。
履歴
2019/04/08
初版発行。
IntelliJ IDEA を 2018.3.5 → 2018.3.6 へバージョンアップ
IntelliJ IDEA を 2018.3.5 → 2018.3.6 へバージョンアップする
IntelliJ IDEA の 2018.3.6 がリリースされているのでバージョンアップします。
- IntelliJ IDEA 2018.3.6 is released!
https://blog.jetbrains.com/idea/2019/03/intellij-idea-2018-3-6-is-released/
※ksbysample-webapp-lending プロジェクトを開いた状態でバージョンアップしています。現在 Spring Boot 2.1.x へバージョンアップ中ですが、バージョンアップの作業もほぼ完了しているので 2.1.x のバージョンで作業します。
IntelliJ IDEA のメインメニューから「Help」-「Check for Updates...」を選択します。
「IDE and Plugin Updates」ダイアログが表示されます。左下に「Update and Restart」ボタンが表示されていますので、「Update and Restart」ボタンをクリックします。
Plugin の update も表示されました。このまま「Update and Restart」ボタンをクリックします。
Patch がダウンロードされて IntelliJ IDEA が再起動します。
IntelliJ IDEA が起動すると画面下部に「Indexing…」のメッセージが表示されますので、終了するまで待機します。
IntelliJ IDEA のメインメニューから「Help」-「About」を選択し、2018.3.6 へバージョンアップされていることを確認します。
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行して、"BUILD SUCCESSFUL" のメッセージが出力されることを確認します。
Project Tool Window で src/test/groovy/ksbysample と src/test/java/ksbysample でコンテキストメニューを表示して「Run 'All Tests' with Coverage」を選択し、テストが全て成功することを確認します。