我目前是为基于 Web 的产品线开发测试的一组开发人员中的一员。这些产品是独立但相关的,并定期发布(即版本化)。
我们正试图让我们的测试对所有不同的版本都“从头开始”运行,这意味着我们的主测试代码分支的当前状态可以对生产构建的任意版本有意义地运行。起初,这似乎有点吓人,特别是因为我们的测试通常基于 UI(Selenium),因此非常依赖于特定版本。
有什么技巧可以让这个过程更容易吗?或者至少,更可行?
我目前是为基于 Web 的产品线开发测试的一组开发人员中的一员。这些产品是独立但相关的,并定期发布(即版本化)。
我们正试图让我们的测试对所有不同的版本都“从头开始”运行,这意味着我们的主测试代码分支的当前状态可以对生产构建的任意版本有意义地运行。起初,这似乎有点吓人,特别是因为我们的测试通常基于 UI(Selenium),因此非常依赖于特定版本。
有什么技巧可以让这个过程更容易吗?或者至少,更可行?
你很敏锐地认识到改变是自动化 UI 测试的致命弱点。这与开发/维护需要与应用程序的多个版本一起工作的共享库没有什么不同。
您可以遵循一些做法来减少(但不能消除)疼痛。在产品方面:
在测试方面:
我假设你有充分的理由,无论是商业还是其他,这样做。从源存储库中提取适当版本的测试代码对我来说似乎更简单(您确实在源存储库中有测试代码并标记版本,对吗?),但无论如何......
我在这里看到两个主要选项。一种是包括版本检测和每个构建的内部功能列表。这里的好处包括使测试更简单,因为如果版本列表显示功能 X 不是其中的一部分,则脚本永远不会检查功能 X,以及“功能预言机”的存在。缺点是实现和维护更复杂,因为特性/版本矩阵必须是正确的并且是最新的,否则您可能有未测试的特性(如果 oracle 说该特性来自更高版本或缺少该特性完全)或测试失败(如果预言机说该功能来自太早的版本)。
另一种是在您的脚本中构建特征检测:检查特征 X 的链接是否存在,并仅在它存在时对其进行操作。优点包括 - 如果该功能存在,它将被测试,测试将永远不会在尝试使用不存在的功能时失败。缺点包括 - 这会更慢,因为总是有必要的检查时间来确定该功能是否存在,您将不知道版本中是否缺少某个功能(除非您同时使用这两种方法,这当然会让您两者的优点和缺点)。
无论如何,对应用程序对象的更改会给你一些非常丑陋的代码:而不是拉取引用特定对象的版本化代码,你的脚本代码最终会得到一个基于版本的决策树,或者该对象是否可以在它的任何一个下找到已知的名字。
老实说,我不确定拥有脚本代码库的单个分支和版本的优点是否超过了这种方法的缺点,但如果必须,我会使用如上所述的混合方法来处理它。
祝你好运。