一句话介绍一下,因为没有良好的自动化测试框架设计,因此印度测试团队招聘了5名实习生进行复制黏贴代码。
这个故事大约发生在2012年左右,当时所在的测试组织已经广泛开展UI自动化,使用Selenium RC实现了大约10K级别的自动化用例,并逐步在向Selenium Webdriver进行迁移。而从业务的角度来讲,也希望将这些UI自动化用例用于L10N测试,也就是在上海的本地化团队能复用这些自动化用例,用于他们的中日韩三国语言版本的测试。
一个在英文版上写就的UI自动化用例,如何在中文版的app上运行呢? 大概很多同学会说,用id/name这些属性来定位元素就可以了,这没什么大不了的。但是实际项目中,id等元素是前端框架动态生成,定位还是要大量地依靠文本信息,如 OK、Next按钮上的文字。(题外话:当时这款产品还刚刚花迁移到extJS这个前端框架上,为了提供给用户在线使用Excel的感觉。而这个结果是光为了提供Table这个控件的各种NB功能,自动化测试框架用了7000行的代码进行了封装 )。
那么就带来了一个问题,以下这样的用例是无法用于多语言版本的测试的。
@Test
public
void testNavigateToNews() {
selenium.open("/");
selenium.click("link=新闻");
selenium.waitForPageToLoad("3000");
assertTrue(selenium.getTitle().contains("百度新闻"),
"页面标题应包含'百度新闻'");
}
而为了能够实现让一套测试用例可以运行在多种语言版本上,做了类似如下的改造,
//抽取的中文字符串常量
private static String BAIDU_HOME_URL = "https://www.baidu.com";
@Locator(ID=123)
private static String NEWS_LINK_TEXT = "新闻";
@Locator(id=124)
private static final String NEWS_PAGE_TITLE_KEYWORD = "百度新闻";
@Locator(id=125)
private static final String ASSERTION_ERROR_MSG = "页面标题应包含'%s'";
@Test
public void testNavigateToNews() {
selenium.open("/");
selenium.click("link="+ NEWS_LINK_TEXT);
selenium.waitForPageToLoad("3000");
assertTrue(selenium.getTitle().contains(NEWS_PAGE_TITLE_KEYWORD),
String.format(ASSERTION_ERROR_MSG,NEWS_PAGE_TITLE_KEYWORD))
}
也就是说,将需要用于定位的元的locator抽取出来,放到一个资源包中(如内存数据库,或者就是一个MAP中),并在运行时,根据 资源ID+语言的方式去查找出所需要的文本内容。例如,
ID | LAN | VALUE |
---|---|---|
123 | ZH | 确定 |
123 | EN | OK |
实习生的工作就就是为这些用例中各种所使用到的locator的资源包准备好(英文即可,其它语言L10N团队会负责),并将相应的测试用例修改完毕。
看上去这是一个虽然有些枯燥,但还算咬咬牙能干的事情。为啥要找实习生来做呢,还找个5个!问题出在哪里呢?
在一次关于Selenium自动化测试的内部分享讨论当中,笔者得知了这件事情,并把对方的测试用例拿来看了一下,终于明白过来了,原来他们在测试用例中直接使用了locator 元素,没有对其进行合理封装。
那么导致的一个后果就是,如果一个界面上的某个元素被100个测试用例使用到,那么就需要修改100遍,而不是预期中的1遍!
无论是曾经或者是刚入门UI自动化的同学来讲,POM( Page Object Model)已经被视为是UI自动化测试的一个基本准则。它是随着 Selenium Webdirver一同发布的一个UI自动化测试设计模式。当然这个故事发生在POM被广泛传播之前。
所以这个问题的解法是应该将各个页面以POM模式首先进行封装,然后再进行使用(当然实际工作中还要进一步进行横向和纵向的封装,为此,笔者曾经写过一篇文章讲到了在POM模式之外的组合与继承POM模式,发表在朱少民老师的微信公众号中。)
在POM模式发布之前,笔者印象当中,曾经看到过Selenium作者Jason Huggins的一段话,意思是如果你在测试用例中看到了Selenium,那么这事你做过了。(原话记不清了,是一张图片上的,互联网和豆包都找不到了。内部的培训分享上我用过)。
这句话和POM的意思是,不能将工具层的内容与测试用例代码进行耦合,不然就会导致本文所说到的印度人请5个实习生做复制黏贴的故事。
当然,在现有常见的POM案例中,还是会在测试用例中传入一个webdriver对象,这也是一个问题,就不展开了。毕竟这个时代后面随着LLM的广泛使用,UI自动化会迎来一个新的模式。