必须存在至少两个关键要素才能正式
将实际的反模式与简单的不良习惯,坏
实践区分开来,或坏主意:
一种常用的过程,结构或动作模式,尽管起初看起来似乎是对
问题的适当而有效的回应,但后果通常更糟而不是有益的结果,
和
存在一个很好的替代解决方案,该解决方案已被证明,可重复且证明是有效的。测试自动化中的反模式,使读取,重用和维护测试变得困难。
已经为单元测试中的反模式创建了类似的目录,但是端到端测试的自动化有所不同本质上来自单元测试。首先,某些模式在单元测试中是反模式,在端到端测试自动化中可能是可以接受的。例如,可以在现有测试中添加一个新的断言而不是创建一个新的测试用例(自由骑行/搭载设计模式),因为在端到端环境中进行设置通常会花费更多时间。其次,有一些专门针对端到端测试自动化的反模式,例如:
测试数据过多,加上SUT DB
在测试中硬编码的环境配置
/>
你能建议别人吗?
#1 楼
单元测试和系统测试自动化有所不同,但是至少有一些单元测试反模式适用,例如专注于快乐路径场景。感谢您包含该链接!在我实现的自动化中,由于我正在测试的旧版Java客户端-服务器系统的结构,我不得不实施GUI自动化。但是,它们也适用于在用户界面上起作用的Web自动化工具,如Selenium。请注意,这适用于键盘/鼠标界面,触摸界面完全是不同的动物,需要对其进行评估。
我将从一个明显的反模式开始:
对Record和回放
我在所有自动化中都实现的替代方法是使用记录的操作来获取GUI元素的结构,然后将它们参数化为一个函数,该函数搜索应用程序接口结构以找到对象。这使GUI自动化可以适应用户界面的结构更改(这经常发生)。测试人员会很快克服并经常忽略。但是,不稳定或不可预测的操作是自动化测试的祸根。即使它们是EBM(“每个蓝色的月亮”)间歇性缺陷,它们仍然会阻止大多数自动化而无需大量重启。
这是我的最爱:
忽略可访问性开发标准
开发这些标准是为了允许残疾人访问软件应用程序。不仅是正确的做法,而且这些标准的实施提高了所有用户的可访问性。采用这些标准的鲜为人知的好处是,对于手动和自动方法,应用程序的可测试性都得到了极大的改善。这些标准的一个方面尤其重要:使应用程序界面可由外部屏幕阅读器应用程序(例如Jaws)读取。不实施可访问性标准将迫使您实施“盲”自动化,这实际上是上面讨论的“记录和回放”方法。
评论
杰夫,您能否详细说明如何提高残疾人的无障碍获取能力来提高产品的可测试性?也许举一些例子?
– dzieciou
2014年5月4日19:15
为了实现可访问性,标准要求您提供传递给外部阅读器的“可访问名称”或“可访问文本”(Web应用程序中为“替代文本”)信息。我使用的每种工具都可以利用该信息(如果存在)。另一个相关要求是键盘的可访问性。用键盘操作代替鼠标单击是一种用于GUI更改其视觉布局的绝佳替代自动化方法。
– Jeff_Lucas
2014年5月4日21:00
软件中的异常并不总是安全问题。在运行时始终会引发异常。未处理的异常不好,但并非所有异常都会带来安全风险。
– Bj Rollison
2014年5月4日22:10
通过键助记符来驱动自动化脚本很少是一个好习惯,特别是如果您需要在本地环境中运行自动化测试时
– Bj Rollison
2014年5月4日在22:12
如果在文本字段中未正确拦截控制代码,则可以利用在GUI上生成堆栈跟踪显示的异常来创建SQL注入攻击。
– Jeff_Lucas
2014年5月5日在2:07
#2 楼
不能在隔离反模式中进行测试为了隔离地运行测试,您通常必须引导一个或多个系统,配置这些系统,设置测试数据,存档测试工件并在安装后销毁设置测试运行。
比较容易的是,仅对某些中央系统测试数据库和共享服务器资源运行端到端测试,每个测试情况具有多个帐户。 >运行测试套件所依赖的(生产)基础架构
并行测试运行可能会相互干扰
测试数据已损坏,并且需要不时进行手动修复
更容易使测试依赖于每个其他
更好的方法是使用CI来使用像Vagrant这样的工具来为每个单独的测试运行提供一个干净的测试环境。
评论
那么孤立运行测试是一种反模式,或者每个测试的增强环境都是反模式还是不单独运行测试?
– dzieciou
2014年5月4日19:12
不孤立测试是反模式,并会导致各种问题。通常,自动化测试不是孤立进行的,因为您需要付出额外的努力来设置一种情况,以自行运行测试套件。
– Niels van Reijmersdal
2014年5月4日19:15
只是为了获得额外的乐趣,有时无法设置自动测试来单独运行。我现在的情况是:一个Web应用程序,它使用并依赖于与大型机接口的许多Web服务。大型机无法区分“测试”和“非测试”,新的(干净的)数据只能通过大型机输入-网络团队无法控制。
–凯特·保罗(Kate Paulk)
2014年5月5日,11:22
@KatePaulk但是wen应用程序通过Web服务与大型机对话,对吗?那你不能嘲笑那些Wev服务吗?
– dzieciou
16年3月16日在18:16
@dzieciou-如此先进。该Web应用程序通过放置在指定目录中的文件中的虚拟打孔卡与大型机“对话”。就Web应用程序而言,数据以神奇的方式出现在数据库中,并将文件丢弃在经过神奇处理的位置。
–凯特·保罗(Kate Paulk)
16 Mar 16 '16 at 19:45
#3 楼
问题:断言是PageObject类的一部分
def varify_edit_link_presence
//BAD: Assertion in page Object.
has_link?("edit").should be true
End
解决方案:PageObject仅提供元素的状态给来电者。呼叫者本身将验证状态:
def has_edit_link?
has_link?("edit")
End
复制使生活变得轻松。
长寿的死代码! >救援策略。
这是摘录自有关敏捷测试反模式和救援策略的幻灯片。有关更多信息,请查看该演示文稿。
评论
救援策略是什么意思?
– dzieciou
2014年5月3日在6:34
Martin Fowler建议也将断言排除在PageObjects外。但是,“万岁无效代码”是什么意思?
– dzieciou
2014年5月3日在6:41
长时间无法访问的对象只会删除该对象的救援策略。
–user3598383
2014年5月3日,11:52
一些对象无法正常工作,因此需要大量的负载并造成断言的混乱。某些代码的工作速度很慢,但长时间使用意味着“长寿命死代码”。\
–user3598383
2014年5月3日,11:55
我纠正了你的答案。您能否在答案中包含您的评论以解释要点?您还可以使用适当的英语吗?对不起,但就目前而言,我很难理解您想在评论中说些什么。
– dzieciou
2014年5月5日晚上8:40
#4 楼
我要花点时间:在测试用例级别包括业务逻辑,而不是构建业务层。现有模式:Page Object Pattern
在带有定位器信息的测试用例中而不是在业务层中内联声明页面元素。现有模式:Page Object Pattern
睡眠任意时间。现有模式:轮询,显式/隐式等待。
评论
大!在一个单独的问题下,详细讨论了最后一个反模式:sqa.stackexchange.com/questions/3764/…
– dzieciou
2014年5月4日19:42
#5 楼
测试自动化中的反模式使用隐式等待
使用录制的回放
使用脆性的,基于布局的选择器
不隔离测试之间的测试数据
/>不一致使用页面对象
仅具有否定断言的测试
在测试过程中途使用断言
由于设置相同而重复测试的一部分
不考虑悲伤用户输入无效数据的路径
强制所有测试通过复杂工作流中的所有页面
假设测试自动化涵盖了可访问性和可用性
在测试和套件描述中使用隐式名称和缩写
>不考虑开心流和悲伤流的可选工作流
仅测试1个浏览器并假定其他浏览器工作正常
不使用Page Helpers来干燥和命名公共代码段
have_css
超过have_button
之类的特定对象随着扫描电子设备的逐渐变长,子弹点是的,整个页面都是这样。
我想说的是,刚开始我在此列表中犯了所有错误,但我不了解,所以我认为它们都符合您的“起初看起来不错”的标准。
评论
为什么#7是个坏主意?如果我有一个复杂的测试(例如:填写表格,关闭表格,检查表格计数器是否增加了),我想使用一个断言来确保表格关闭后再继续。所以我知道测试失败了。
–伴侣Mrše
18年8月21日在13:30
#7有时有用且有价值,尤其是在复杂的多步骤集成测试中:softwareengineering.stackexchange.com/questions/412980/…
– Andrejs
20年7月30日在9:43
@MateMrše的问题是,现在您正在测试(“声明”)不同于测试旨在测试的内容。经常会替换任何精心设计的错误消息,告诉您有关意外结果的信息。我确实遇到了设置问题,并亲自处理了许多问题。一个好的方法是进行多个测试,每个测试都将依赖项存根到这一点。一个常见的示例是登录失败时。在某些地方,这意味着数百次测试失败。在其他情况下,它仅意味着一两个。这很难做到,但从我的经验来看,这是成功的最佳途径。
–迈克尔·杜兰特(Michael Durrant)
20 Jul 30'9:49
#6 楼
不同的堆栈反模式自动测试(也是测试框架)是使用不同于SUT使用的软件堆栈实现的。这将使开发人员难以维护测试。我已经看到Web开发团队需要学习Java作为一种额外的语言,因为测试团队决定向我们提供Java测试框架,而无需应用程序开发人员参与。测试人员熟悉Java,而不熟悉其他团队使用的PHP / JavaScript堆栈。团队
进行额外设置以运行本地测试(工具,运行时等)
#7 楼
缺少功能需求时的白盒测试有时,由于缺乏需求,我们阅读了系统代码以试图辨别其应做的事情,然后根据该知识编写测试。当有人要求对遗留系统进行自动化测试时,可能会发生这种情况。不了解实际需求的白盒测试也会冒着在测试中包含系统逻辑错误的风险。您使用相同的输入运行两个版本的系统,然后比较输出。这种测试的准确性不如功能测试。如果输出不匹配,则说明发生了某些更改,但是您不知道该更改是否代表新的错误,正确的错误修复或有意的功能更改。
评论
嗯...但这不是特定于测试自动化的,它通常对测试有效,对吧?
– dzieciou
16年3月16日在18:15
是的,这是对的。当我读到这个问题时,我并没有意识到它在征集专门针对测试自动化的反模式。
–user246
16 Mar 16 '16 at 18:42
评论
看起来是社区Wiki的不错候选人?我认为对此没有一个好的答案。同意cw的建议-这是一个非常好的参考清单,因为周围有很多可能的反模式。
@KatePaulk,我无法将其更改为CW。你能?我猜想一个一旦被投票的问题如果没有主持人的干预就无法变成CW。
我也不能-这一定是主持人的事情
Brb,从储藏柜里把旧的CW机器启动。很久没使用过这个东西了,希望它不会朝错误的目标发射。