首先描述一下我们的测试环境,为了保证测试的隔离性,我们在每个测试开始之前会进行清库操作以及初始数据的准备操作,以及其他的环境属性配置,测试完成之后也会进行数据的预期比对操作。所有的数据一开始存放在excel当中。
实际测试情况如下:
在IDE(idea 或 eclipse)中测试全部测试通过
在Windows环境中通过maven测试 固定比例的测试失败
在Linux环境中 通过maven测试 全部测试通过
后来发现,由于部分的测试需要数据库初始化脚本里面的数据,如下所示:
这些脚本的名称与测试封装接口相同,在测试之前会自动读取这个脚本并进行数据库操作,注意到这里面涉及到中文字符,正是这些中文字符导致了windows环境中maven测试失败的。
当时查询数据库,发现数据库中对应的数据都是乱码的,然后确定是使用的编码不对。代码如下:
public static String[] loadFileAsStringArray(String resoureLocation, String delimiter) {
try {
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource(resoureLocation);
File file = resource.getFile();
// 这里读取文件使用的默认编码
String content = FileUtils.readFileToString(file, Charset.defaultCharset());
String[] arr = content.split(delimiter);
List<String> retList = new ArrayList<String>();
for (String a : arr) {
if (StringUtils.isNotBlank(a)) {
retList.add(a.trim());
}
}
return retList.toArray(new String[retList.size()]);
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw new RuntimeException("解析文件失败", e);
}
}
以上读取文件使用了默认编码,注意此处的默认其实是依赖环境的,与"默认大于约定"里面的默认不一样,在ide里面设置的为utf-8,linux下也是utf-8,但是windows下为gbk。所以才导致了windows下的乱码问题。
修改对应代码如下即可:
String content = FileUtils.readFileToString(file, Charset.forName("utf-8"));
默认不代表确定性,可能依赖于环境,此时就需要格外注意了。