Spring Boot + npm + Geb で入力フォームを作ってテストする ( その89 )( Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする )
概要
記事一覧はこちらです。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その88 )( Gradle を 5.3.1 → 6.4 へバージョンアップする ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- Spring Boot を 2.1.4 → 2.2.7 へバージョンアップします。
- 依存関係にあるモジュールも一部を除き最新バージョンにバージョンアップします。
参照したサイト・書籍
目次
- Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする
- Freemarker のテンプレートの拡張子を
*.ftl
→*.ftlh
に変更する - 開発環境で Web アプリを起動する時には
-XX:TieredStopAtLevel=1
オプションを指定する logging.file
→logging.file.name
に変更する- 最後に build で問題がないか確認する
手順
Spring Boot を 2.1.4 → 2.2.7 へバージョンアップする
以下の方針でバージョンアップします。
- Spring Boot を 2.1.4 → 2.2.7 にバージョンアップする。
- Gradle の Plugin も最新バージョンにする。
- checkstyle, spotbugs, pmd, error-prone は後回し。
- com.google.guava:guava はバージョンアップするとコンパイル時に警告が出るのでバージョンアップしない。
- doma 2 の最新バージョンは 2.29.0 ですが domaGen タスクが動作しないため 2.28.0 にする。
build.gradle の以下の点を変更します。
buildscript { ext { group "ksbysample" version "2.2.7-RELEASE" } repositories { mavenCentral() gradlePluginPortal() } } plugins { id "java" id "eclipse" id "idea" id "org.springframework.boot" version "2.2.7.RELEASE" id "io.spring.dependency-management" version "1.0.9.RELEASE" id "groovy" id "net.ltgt.errorprone" version "0.7.1" 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.2.2" // 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 { developmentOnly runtimeClasspath { extendsFrom developmentOnly } // annotationProcessor と testAnnotationProcessor、compileOnly と testCompileOnly を併記不要にする testAnnotationProcessor.extendsFrom annotationProcessor testImplementation.extendsFrom compileOnly // for Doma 2 domaGenRuntime } .......... dependencyManagement { imports { // mavenBom は以下の URL のものを使用する // https://repo.spring.io/release/org/springframework/boot/spring-boot-starter-parent/2.1.4.RELEASE/ // bomProperty に指定可能な property は以下の URL の BOM に記述がある // https://repo.spring.io/release/org/springframework/boot/spring-boot-dependencies/2.1.4.RELEASE/spring-boot-dependencies-2.1.4.RELEASE.pom mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES mavenBom("org.junit:junit-bom:5.6.2") } } dependencies { def spockVersion = "1.3-groovy-2.5" def domaVersion = "2.28.0" def lombokVersion = "1.18.12" def errorproneVersion = "2.3.3" def powermockVersion = "2.0.7" def seleniumVersion = "3.141.59" 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") 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:2.0.0") implementation("org.flywaydb:flyway-core:5.2.4") implementation("com.h2database:h2:1.4.200") implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1") implementation("com.google.guava:guava:27.1-jre") implementation("org.apache.commons:commons-lang3:3.8.1") testImplementation("org.dbunit:dbunit:2.7.0") testImplementation("org.assertj:assertj-core:3.16.0") testImplementation("org.spockframework:spock-core:${spockVersion}") testImplementation("org.spockframework:spock-spring:${spockVersion}") testImplementation("org.jsoup:jsoup:1.13.1") testImplementation("com.icegreen:greenmail:1.5.13") // 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.200") // 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:3.4") { exclude group: "org.codehaus.groovy", module: "groovy-all" } 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") // for JUnit 5 // junit-jupiter で junit-jupiter-api, junit-jupiter-params, junit-jupiter-engine の3つが依存関係に追加される testCompile("org.junit.jupiter:junit-jupiter") testRuntime("org.junit.platform:junit-platform-launcher") } ..........
- buildscript block の以下の点を変更します。
version "2.1.4-RELEASE"
→version "2.2.7-RELEASE"
に変更します。maven { url "https://plugins.gradle.org/m2/" }
→gradlePluginPortal()
に変更します。
- plugins block の以下の点を変更します。
id "org.springframework.boot"
をversion "2.1.4.RELEASE"
→version "2.2.7.RELEASE"
に変更します。id "io.spring.dependency-management"
のversion "1.0.7.RELEASE"
→version "1.0.9.RELEASE"
に変更します。id "com.gorylenko.gradle-git-properties"
のversion "2.0.0"
→version "2.2.2"
に変更します。
- configurations block の以下の点を変更します。
developmentOnly
を追加します。runtimeClasspath { extendsFrom developmentOnly }
を追加します。
- dependencyManagement block の以下の点を変更します。
mavenBom("org.junit:junit-bom:5.4.2")
→mavenBom("org.junit:junit-bom:5.6.2")
に変更します。
- dependencies block の以下の点を変更します。
def domaVersion = "2.24.0"
→def domaVersion = "2.28.0"
に変更します。def lombokVersion = "1.18.6"
→def lombokVersion = "1.18.12"
に変更します。def powermockVersion = "2.0.0"
→def powermockVersion = "2.0.7"
に変更します。implementation("com.integralblue:log4jdbc-spring-boot-starter:1.0.2")
→implementation("com.integralblue:log4jdbc-spring-boot-starter:2.0.0")
に変更します。implementation("org.flywaydb:flyway-core:5.2.4")
→implementation("org.flywaydb:flyway-core:6.4.1")
に変更します。implementation("com.h2database:h2:1.4.192")
→implementation("com.h2database:h2:1.4.200")
に変更します。implementation("com.github.rozidan:modelmapper-spring-boot-starter:1.0.0")
→implementation("com.github.rozidan:modelmapper-spring-boot-starter:2.3.1")
に変更します。implementation("org.apache.commons:commons-lang3:3.8.1")
→implementation("org.apache.commons:commons-lang3:3.10")
に変更します。testImplementation("org.dbunit:dbunit:2.6.0")
→testImplementation("org.dbunit:dbunit:2.7.0")
に変更します。testImplementation("org.assertj:assertj-core:3.12.2")
→testImplementation("org.assertj:assertj-core:3.16.0")
に変更します。testImplementation("org.jsoup:jsoup:1.11.3")
→testImplementation("org.jsoup:jsoup:1.13.1")
に変更します。testImplementation("com.icegreen:greenmail:1.5.10")
→testImplementation("com.icegreen:greenmail:1.5.13")
に変更します。domaGenRuntime("com.h2database:h2:1.4.192")
→domaGenRuntime("com.h2database:h2:1.4.200")
に変更します。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新すると、特にエラーは出ずに更新されました。
clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると、テストが 13件失敗しました。
エラーメッセージは全て org.h2.jdbc.JdbcSQLException at InquiryTestSpec.groovy:29 Caused by: java.net.SocketTimeoutException at InquiryTestSpec.groovy:29
で、原因は build タスクでは実行されないようにしていた Geb のテストが JUnit 5 のテストを実行するように設定していたはずの test タスクで実行されていたからでした。
build.gradle の test タスクに exclude "geb/**"
を追加して Geb のテストが除外されるようにします。
test { // test タスクの jvmArgs は tasks.withType(Test) { ... } で定義している exclude "geb/**" // for JUnit 5 useJUnitPlatform() testLogging { afterSuite printTestCount } }
再度 clean タスク実行 → Rebuild Project 実行 → build タスク実行をしてみると今度は BUILD SUCCESSFUL が表示されました。
Freemarker のテンプレートの拡張子を *.ftl
→ *.ftlh
に変更する
Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その5 )( Release Notes を見て必要な箇所を変更する ) で変更した内容を boot-npm-geb-sample にも反映します。
以下のファイルの拡張子を *.ftl
→ *.ftlh
に変更します。
src/main/resources/templates/mail/inquirymail-body.ftlh
開発環境で Web アプリを起動する時には -XX:TieredStopAtLevel=1
オプションを指定する
build.gradle の bootRun タスクに "-XX:TieredStopAtLevel=1"
を追加します。
bootRun { jvmArgs = jvmArgsForTask + jvmArgsAddOpens + [ "-Dspring.profiles.active=develop", "-XX:TieredStopAtLevel=1" ] }
logging.file
→ logging.file.name
に変更する
src/main/resources/application-product.properties 内の設定を logging.file → logging.file.name に変更します。
server.tomcat.basedir=C:/webapps/boot-npm-geb-sample logging.file.name=${server.tomcat.basedir}/logs/boot-npm-geb-sample.log
最後に build で問題がないか確認する
clean タスク実行 → Rebuild Project 実行 → build タスク実行をすると BUILD SUCCESSFUL が表示されます(と思いましたが testJUnit4AndSpock と test タスクのどちらも 147 tests になっていました、次の回で解消します)。
Web アプリを起動してから gebTest タスクを実行するとこちらも BUILD SUCCESSFUL が表示されます。
履歴
2020/05/10
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その88 )( Gradle を 5.3.1 → 6.4 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- Gradle を 5.3.1 → 6.4 へバージョンアップします。
参照したサイト・書籍
目次
手順
.gitignore に /src/main/generated、/src/test/generated_tests を追加する
IntelliJ IDEA を 2019.3 以降にバージョンアップすると generated ディレクトリを作成するようになるので、.gitignore に /src/main/generated、/src/test/generated_tests を追加してその下に作成されるファイルを git の対象外になるようにします。
.......... # Intellij project files *.iml *.ipr *.iws **/.idea/ **/out/ **/src/main/resources/static **/src/main/generated **/src/test/generated_tests ..........
Gradle を 5.3.1 → 6.4 へバージョンアップする
build.gradle の wrapper タスクの記述を以下のように変更します。
wrapper {
gradleVersion = "6.4"
distributionType = Wrapper.DistributionType.ALL
}
gradleVersion = "5.3.1"
→gradleVersion = "6.4"
に変更します。
コマンドプロンプトから gradlew wrapper --gradle-version=6.4
、gradlew --version
コマンドを実行します。
gradle/wrapper/gradle-wrapper.properties は以下の内容になります。
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
JVM を呼び出す時のメモリ割り当ての記述が元に戻るので、gradlew.bat 内の記述を set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" → set DEFAULT_JVM_OPTS="-Xmx4096m" に変更します(gradlew も同じような変更をします)。
Gradle を 6 系に上げただけだと SpotBugs のタスクが動作しなくなるので(バージョンアップが必要)、一旦 SpotBugs をコメントアウトします。build.gradle を以下のように変更します。
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.7.1" 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" } .......... //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 // } //} .......... dependencies { .......... // 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") .......... }
Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
clean タスク実行 → Rebuild Project 実行 → build タスクを実行すると Doma 2 関連のエラーが出ました。build.gradle の記述の仕方が古いのが原因です。
build.gradle を以下のように変更します。
.......... // for Doma 2 // Copy the resources referred by the Doma annotation processors to // the destinationDir of the compileJava task task copyDomaResources(type: Sync) { from sourceSets.main.resources.srcDirs into compileJava.destinationDir include "doma.compile.config" include "META-INF/**/*.sql" include "META-INF/**/*.script" } compileJava.dependsOn copyDomaResources springBoot { buildInfo() } ..........
- 以下の2行を削除します。
processResources.destinationDir = compileJava.destinationDir
compileJava.dependsOn processResources
- 以下の設定を追加します。
task copyDomaResources(type: Sync) { ... }
compileJava.dependsOn copyDomaResources
再度 build タスクを実行すると今度は pmdMain でエラーが出ました。
Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その2 )( Spring Boot を 2.1.4 → 2.1.11 へ、Gradle を 5.3.1 → 5.6.4 へバージョンアップする ) で以下の赤枠の記述を削除していたので、今回も同様に削除します。
再度 build タスクを実行すると無事 "BUILD SUCCESSFUL" のメッセージが出力されました。
履歴
2020/05/09
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その87 )( postcss-cli を 6.1.2 → 7.1.1 へ、prettier を 1.16.4 → 2.0.5 へ、stylelint を 9.10.1 → 13.3.3 へバージョンアップする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- postcss-cli を 6.1.2 → 7.1.1 へ、prettier を 1.16.4 → 2.0.5 へ、stylelint を 9.10.1 → 13.3.3 へバージョンアップします。
参照したサイト・書籍
Prettier 2.0 “2020”
https://prettier.io/blog/2020/03/21/2.0.0.htmlPrettier 2.0 の主要な変更
https://qiita.com/sosukesuzuki/items/50a5ed5e7079eb9da0fe
目次
- postcss-cli を 6.1.2 → 7.1.1 へバージョンアップする
- prettier を 1.16.4 → 2.0.5 へバージョンアップする
- stylelint を 9.10.1 → 13.3.3 へバージョンアップする
- 最後に各種コマンドや build で問題がないか確認する
手順
postcss-cli を 6.1.2 → 7.1.1 へバージョンアップする
以下のコマンドを実行します。
npm install --save-dev postcss-cli@7.1.1
npm test
、npm run build
コマンドを実行すると特にエラーが出ずに終了しました(キャプチャは npm run build
のみ)。
Web アプリを起動して画面が正常に表示されていることも確認します(キャプチャは省略)。
prettier を 1.16.4 → 2.0.5 へバージョンアップする
以下のコマンドを実行します。
npm install --save-dev prettier@2.0.5
npm test
コマンドを実行するとテストは全て成功しました。
npm test
コマンド実行時には prettier:format
、prettier:format-test
の npm scripts が実行されて prettier によるフォーマットが行われるようにしていますが、今回は全部の js ファイルがフォーマットされていました。以下の内容でした。
function()
→function ()
と括弧の前にスペースが入るようになった。- 配列の最後の要素の後にカンマが追加されるようになった。
- ファイルの改行コードを CRLF にしていたが LF に変更された。
Prettier 2 の変更点は Prettier 2.0 “2020” に記載されています。
npm run build
コマンドを実行すると大量の xpected linebreaks to be 'CRLF' but found 'LF'
のエラーメッセージが出力されました。
このエラーを解消するために .eslintrc.js を以下のように変更します。
module.exports = { extends: ["airbnb-base/legacy", "plugin:prettier/recommended"], env: { jquery: true }, rules: { // requires to declare all vars on top of their containing scope "vars-on-top": "off", // require function expressions to have a name // http://eslint.org/docs/rules/func-names "func-names": "off", // disallow mixed 'LF' and 'CRLF' as linebreaks // http://eslint.org/docs/rules/linebreak-style "linebreak-style": ["error", "unix"], // specify whether double or single quotes should be used quotes: ["error", "double", {avoidEscape: true}], // disallow use of variables before they are defined "no-use-before-define": [ "error", {functions: false, classes: true, variables: true} ] } };
"linebreak-style": ["error", "windows"],
→"linebreak-style": ["error", "unix"],
に変更します。
再び npm run build
コマンドを実行すると今度は特にエラーが出ずに終了しました。
.js ファイルの改行コードが LF になるので .gitattributes を新規作成して以下の内容を記述します。
* text=auto *.js text eol=lf
また IntelliJ IDEA の Settings ダイアログを開き Languages & Frameworks -> JavaScript -> Code Quality Tools -> ESLint に移動して「Node interpreter」を 12.16.3 に変更します。
stylelint を 9.10.1 → 13.3.3 へバージョンアップする
以下のコマンドを実行します。
npm install --save-dev stylelint@13.3.3
npm install --save-dev stylelint-config-standard@20.0.0
IntelliJ IDEA の Settings ダイアログを開き Languages & Frameworks -> Style Sheets -> Stylelint に移動して「Enable」をチェックし「Stylelint package」を 13.3.3 に変更します。
npm test
、npm run build
コマンドを実行すると npm run build
の時に2種類のメッセージが出力されました。
Unexpected empty line before rule (rule-empty-line-before)
Unexpected empty line before at-rule (at-rule-empty-line-before)
メッセージが出ないようにするために stylelint.config.js を以下のように変更します。
"use strict"; module.exports = { extends: "stylelint-config-standard", rules: { "comment-empty-line-before": [ "always", { ignore: ["after-comment"], }, ], indentation: 4, "number-leading-zero": "never", }, };
- ファイルの先頭に
"use strict";
を追加します(module.exports
の module の部分に赤波線が表示されていたため)。 "at-rule-empty-line-before": [ ... ]
を削除します。"rule-empty-line-before": "never-multi-line",
を削除します。
再度 npm run build
を実行すると今度はメッセージが出ませんでした。
最後に各種コマンドや build で問題がないか確認する
最後にコマンド、build で問題がないか一通り確認します。
npm test
コマンドは問題ありませんでした。。。と思っていましたが、前からずっと A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --runInBand --detectOpenHandles to find leaks.
のメッセージが出ていました。
(.....途中省略.....)
package.json を以下のように変更します。
"scripts": { "test": "run-s prettier:format prettier:format-test jest", "jest": "jest --config=jest.config.json --coverage --runInBand --detectOpenHandles", "postinstall": "run-s clean:static-dir copy:all", ..........
- jest タスクの末尾に
--runInBand --detectOpenHandles
を追加します。
再度 npm test
コマンドを実行すると今度はメッセージが表示されなくなりました。ただし終了前に少し待つようにもなりました。気にはなりますが、このまま進めることにします。
npm run build
コマンドも問題ありません。
clean タスク実行 → Rebuild Project 実行 → build タスク実行も問題ありません。
gebTest タスクも問題ありませんでした。
IntelliJ IDEA の「Settings」ダイアログを開いて「Language & Frameworks」-「Node.js and NPM」を表示し、バージョンアップ後の状態も記載しておきます。
履歴
2020/05/08
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その86 )( eslint を 5.16.0 → 6.8.0 へ、jest を 24.7.1 → 26.0.1 へバージョンアップし、windows-build-tools を 5.1.0 → 4.0.0 へバージョンダウンする )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- eslint を 5.16.0 → 6.8.0 へ、jest を 24.7.1 → 26.0.1 へバージョンアップします。
- windows-build-tools を 5.1.0 → 5.2.2 へバージョンアップしようとしたのですがエラーメッセージが表示されてインストール出来ず、5.1.0 にも戻せなかったので、4.0.0 へバージョンダウンしました。
参照したサイト・書籍
- eslint-config-airbnb-base
https://www.npmjs.com/package/eslint-config-airbnb-base
目次
- eslint を 5.16.0 → 6.8.0 へ、eslint-config-airbnb-base を 13.1.0 → 14.1.0 へバージョンアップする
- windows-build-tools を 5.1.0 → 5.2.2 へバージョンアップする。。。つもりが 4.0.0 へバージョンダウンする
- jest を 24.7.1 → 26.0.1 へバージョンアップする
手順
eslint を 5.16.0 → 6.8.0 へ、eslint-config-airbnb-base を 13.1.0 → 14.1.0 へバージョンアップする
以下のコマンドを実行して eslint 関連のモジュールを最新のバージョンにします。
npm install --save-dev eslint@6.8.0
npm install --save-dev eslint-config-prettier@6.11.0
npm install --save-dev eslint-loader@4.0.2
npm install --save-dev eslint-plugin-import@2.20.1
npm install --save-dev eslint-plugin-prettier@3.1.3
※acorn は1つ前の回でバージョンアップしてしまいました。
以下のコマンドを実行して eslint-config-airbnb-base を 14.1.0 へバージョンアップします。
npm info "eslint-config-airbnb-base@14.1.0" peerDependencies
npx install-peerdeps --dev eslint-config-airbnb-base@14.1.0
npm test
コマンドを実行するとテストは全て成功しましたが、
npm run build
コマンドは Use the global form of 'use strict'
のエラーメッセージが出て処理が中断しました。
src/main/assets/js/inquiry/confirm.js を見ると "use strict";
の記述がなかったのでファイルの最初に追加します。
"use strict"; $(document).ready(function() { ..........
再度 npm test
、npm run build
を実行すると今度は特にエラーが出ずに終了しました。
windows-build-tools を 5.1.0 → 5.2.2 へバージョンアップする。。。つもりが 4.0.0 へバージョンダウンする
管理者モードで Powershell を起動した後、以下のコマンドを実行します。。。が Could not install Visual Studio Build Tools.
のメッセージが表示されており、どうもインストール出来ていないようです(今回は ConEmu を管理者モードで起動した後 PowerShell -ExecutionPolicy RemoteSigned
コマンドで PowerShell に切り替えて実行しています)。
npm uninstall --global windows-build-tools
npm install --global windows-build-tools@5.2.2
Web で検索したところ Could not install Visual Studio Build Tools を見つけましたが、C:\Users\root\.windows-build-tools
を削除しても同じメッセージが表示されます。
解決方法が分からないので 5.1.0 へ戻そうとしましたが同じエラーメッセージが出て元に戻せません。。。 どうも Windows 10 のバージョンが上がった影響でインストール出来なくなっているように思えます。
仕方がないので 4.0.0 をインストールしてみたところ、無事インストール出来ました。このバージョンを使うことにします。
npm uninstall --global windows-build-tools
npm install --global windows-build-tools@4.0.0
jest を 24.7.1 → 26.0.1 へバージョンアップする
以下のコマンドを実行します。
npm install --save-dev jest@26.0.1
npm install --save-dev jest-html-reporter@3.1.0
レポートファイルを削除したいので最初に gradle から clean タスクを実行しておきます。npm test
コマンドを実行するとテストは全て成功しました。
レポートファイルは build/reports/jest/jest-html-reporter.html に生成されているのですが、テスト結果が出力されていませんでした。。。
https://www.npmjs.com/package/jest-html-reporter を見ると設定方法が変わっていたので、jest.config.json を以下のように変更します。
{ "coverageDirectory": "build/reports/jest", "moduleDirectories": [ "node_modules", "src/main/assets/js" ], "reporters": [ "default", [ "./node_modules/jest-html-reporter", { "pageTitle": "Test Report" } ] ] }
"testResultsProcessor": "./node_modules/jest-html-reporter"
→reporters": ["default", ["./node_modules/jest-html-reporter", {"pageTitle": "Test Report"}]
に変更します。
再度 npm test
コマンドを実行するとテストが成功して build/reports/jest/jest-html-reporter.html にレポートが出力されていました。
履歴
2020/05/06
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その85 )( Node.js を 10.15.3 → 12.16.3 へ、npm を 6.9.0 → 6.14.5 へバージョンアップする )
概要
記事一覧はこちらです。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その84 )( WebDriver を最新バージョンに上げる ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- Node.js を 10.15.3 → 12.16.3 へ、npm を 6.9.0 → 6.14.5 へバージョンアップします。
- また npm でインストールしているモジュールを一部を除き最新のバージョンにします。
参照したサイト・書籍
- chimurai / http-proxy-middleware
https://github.com/chimurai/http-proxy-middleware
目次
- まずは現在の状況を確認する
- nodist は 0.9.1 のまま
- Node.js を 12.16.3 へ、npm を 6.14.5 へバージョンアップする
- モジュールを最新のバージョンにする
Replace Autoprefixer browsers option to Browserslist config.
のメッセージが表示されないようにする
手順
まずは現在の状況を確認する
現在のバージョンは nodist が 0.9.1、Node.js が 10.15.3、npm が 6.9.0 です。
nodist は 0.9.1 のまま
https://github.com/nullivex/nodist/releases を見ると nodist の最新バージョンは 0.9.1 のままでした。更新が止まっている?と思って最近の Windows の Node.js バージョン管理ツールを調べてみましたが、
- Windows の Node.js バージョン管理ツールは nodist と nvm-windows がある。
- nodist の最新バージョンは 0.9.1、リリース日は 30 Mar 2019。
- nvm-windows の最新バージョンは 1.1.7 - Maintenance Release、リリース日は 2 Aug 2018。
- nodist のリリースが止まっているので nvm-windows に変更したという記事を見かけたが、
- nodist は 0.8.8(17 Dec 2016 リリース)でリリースが止まっていたが @nullivex さんがメンテナンスするようになり 0.9.x が 28 Mar 2019 からリリースされている。
- nvm-windows の最新バージョンが 1.1.7 - Maintenance Release(2 Aug 2018 リリース)なので nodist の方がメンテナンスされている模様。
という状況でしたので、nodist の 0.9.1 を引き続き使用します。
Node.js を 12.16.3 へ、npm を 6.14.5 へバージョンアップする
https://nodejs.org/ja/ を見ると Node.js の推奨版は 12.16.3 LTS でした。
Node.js を 12.16.3 にバージョンアップします。
npm の最新バージョンは https://github.com/npm/cli/releases を見ると 6.14.5 でした。
6.14.5 にバージョンアップします。。。が、nodist npm global 6.14.5
を実行するとなぜかファイルを最後までダウンロードできません。
ブラウザから https://codeload.github.com/npm/cli/tar.gz/v6.14.5 にアクセスして cli-6.14.5.tar.gz をダウンロード・解凍した後、D:\Nodist\npmv\6.14.5 にコピーします。
残りのコマンドを実行します。手動でファイルをダウンロードしたので nodist npm 6.14.5
を実行する必要がありました。またプロジェクト直下に node-tar-extract フォルダが作成されていたので削除しました。
モジュールを最新のバージョンにする
バージョンアップ可能なモジュールを確認します。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、prettier、stylelint + stylelint-config-standard は別に章を分けてバージョンアップする。
- バージョンアップは
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 acorn@7.1.1
npm install --save-dev autoprefixer@9.7.6
npm install --save-dev axios@0.19.2
npm install --save-dev browser-sync@2.26.7
npm install --save-dev http-proxy-middleware@1.0.3
npm install --save-dev jquery@3.5.1
npm install --save-dev jquery-mockjax@2.5.1
npm install --save-dev nock@12.0.3
npm install --save-dev rimraf@3.0.2
npm install --save-dev uglifyjs-webpack-plugin@2.2.0
npm install --save-dev webpack@4.43.0
npm install --save-dev webpack-cli@3.3.11
npm install --save-dev xhr-mock@2.5.1
npm install
コマンドを実行してから(npm scripts の postinstall の処理を実行するため) npm test
コマンドを実行すると全てのテストが成功しました。
npm run build
コマンドは終了はしましたが、Replace Autoprefixer browsers option to Browserslist config. ...
というメッセージが表示されました。
最後に表示されていた Browserslist: caniuse-lite is outdated. Please run next command npm update
を Web で検索すると https://github.com/postcss/autoprefixer/issues/1184 が見つかりました。npx browserslist@latest --update-db
を実行します。
コマンド実行後は Replace Autoprefixer browsers option to Browserslist config. ...
というメッセージは消えませんでしたが、Browserslist: caniuse-lite is outdated. Please run next command npm update
のメッセージは表示されなくなりました。
clean タスク実行 → Rebuild Project 実行 → build タスク実行は問題なく BUILD SUCCESSFUL のメッセージが出力されて成功し、
gebTest タスクも BUILD SUCCESSFUL のメッセージが出力されて成功しました。
今回は browser-sync と http-proxy-middleware をバージョンアップしたので npm run springboot
で起動してみましたが、TypeError: httpProxyMiddleware is not a function
というメッセージが表示されて起動しませんでした。
https://github.com/chimurai/http-proxy-middleware を見ると const { createProxyMiddleware } = require('http-proxy-middleware');
という書き方に変わっていたので、bs-springboot-config.js を以下のように変更します。
const {createProxyMiddleware} = require("http-proxy-middleware"); const proxy = createProxyMiddleware( [ // /css, /js, /vendor と *.html は Tomcat に転送しない "!/css/**/*", "!/js/**/*", "!/vendor/**/*", "!/**/*.html", "/**/*" ], {target: "http://localhost:8080"} ); ..........
var httpProxyMiddleware = require("http-proxy-middleware");
→const {createProxyMiddleware} = require("http-proxy-middleware");
に変更します。var proxy = httpProxyMiddleware(
→const proxy = createProxyMiddleware(
に変更します。
npm run springboot
を実行すると今度は browser-sync が起動しました。Web アプリを起動してブラウザから画面へのアクセスしても問題ありませんでした。
Replace Autoprefixer browsers option to Browserslist config.
のメッセージが表示されないようにする
browsers
の設定項目があるファイルがあるか検索したところ postcss.config.js の中に browsers: ["last 2 versions"]
という記述がありました。これが原因と思われるので以下のように変更します。
module.exports = { plugins: [ require("stylelint"), require("autoprefixer")({ browserlist: ["last 2 versions"] }), require("cssnano")({ preset: "default" }) ] };
browsers: ["last 2 versions"]
→browserlist: ["last 2 versions"]
に変更します。
npm run build
コマンド実行時に Replace Autoprefixer browsers option to Browserslist config.
のメッセージが表示されなくなり、
npm run springboot
コマンド実行時にもメッセージが表示されなくなりました。
履歴
2020/05/06
初版発行。
Spring Boot + npm + Geb で入力フォームを作ってテストする ( その84 )( WebDriver を最新バージョンに上げる )
概要
記事一覧はこちらです。
何回かに分けて boot-npm-geb-sample プロジェクトのモジュールやツールを 2020/05 時点の最新バージョンにします。IntelliJ IDEA は 2020.1.1、JDK は AdoptOpenJDK 11.0.7+10.2 を使用します。
- 今回の手順で確認できるのは以下の内容です。
- WebDriver を最新バージョンに上げて動作するようにします。
参照したサイト・書籍
目次
- WebDriver のバージョンを最新にする
- build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する
- Selenium と Geb を最新バージョンにする
- 結局テストが成功するようになったのは sleep(500) でした。。。
- gebTest タスク実行時に
WARNING: An illegal reflective access operation has occurred
が出ているのを解消する
手順
WebDriver のバージョンを最新にする
動作確認をする前に Chrome と Firefox のWebDriver を最新バージョンにします。Chrome の WebDriver は https://chromedriver.chromium.org/ を見ると Current stable release は 81.0.4044.69、Firefox の WebDriver は https://github.com/mozilla/geckodriver/releases を見ると 0.26.0 でした。
build.gradle の以下の点を変更します。
webdriverBinaries { chromedriver "81.0.4044.69" geckodriver "0.26.0" }
chromedriver "73.0.3683.68"
→chromedriver "81.0.4044.69"
に変更します。geckodriver "0.24.0"
→geckodriver "0.26.0"
に変更します。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
また chromedriver、geckodriver の exe もダウンロードして D:\chromedriver\81.0.4044.69
、D:\geckodriver\0.26.0
の下に配置した後、src/test/resources/GebConfig.groovy の以下の点を変更します。
//System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.24.0/geckodriver.bat") //System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe") driver = { ..........
D:/geckodriver/0.24.0/geckodriver.bat
→D:/geckodriver/0.26.0/geckodriver.bat
に変更します。D:/chromedriver/73.0.3683.68/chromedriver.exe
→D:/chromedriver/81.0.4044.69/chromedriver.exe
に変更します。
build タスクと gebTest タスク、及び IDEA から Geb のテストを実行した時の現在の状況を確認する
clean タスク実行 → Rebuild Project 実行 → build タスク実行を行うと compileTestGroovy タスクで警告のメッセージが出ますが、BUILD SUCCESSFUL のメッセージが表示されます。Spring Boot + npm + Geb で入力フォームを作ってテストする ( その83 )( Checkstyle を 8.11 → 8.19 へ、PMD を 6.6.0 → 6.13.0 へバージョンアップ+JUnit 5 の導入+ Oracle JDK 8u202 → AdoptOpenJDK 11.0.2+9 へ、error-prone を 2.3.1 → 2.3.3 へバージョンアップする) と同じ状況ですので、これは OK。
Web アプリを起動してから gebTest タスクを実行してみると、こちらも BUILD SUCCESSFUL のメッセージが表示されました。
次は IDEA から Geb のテストを実行してみます。src/test/resources/GebConfig.groovy の上に記述している WebDriver のパスの設定のコメントを解除してから、
System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.26.0/geckodriver.bat") System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe") driver = { ChromeOptions chromeOptions = new ChromeOptions() new ChromeDriver(chromeOptions) // FirefoxOptions firefoxOptions = new FirefoxOptions() // new FirefoxDriver(firefoxOptions) }
src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy を開いてテストを実行します。
Chrome は一部のテストが失敗しました。動きを見ていると画面遷移時にカーソルが正しい入力項目に移動しないように見えます。Headless モードでは成功するのに。。。
Firefox に切り替えてテストを実行すると、
System.setProperty("webdriver.gecko.driver", "D:/geckodriver/0.26.0/geckodriver.bat") System.setProperty("webdriver.chrome.driver", "D:/chromedriver/81.0.4044.69/chromedriver.exe") driver = { // ChromeOptions chromeOptions = new ChromeOptions() // new ChromeDriver(chromeOptions) FirefoxOptions firefoxOptions = new FirefoxOptions() new FirefoxDriver(firefoxOptions) }
こちらはすべてのテストが成功しました。
Selenium と Geb を最新バージョンにする
Headless モードでない Chrome でテストが失敗する原因が分からないため、Selenium と Geb を最新バージョンにしてみます。
build.gradle の dependencies block の以下の点を変更します。
dependencies { .......... def seleniumVersion = "3.141.59" .......... .......... // for Geb + Spock testImplementation("org.gebish:geb-spock:3.4") { exclude group: "org.codehaus.groovy", module: "groovy-all" } 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}") .......... }
def seleniumVersion = "3.13.0"
→def seleniumVersion = "3.141.59"
に変更します。testImplementation("org.gebish:geb-spock:2.3.1")
→testImplementation("org.gebish:geb-spock:3.4")
に変更します。
変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。
起動している Web アプリを停止してから build し直した後、再度 Web アプリを起動します。
src/test/resources/GebConfig.groovy の設定を Chrome に切り替えてから src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy のテストを実行してみましたが、状況は変わりませんでした。。。
結局テストが成功するようになったのは sleep(500) でした。。。
Web で検索してみたところ以下のページを見つけて document.readyState や jQuery.active の状態を見るようにしてみましたが、状況は変わりません。
- Selenium WebDriver: Wait for complex page with JavaScript to load
https://intellipaat.com/community/5115/selenium-webdriver-wait-for-complex-page-with-javascript-to-load
結局いろいろ試してみた結果、テストが成功するようになったのは form.btnXxxx.click(...) の後に sleep(500)
を追加した場合でした。src/test/groovy/geb/gebspec/inquiry/InquiryTestSpec.groovy を以下のように変更します(全てのテストを同様に変更します)。
def "入力画面1に入力後、入力画面2へ遷移→入力画面1へ戻ると入力した値が表示される"() { given: "入力画面1を表示する" to InquiryInput01Page when: "最大文字数の文字を入力して次へボタンをクリックする" form.setValueList(maxLengthValueList) form.btnNext.click(InquiryInput02Page) sleep(500) then: "入力画面2へ遷移し初期値が表示されている" form.assertValueList(initialValueList) and: "戻るボタンをクリックする" form.btnBack.click(InquiryInput01Page) sleep(500) then: "入力した最大文字数の文字が入力されている" form.assertValueList(maxLengthValueList) }
もっと適切な修正方法があるとは思うのですが、さっぱり分かりませんでした。。。
gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred
が出ているのを解消する
Selenium と Geb を最新バージョンにしたら gebTest タスク実行時に WARNING: An illegal reflective access operation has occurred
が出るようになっていましたので、出ないようにします。
to method
が出力されている行(例えば WARNING: Illegal reflective access by ... to method java.util.function.Predicate....
)のパッケージ名を見て build.gradle の以下の点を変更します。
// JDK 11 に変更後、test タスク実行時に groovy と powermock が JDKの内部部分にアクセスするためにコードでリフレクションを使用 // していて WARNING が出るため、JVM の起動時オプションの --add-opens を指定して WARNING が出ないようにする def jvmArgsAddOpens = [ "--add-opens=java.base/java.io=ALL-UNNAMED", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED", "--add-opens=java.base/java.lang.ref=ALL-UNNAMED", "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED", "--add-opens=java.base/java.math=ALL-UNNAMED", "--add-opens=java.base/java.net=ALL-UNNAMED", "--add-opens=java.base/java.nio.charset=ALL-UNNAMED", "--add-opens=java.base/java.security=ALL-UNNAMED", "--add-opens=java.base/java.time=ALL-UNNAMED", "--add-opens=java.base/java.util=ALL-UNNAMED", "--add-opens=java.base/java.util.function=ALL-UNNAMED", "--add-opens=java.base/java.util.regex=ALL-UNNAMED", "--add-opens=java.base/java.util.stream=ALL-UNNAMED", "--add-opens=java.desktop/java.beans=ALL-UNNAMED" ] ..........
- jvmArgsAddOpens に以下のオプションを追加します。
"--add-opens=java.base/java.math=ALL-UNNAMED"
"--add-opens=java.base/java.time=ALL-UNNAMED"
"--add-opens=java.base/java.util.function=ALL-UNNAMED"
gebTest タスクを実行して WARNING: An illegal reflective access operation has occurred
が出なくなったことを確認します。
履歴
2020/05/06
初版発行。
IntelliJ IDEA 2020.1 新機能メモ書き(といいつつ既存機能を初めて知ったりもする)
概要
記事一覧はこちらです。
IntelliJ IDEA 2020.1 にバージョンアップしたので新機能を確認した時のメモ書きです。
参照したサイト・書籍
- What’s New in IntelliJ IDEA 2020.1
https://www.jetbrains.com/idea/whatsnew/
目次
- In-editor Javadocs rendering
- Code Vision
- Zen Mode(新機能)と Presentation Mode(既存機能)
- Smart Grammar and Spell Checker
- Quick Definition(既存機能)と Quick Type Definition(新機能)
手順
In-editor Javadocs rendering
ソースコード上に記述した JavaDoc を IntelliJ IDEA のエディタ上でレンダリングしてくれる機能です。Settings ダイアログを開き Editor -> General -> Appearance の中で「Renter documentation comments」をチェックすると常時 JavaDoc がフォーマットされて表示されます。
ただし使ってみた感想としては、通常は JavaDoc のコードで表示しておいてフォーマットして表示したい時だけ切り替えたいところ。この場合には Ctrl+Alt+Q を押せば切り替えられます。
Code Vision
IntelliJ IDEA のエディタ上にクラス・インターフェースやメソッドの使用数、実装数を表示してくれる機能です。Settings ダイアログを開き Editror -> Inlay Hints -> Java の「Code Vision」の「Usages」「Inheritors」をチェックすると表示されます。
使用数、実装数はリンクになっており、マウスでクリックすると一覧が表示されて使用先、実装先へジャンプすることが出来ます。
個人的には使用先や実装先はそんなに頻繁に参照しないので、この機能は通常は OFF かな。
Zen Mode(新機能)と Presentation Mode(既存機能)
Zen Mode とはこの画面から、
メインメニューで View -> Appearance -> Enter Zen Mode を選択すると、
こうなる Mode です。エディタ部分を全画面にしたかったのですが、その方法は分かりませんでした。
メインメニューで View -> Appearance -> Exit Zen Mode を選択すると元に戻ります。
個人的にはエディタのタブをクリックして全画面にした方が使い勝手がいいかな、という気がしています。
Zen Mode は使う場面が分からなかったのですが、試している時に気づいた Presentation Mode は人にソースを見せながら説明するのに便利そうです。
View -> Appearance -> Enter Presentation Mode を選択するとソースコードが全画面で大きく表示されます(下の画像は一番最初の画像と同じサイズです、文字がとても大きく表示されています)。
こちらも View -> Appearance -> Exit Presentation Mode を選択すると元に戻ります。
Smart Grammar and Spell Checker
以前 Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( 番外編 )( IntelliJ IDEA の Grazie・GitToolBox プラグインを追加する ) でインストールした Grazie プラグインが 2020.1 から bundle されたとのこと。
Settings ダイアログを開き Editor -> Proofreading -> Grammar に設定があります。Java, Javascript はデフォルトではチェックされていませんが、チェックしておきます。
Quick Definition(既存機能)と Quick Type Definition(新機能)
Quick Definition は型やメソッドにカーソルを移動してから Ctrl+Shift+I(あるいはメインメニューから View -> Quick Definition)を押すと、実際のソースにジャンプせずにポップアップで実装を確認できる機能です。既存機能とのこと(知りませんでした。。。)
ただしこの機能は変数の上では機能しません。変数にカーソルを移動してからポップアップで実装を確認できるようにしたのが Quick Type Definition です。デフォルトではショートカットは割り当てられておらず、メインメニューから View -> Quick Type Definition を選択すると機能します。
これは良く使いそうな気がします。ショートカットがないのが残念なので Ctrl+Shift+@ を割り当てることにします。
履歴
2020/05/03
初版発行。