不同语言环境的测试自动化?

软件测试 自动化测试
2022-01-22 16:32:30

我已经开始使用一种语言的产品的自动化,并且很快就会被移植到另一种语言中。唯一的好处是——测试自动化才刚刚开始。

所以有两件事让我担心 - 测试脚本和测试数据中的硬编码字符串(应用程序标题、警报消息等),应根据区域设置键入。

我正在考虑使用一个全局变量来指示要执行测试的语言环境,然后决定要在测试方法中使用的字符串/测试数据。

现在考虑我将测试中的字符串外部化,然后决定在我的测试方法中使用哪种语言的字符串,所以我可以做类似的事情 -

 public void myAweSomeMethodWorkingInAllLocales() { 
   if(locale is fr) {
     testDataFile=privateLocation/frTestDataForThisLocale
     testStringFile=privateLocation/frAPPStringForThisLocale
   } else if (locale is in) {
     testDataFile=privateLocation/inTestDataForThisLocale
     testStringFile=privateLocation/inAPPStringForThisLocale       
  }
  //Carry Out my Super tests here
  }

但是我发现在我的每种测试方法中都这样做有点麻烦。我可以改进它吗?

4个回答

测试国际化和本地化还有许多其他方面,以及其他攻击问题的方法我认为您正在尝试解决,但我会限制我对您的具体问题的回答。

我建议从您的测试套件中删除所有硬编码的语言环境引用,而是让整个测试套件针对您通过命令行参数、属性文件或环境变量指定的单个语言环境进行测试。然后,而不是这样做......

if(locale is fr) {
  testDataFile=privateLocation/frTestDataForThisLocale
  testStringFile=privateLocation/frAPPStringForThisLocale
} else if (locale is in) {
  testDataFile=privateLocation/inTestDataForThisLocale
  testStringFile=privateLocation/inAPPStringForThisLocale       

}

...我会这样做:

 testDataFile=getTestDataForThisLocale(the-locale-we-are-testing-this-time)
 testStringFile=getAppStringsForThisLocale(the-locale-we-are-testing-this-time)

如果要测试两个语言环境,可以运行测试套件两次。这使您不再需要在整个测试套件中嵌入依赖于语言环境的 if 语句。

我在这里写了一段时间的博客这些是我在为 28 种语言的产品开发测试自动化解决方案时遇到的一些陷阱。

我永远不会对任何字符串进行硬编码——实际上你的自动化根本不应该依赖它们。根据被测产品的架构,您应该从开发中获得支持,以确保 UI 上的每个控件都有一个唯一的静态标识符。例如,对于基于 HTML 的 UI,可以使用“id”属性。我相信 Win32 控件也可以分配标识符。

维护字符串文件是一种不好的方法,如果字符串发生变化(例如在新版本中或由于本地化错误而导致的错误修复),您将需要更新此类文件。

如果您使用某种唯一标识符,您的自动化可能适用于许多版本,除非发生重大 UI 大修。

如果您的应用程序支持 Unicode,那么我真的不明白按语言或语系隔离输入或输出测试数据的原因。如果您在产品代码中的某个地方在 ANSI 和 Unicode 之间切换,那么您肯定会遇到一些问题,并且使用 Unicode 范围内的广泛字符进行测试将比基于语言的资源更快地解决这些问题。

但是,这尤其是随机测试数据生成变得有价值的情况。甚至特定于语言环境的测试数据。无需跳过一堆 else if 或 switch/case 语句,您可以将“locale”参数传递给采用语言/语言环境参数的“GetString()”方法。

设计良好的随机字符串生成器可以按语系、语言等或混合生成字符串。我现在也在研究一种可以生成看起来像真实句子的方法,或者从特定于语言环境的文档中获取文本,随机化单词并吐出句子、段落等。

或者,如果您使用静态文件来读取测试数据,您也可以让系统完成这项工作。如果您有一个以每个语言环境/语言代码命名的文件,您可以以编程方式检测当前语言代码,然后只需读入该文件。

            string testDataFileName = "testdata.txt";

        CultureInfo ci = CultureInfo.CurrentCulture;
        string isoLanguage = (ci.ThreeLetterISOLanguageName);

        string path = Path.GetFullPath(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
        try
        {
            using (StreamReader readFile = new StreamReader(
                Path.Combine(path, string.Concat(isoLanguage, testDataFileName))))
            {
                //do stuff
            }
        }
        catch (FileNotFoundException)
        {
            // handle file not found exceptions
        }

在这种情况下,我得到了 3 个字母的 ISO 语言名称(完整列表位于http://www.loc.gov/standards/iso639-2/php/code_list.php),并将其添加到文件名或扩展名和然后使用流阅读器打开并读取文件的内容。

这消除了在测试启动时传递命令行参数的需要,并且只需添加新的 satic 数据文件即可根据需要扩展到新的语言环境。

多年前,我采用了类似的方法在不同的语言环境下进行测试。它对我来说效果很好。

我在项目的国际化部分使用了类似的东西:http: //strazzere.blogspot.com/2010/04/pseudo-translation-of-strings-as-aid-to.html

我还将所有资源(字符串)外部化,并由专业翻译人员为我翻译。