文本

为什么自动化测试应该是原子性

我最近在我的测试公会自动化播客上与 Nikolay Advolodkin 谈到了自动化的最佳实践。原子自动化测试的重要性被提了出来,但是我觉得我们没有足够地讨论它。

还有,我儿时的偶像之一,埃迪 · 范 · 海伦,最近去世了,这些概念让我微笑,因为它让我想起了他的歌《原子朋克》。 但我离题了。

Nikolay 决定创建一个帖子,深入探究为什么自动化测试尽可能小是如此重要。 这时,你可能会说: “够了,乔! 请把它交给尼古拉! ” 好了好了给你: 定义的原子测试 这个概念对于你理解任何自动化框架的成功都是至关重要的: 一个单独的自动化测试不应该模拟端到端的自动化。 相反,你的自动化检查应该形成一个单一的、不可约的单位。您应该一次只测试一个特性。 如果您有软件开发人员的背景,这与编写单元测试非常相似。 如果下面的测试是正确的,那么你的测试就是原子的: 测试最多只有一个或两个断言。(有时您需要一个断言来确保应用程序状态是正确的。) 您的测试只有很少的 UI 交互,而且最多只能在两个屏幕上进行。在极少数情况下,原子测试可能通过三个屏幕

这样设计自动化测试的好处是什么? 将测试设计得尽可能小有很多好处。 快速通过自动检查 其中一个优点是编写原子测试可以让您尽快地失败。 如果您希望一劳永逸地掌握测试自动化,请查看 Nikolay’ sComplete Selenium WebDriver with Java Bootcamp 使用 Java Bootcamp 完成 Selenium WebDriver 你得到的反馈是迅速和专注的。 检查一个特性的状态不会超过一分钟。 接下来,原子测试会减少片状测试行为。

自动化测试 您在两分钟或更短时间内完成的测试通过的时间是持续时间超过两分钟的测试的两倍。 因此,请记住,测试运行时间越长,失败的可能性就越大。 同样,编写原子测试可减少脆弱性,因为它减少了该测试中可能出现的断裂点的数量。 您会发现误报的减少,从而减少了排查问题的时间。 虽然这可能并不容易,但是当您实现它时,它将变得如此甜蜜!

这是一个简单的场景: 打开Amazon.com 断言页面打开 搜索项目 断言已找到项目 加入购物车 断言已添加项目 查看 声明结帐已完成

第一个问题是许多自动化工程师认为您必须为此自动化测试流程完成整个端到端流程。 使用UI自动化时,每一步都有可能出错。 例如,定位器或交互机制可能已更改,或者您的同步策略可能已损坏。 因此,您添加的步骤越多,您的测试就越有可能中断并产生误报。

更好的自动化测试代码覆盖率 编写原子测试的第三个好处是,如果原子测试失败,它们将不会阻止其他功能的测试。 换句话说,检查可以进行更好的测试。 例如,请参考上面提到的测试。 如果在步骤3中失败,则可能永远无法检查Blog页面或Search功能是否正常。 (这是假设您没有其他测试来检查此功能。) 运行大规模测试的结果是,您将减少测试范围。

最后,编写原子单元测试的另一个巨大好处是并行化时它们将运行得更快。 它们又短又快,大大减少了测试套件的执行时间。 例如,在此重构中,我在测试执行速度方面的性能提高了98%。 在上面的场景中,我有一套18个端到端测试,这些测试不是原子的,也不是并行运行的。 然后,我将测试分解为180个微小的原子测试,同时保持了相同的代码覆盖率。 接下来,我并行运行它们,并将测试用例的平均执行时间从86s降低到1.76s!

如何将端到端UI测试分解为原子? 到目前为止,您可能已经同意原子测试是一个好主意。 但是,您可能想知道如何拆分大型的端到端测试。 相信我-您不是唯一在这种情况下苦苦挣扎的人。 我每天都遇到同样问题的客户。 此外,我想为这个问题提供一个简单的答案,但我无法提供。 对于大多数个人而言,这一挑战是技术和文化之一。 好消息是,我将提供逐步指南,以帮助您创建原子测试运行。 虽然这可能并不容易,但是当您实现它时,它将变得如此甜蜜!

这是一个简单的场景: 打开Amazon.com 断言页面打开 搜索项目 断言已找到项目 加入购物车 断言已添加项目 查看 声明结帐已完成 第一个问题是许多自动化工程师认为您必须为此自动化测试流程完成整个端到端流程。 例如,您必须在步骤2之前完成步骤1,依此类推。 原因是,如果购物车中没有物品,又如何才能进入结帐流程?

