使用TestNG运行本地化测试

问题描述

我被困在这里

我的情况: 我正在用TestNG运行测试,在其中我调用了第三方库的函数。该库使用Locale.getDefault()初始化。

要独立于运行测试的计算机获得相同的测试结果,我想设置一个特定的区域设置,然后将其重置。 不幸的是,尽管我可以将Locale设置为所需的值,但是似乎其他一些测试(不在同一testClass中)失败了……可能是由于格式问题(本地化)。

private Locale locale;

@BeforeClass
public void init() {
    locale = Locale.getDefault();
    Locale.setDefault(Locale.US);
}

@AfterClass
public void teardown() {
    Locale.setDefault(locale);
}

@Test(dataProvider = "someDataProvider")
public void testThisWithUSLocale(String element) throws Exception {
    String resultToTest = myClass.createSomething(element);

    Assert.assertFalse(resultToTest.isEmpty());
}

我尝试在@BeforeMethod中设置区域设置,但存在相同的问题... 测试是否异步运行?在此测试中设置区域设置是否真的会影响其他测试?

解决方法

在JVM运行时更改语言环境是一个棘手的过程,因此整个应用程序都需要为此做好准备。来自setDefault

的javadocs

由于更改默认语言环境可能会影响许多不同的功能领域,因此仅当调用者准备重新初始化在同一Java虚拟机中运行的对语言环境敏感的代码时,才应使用此方法。

您的测试设置看起来正确,但是无论您的代码(或第三方库)做什么,都可能不支持语言环境的更改。

,

好的,我发现了问题:

最初为FORMAT设置了语言环境。因此,通过在@BeforeClass中运行所有内容,我的测试工作正常,但是在用早先保存的Locale.setDefault(locale);“重置”所有内容之后(以错误的方式),我设置了“所有类别”,而不是只是FORMAT使其他测试失败。正确的是:

private Locale locale;

@BeforeClass
public void init() {
        locale = Locale.getDefault(Locale.Category.FORMAT);
        Locale.setDefault(Locale.Category.FORMAT,Locale.US);
}

@AfterClass
public void teardown() {
        Locale.setDefault(locale);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...