web自动化断言
图形用户界面(GUI)测试自动化已损坏。 回归测试不是测试; 它是软件行为的版本控制。 这是我的断言: 没有 断言的测试自动化效果更好!
在软件开发和测试自动化中,断言是一种检查计算结果的方法,通常将其与单个预期值进行比较。 尽管这非常适合基于单元的测试自动化(即,从内部测试系统),但已证明将其应用于测试界面(特别是用户界面)是有问题的,正如本文将解释的那样。
根据测试,特性测试和批准测试的黄金大师方法工作的工具(例如, 批准测试 , Jest或recheck-web ( 重新测试 ))的数量正在不断增加。 这种方法可以在进行更彻底的测试的同时,以更少的精力(创建和维护)实现更强大的测试。
基本Selenium测试
这是在Web应用程序的登录页面上运行的传统测试的简单示例。 使用Selenium作为测试框架,代码可能如下所示:
public
class MySeleniumTest
{
RemoteWebDriver driver
;
@ Before
public
void setup
(
)
{
driver
=
new ChromeDriver
(
)
;
}
@ Test
public
void login
(
)
throws Exception
{
driver.
get
(
"https://assets.retest.org/demos/app/demo-app.html"
)
;
driver.
findElement
( By.
id
(
"username"
)
) .
sendKeys
(
"Simon"
)
;
driver.
findElement
( By.
id
(
"password"
)
) .
sendKeys
(
"secret"
)
;
driver.
findElement
( By.
id
(
"sign-in"
)
) .
click
(
)
;
assertEquals
( driver.
findElement
( By.
tagName
(
"h4"
)
) .
getText
(
)
,
"Success!"
)
;
}
@ After
public
void tearDown
(
)
throws InterruptedException
{
driver.
quit
(
)
;
}
}
这是一个非常简单的测试。 它将打开一个特定的URL,然后通过其不可见元素ID查找输入字段。 输入用户名和密码,然后单击登录按钮。
按照当前的最佳实践,此测试然后使用单元测试库通过assert语句检查正确的结果。
在此示例中,测试确定文本“ Success!”是否成功。 被展示。
您可以运行几次测试来验证成功,但是经历失败也很重要。 要创建错误,请更改要测试的网站HTML。 例如,您可以编辑CSS声明:
< link href = _ "./files/main.css" _ rel = _ "stylesheet" _ >
更改或删除URL的单个字符(例如,将“ main”更改为“ min”)会将网站更改为显示为原始HTML,而没有布局。
这个小的变化绝对是一个错误。 但是,执行测试时,它没有问题,仍然可以通过。 完全忽略这种明显的错误显然不是您对测试的期望。 他们毕竟应该防止您非自愿地破坏您的网站。
现在改为更改或删除输入字段的元素ID。 由于这些ID是不可见的,因此从用户的角度来看,此更改不会对网站造成任何影响。 但是执行测试时,它将失败,并显示NoSuchElementException 。 这从根本上意味着这种无关紧要的变化打破了考验 。 忽略主要更改但由于看不见且因此不相关而失败的测试是测试自动化的当前标准。 这基本上与测试的行为相反 。
现在,进行原始测试并将驱动程序包装在RecheckDriver中:
driver = new RecheckDriver ( new ChromeDriver ( ) ) ;
然后用调用driver.capTest()替换断言; 在测试结束时或添加Junit 5规则: @ExtendWith(RecheckExtension.class) 。 如果从网站上删除CSS,则测试将失败,因为它应该:
但是,如果您改为更改或删除元素ID,则测试仍会通过。
下面将详细说明这种令人惊讶的功能,它来自recheck-web的“牢不可破”功能。 这就是测试的行为方式:检测对用户重要的更改,并且不要中断与用户无关的更改。
这个怎么运作
recheck-web项目是一个免费的开源工具,可在Selenium之上运行。 它是基于黄金母版的,这实际上意味着它在第一次执行测试时就创建了渲染网站的副本,并且随后的测试运行将当前状态与该副本进行比较(黄金母版)。 这样可以检测到网站以不利的方式发生了变化。 这也是它在ID更改后仍然可以标识元素的方式:它只是窥探黄金主数据(ID仍然存在的地方)并在那里找到该元素。 通过使用XPath,HTML名称和CSS类之类的其他属性,recheck-web可以识别更改后的网站上的元素,并将其返回给Selenium。 然后,测试可以像以前一样与元素进行交互,并报告更改。
黄金大师测试的问题
总体而言,黄金大师测试有两个基本缺陷:
- 通常很难忽略无关紧要的变化。 许多更改没有问题(例如,日期和时间更改,随机ID等)。 由于Git具有.gitignore文件的原因, recheck -web具有recheck.ignore文件的原因。 而且其类似Git的语法使您可以轻松指定要忽略的差异。
- 保持冗余通常很麻烦。 黄金大师通常有很多重叠之处。 通常,相同的更改必须多次批准,从而使快速测试创建过程中获得的效率无效。 为此,重新检查带有其自己的命令行界面(CLI) ,可以完成这项烦人的任务。 CLI(和商业GUI )使用户可以轻松地在所有实例中将相同的更改应用于相同的元素,或者仅一次应用或忽略所有更改。
上面的示例说明了缺点和相应的解决方案:检测到更改的ID,但未报告,因为recheck.ignore文件中的ID属性已指定为使用attribute = id忽略。 删除该规则会使测试失败,但不会中断 (测试仍将执行并报告更改的ID)。
示例测试使用隐式检查机制,该机制会在每次操作后自动检查结果。 (请注意,如果您希望进行显式检查(例如,通过调用re.check ),则完全可以。)打开URL,输入用户名和输入密码是在同一页面上执行的三个操作,因此为同一页面创建了三个黄金母版。 因此,更改后的ID被报告了3次。 只需一次调用即可在命令行上重新检查commit --all tests.report ,从而可以处理所有三个实例。 应用更改会使recheck-web测试失败,因为该ID已从黄金主服务器中删除。 这需要recheck -web的另一个简洁功能: retestId 。
虚拟常量ID
retestId的基本思想是在网站的副本中引入一个附加属性。 由于此属性仅存在于网站副本中,而不存在于实时站点中,因此它永远不会受到更改的影响(除非元素被完全删除)。 这称为虚拟常量ID 。
现在,可以在测试中引用此retestId 。 只需将对By._id _(“ username”)的调用替换为By._retestId _(“ username”) , 即可彻底解决此问题。 这也解决了元素因为没有ID开头而难以引用的情况。
过滤机制
没有.gitignore文件,Git会是什么? 过滤掉无关的更改是版本控制系统的最重要功能之一。 传统的基于断言的测试会忽略超过99%的更改。 相反,类似于没有.gitignore文件的Git,recheck-web报告所有更改。
过滤机制既简单又强大(基于.gitignore文件)。 单个属性可以全局或针对某些元素进行过滤。 单个元素,甚至页面的整个部分,都可以忽略。 如果此功能不够强大,则可以在JavaScript中实现过滤规则,例如,忽略具有相同基数或位置差小于5个像素的不同URL。
了解这一点的一个很好的起点是随recheck-web一起分发的预定义过滤器文件 。 忽略元素定位通常是一个好主意。 如果您想了解有关如何维护recheck.ignore文件或创建自己的过滤器的更多信息,请参阅文档 。
摘要
Recheck-web是少数可用的基于大师的黄金测试工具之一; 替代方法包括批准测试和开玩笑。
Recheck-web提供了快速,轻松地创建比传统测试更加完整和强大的测试的功能。 因为它可以比较渲染的网站(或网站的一部分),所以可以实现跨浏览器测试,跨平台测试和其他测试方案。 同样,这种测试是一种“使能器”技术,它将使人工智能能够生成其他测试。
Recheck-web是免费的开放源代码,因此请尝试一下 。 该公司的业务模型是提供附加服务(例如,存储黄金母版和报告以及用于生成测试的AI),并在CLI之上具有用于维护黄金母版的商业GUI。
翻译自: https://opensource.com/article/19/10/test-automation-without-assertions
web自动化断言