注入数据以填充UI状态 自动化测试最佳实践方法是在任何UI交互之前注入数据以填充应用程序的状态。 这将极大地帮助您的测试过程。 例如: 您可以通过几个选项控制应用程序的状态: 使用类似RESTful API的方法将应用程序设置为特定状态 使用JavaScript 将数据注入数据库以将应用程序设置为特定状态 使用cookie 如果可以在应用程序的接缝之间插入数据,则可以隔离每个步骤并对其进行单独测试。

要考虑的一些选项: 发送网络请求以生成新的测试用户 发送网络请求以填充亚马逊购物车中的商品 使用Selenium打开浏览器到“购物车”页面 使用网络自动化执行结帐 之后清理所有测试数据

与在每个测试步骤中使用带有AUI自动化的GUI相比,使用网页API更加健壮和快捷。 例如,一个Web请求可以在大约100毫秒内执行。 这意味着步骤1、2和5各自只需不到一秒钟即可完成。 您需要完成的唯一其他步骤是使用Selenium(您实际要测试的唯一部分)完成结帐过程。

如何使用JavaScript控制应用状态 登录屏幕是原子测试最常见的障碍之一。 好处是大多数应用程序都有一个。 那么,如何从测试中删除它,使您的测试可以是原子的? 这是一个例子:

带有登录屏幕的页面 使用GUI测试工具打开Web应用 执行JavaScript 恭喜,我们已经登录! 现在,使用GUI自动化测试工具来执行您要测试的单个操作。 完整原子测试的外观如下: 注意测试仅具有以下内容: overviewPage.Open()–一种用于设置状态的GUI操作 overviewPage.Cart.SetCartState()–使用JS设置购物车状态的方法

概述GUI的另一GUI操作-这是我们要测试的功能和一个断言

如果您想通过视频培训和现场自动化代码来完全理解原子测试自动化,请查看Nikolay的完整的Selenium WebDriver与Java Bootcamp。

无法注入数据以使用Web应用程序进行测试吗?

如果您无法注入数据进行测试怎么办?

世界并不完美,您将在自己的角色中面临挑战。 许多人没有足够的幸运考虑开发具有可测试性的应用程序。 如果您无法注入数据进行测试,很高兴知道您有两个有用的选择。 例如,您可以与软件开发人员合作以使应用程序更具可测试性。 开发实践不良的一个标志是无法轻松测试您的应用程序。 交流和想法共享都是工作的一部分。

沟通对于长期测试的成功至关重要 准备离开多维数据集并在各个孤岛之间进行沟通以打破沟通障碍。 您需要在团队之间进行沟通,并共同创造一个稳定的产品。 当产品出现故障时,整个团队就会失败,而不仅仅是特定的团队。 您可能会想,“是的,但这并不容易。” 我同意。 我在一家公司工作,花了一年的时间将开发人员,自动化工具和手动质量检查简单地集成到单个CI管道中。 这是每周一次的工作,以使每个人都关心自动化套件的结果。 但是,最终,我们的团队比以往任何时候都更加强大和敏捷。 相信我,这是可行的,并且大多数开发人员乐于提供帮助。 要点是要想成功,您必须愿意打破这些障碍。 然后,当然有第二种选择,但是您可能不想听。 如果您的应用程序不是自动化友好的,则不要使其自动化。 如果您因为不愿意而不能与开发人员合作,或者由于公司文化不允许您与开发人员合作,那么就不要使无法提供价值的东西实现自动化(即使您的经理要求您实现自动化) )。 我们是自动化工程师。 我们是专业人士。 我们必须根据对应用程序需求的理解来决定要自动化还是不自动化。 我们之所以被录用,是因为我们的技术专长和能力说出什么是可能的,什么是不可能的以及什么将有助于项目成功。

author

石头 磊哥 seven 随便叫

company

thoughtworks(离职了。。。。)

大家好,本人不才,目前依旧混迹于thoughtworks,做着一名看起来像全栈的QA,兴趣爱好前端,目前是thoughtworks 西安QA社区的leader,如果有兴趣分享话题,或者想加入tw,可以找我

roles

QA(营生) dev(front-end dev 兴趣爱好)

联系方式

如果想转载或者高薪挖我 请直接联系我 哈哈

wechat:

qileiwangnan

email:

qileilove@gmail.com