Cucumber结合Java传递非英文字符串参数时'é'显示为'?'如何解决
Java+Cucumber传递非英文字符参数乱码(特殊字符显示为?)修复方案
问题复现
使用Java结合Cucumber框架开展自动化测试时,feature文件中带法语特殊字符(如é)的字符串传入步骤定义方法后会被解析为?,例如传入字符串Décoration murale,控制台打印结果为D?coration murale,复现代码如下:
Feature文件代码
@tag Feature: String Verifcations @PassNonEnglishCharacters Scenario Outline: Verify non English parameters Given I have my driver ready Then I print collection "<collection>" name on console Examples: | collection | | Décoration murale |
步骤定义Java代码
@Then("^I print collection \"([^\"]*)\" name on console$") public void i_print_collection_name_on_console(String collection) throws Throwable { System.out.println("Collection:" +collection); }
异常控制台输出
Collection:D?coration murale
问题原因
乱码核心原因是测试全链路编码未统一为UTF-8,问题通常出在三个环节:
- feature文件存储编码不是UTF-8
- Cucumber解析资源文件时未指定UTF-8编码
- JVM运行、控制台输出时默认使用系统非UTF-8编码(Windows系统默认GBK编码时极易出现该问题)
修复步骤
按以下顺序配置即可实现非英文字符正常传递识别:
- 修改feature文件编码为UTF-8
IDEA环境下点击编辑器右下角的当前文件编码标识,选择UTF-8,弹出提示时选择Convert完成编码转换;Eclipse环境下右键feature文件,依次选择Properties -> Resource -> Text file encoding,选中UTF-8后保存文件。 - 配置构建工具编码参数
- Maven项目:在
pom.xml中为maven-surefire-test插件添加UTF-8编码配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <configuration> <argLine>-Dfile.encoding=UTF-8</argLine> <encoding>UTF-8</encoding> </configuration> </plugin> - Gradle项目:在
build.gradle中添加测试任务编码配置:test { systemProperty "file.encoding", "UTF-8" }
- Maven项目:在
- 配置IDE全局编码与运行参数
IDEA中打开Settings -> Editor -> File Encodings,将Global Encoding、Project Encoding、properties文件默认编码全部设置为UTF-8,勾选Transparent native-to-ascii conversion选项;在测试运行配置的VM options字段中添加-Dfile.encoding=UTF-8参数。 - 配置完成后重新运行测试,控制台将正常输出
Collection:Décoration murale,非英文字符可被正确识别传递。
内容的提问来源于stack exchange,提问作者Tajinder Singh
相关产品推荐
相关产品推荐

