2

我们拥有在过去几个月中开发的这种非常出色且灵活的自动化架构。让我概述一下系统是如何设计的,作为提出我的问题的一部分。

所以我们有这些主驱动程序脚本,它们调用一堆子脚本来完成我们网站上的每个页面/选项卡。每个页面都有自己的子脚本/动作,它们可以互换、轻松打开或关闭,并且每个子脚本/动作都有自己的数据表,可以在 Excel 工作簿中驱动它。即使是主驱动程序脚本也有它自己的工作表,用于驱动调用这些子脚本/操作时它的行为方式。

子脚本的所有工作表和主驱动程序的工作表都在同一个工作簿中,在一个 excel 文件中,我将其命名为 Lambert.xls。我们有这个文件的多个副本,其中包含我们想要驱动我们的脚本的不同数据集。

所以目前用户应该删除 Lambert.xls 并复制其他文件之一并将副本重命名为 Lambert.xls。但是这个活动很容易出现用户错误,比如误删错文件、重命名时拼写错误、重命名前忘记复制原文件等等……

示例文件列表:

Lambert.xls
Lambert_Maximum.xls
Lambert_Minimum.xls
Lambert_Professional.xls
Lambert_Amateur.xls

我们有这样的情况,多个测试人员可能需要同时执行不同的主驱动程序脚本,而这些主驱动程序脚本在许多情况下会同时执行相同的脚本。如果它们都引用相同的 Lambert.xls,那将是一个问题。因此,我通过创建一个 Configuration.xls 文件找到了解决此问题的方法,该文件列出了所有主驱动程序脚本名称的所有名称,以及存在于服务器上不同路径中的所有 Lambert.xls 相应副本的路径。

例子:

MasterDriver1 \\LambertServer\Development\TestData\Test1\Lambert.xls
MasterDriver2 \\LambertServer\Development\TestData\Test2\Lambert.xls
etc...

现在 MasterDriver1 通过调用 LoadAndRunAction 并传递一个路径来调用另一个测试脚本中的另一个动作。但在此之前,主驱动程序脚本将执行以下操作:

Set oExcel = CreateObject("Excel.Application")
oExcel.DisplayAlerts = False

'...Code opens the Configuration.xls, passes the name of the current Master Driver, e.g. "MasterDriver1" and gets the path to the Lambert.xls that it should use.
'...Code closes the Configuration.xls file and sets the object pointer to nothing.

Set oMasterDriverWorkbook = oExcel.Workbooks.Open(strMasterWorkbookfileAndPath)
Set oMasterDriverSheet = oMasterDriverWorkbook.Worksheets(strMasterDriverSheetName)

If CInt(Environment("TestIteration")) = 1 And CInt(Environment("ActionIteration)) = 1 Then
     Call initGlobalDictionary()
     GlobalDictionary.Add "LambertAutomationDataObject", oMasterDriverWorkbook
End If

'...Code gets the master row count from the Master-driver sheet on the current version of Lambert.xls, and sets this up for the iteration loop.

For intCurrentRow = 2 To intMasterRowCount Step1
     GlobalDictionary.Add "CurrentRowNumber", intCurrentRow
     LoadAndRunAction "\\LambertServer\Development\Scripts\LambertChild1\", "LambertChild1", oneIteration
     LoadAndRunAction "\\LambertServer\Development\Scripts\LambertChild2\", "LambertChild2", oneIteration
     LoadAndRunAction "\\LambertServer\Development\Scripts\LambertChild3\", "LambertChild3", oneIteration
     GlobalDictionar.Remove "CurrentRowNumber"
Next 'intCurrentRow

以上是必要的,因为运行“LambertChild2”取决于在其之前运行“LambertChild1”,而“LambertChild3”需要运行“LambertChild1”和“LambertChild2”作为先决条件。我正在尝试稍微简化代码并更改名称,因为如果我复制和粘贴它会变得更加复杂。所以请理解还有更多的子脚本和更多的依赖项,但这对于我的问题来说已经足够了。

现在看一个示例子脚本。

Set oDataWorkbook = GlobalDictionary("LambertAutomationDataObject")
Set oDataSheet = oDataWorkbook.Worksheets(strDataSheet)

...Get a bunch of data from the sheet, which will be passed into the call to Lambert1Tab

intCurrentRow = GlobalDictionary("CurrentRowNumber")

Call Lambert1Tab(...)
Call WriteReporterEvent(...)

Set oDataSheet = Nothing
Set oDataWorkbook = Nothing

我们决定保留从每个工作表中获取所有数据的所有代码,因为它维护了模块化结构,并防止主驱动程序脚本被不必要的代码过度污染,这些代码需要为每个工作表重新编写和维护主驱动程序脚本。

因此,所有脚本、主驱动程序脚本和子脚本都依赖于能够将 Lambert.xls 文件作为 Excel 对象加载:

Set oExcel = CreateObject("Excel.Application")

现在,当我将所有这些脚本移动到 ALM 中时,将函数库的引用转换为 ALM 路径或将对象存储库的引用转换为 ALM 路径时,我不会遇到任何麻烦。但是当我尝试将 Lambert.xls 路径转换为 ​​ALM 路径时,我开始遇到问题。

如果我让 Lambert.xls 路径保持原样,如上所述指向:

\\LambertServer\Development\TestData\Test1\Lambert.xls

然后一切正常。但是,当我将其更改为已上传到 ALM 的路径时:

[ALM] Resources\Lambert\TestData\Test1\Lambert.xls

它会引发无法找到文件的错误。如果我将 Lambert.xls 文件作为数据表上传,则 UFT 期望它表现为数据表而不是 Excel.xls 文件,因此我无法访问该对象并在子脚本之间传递该对象。此外,如果我为每个子脚本放置此数据表,则 LambertChild1 脚本将运行它的所有迭代,然后 LambertChild2 将运行它的所有迭代......但请记住,这不是我需要的行为 LambertChild2 迭代 1取决于运行 LambertChild1 迭代 1 作为先决条件。因此,如果 LambertChild1 已经运行了 1-30 次迭代,然后 LambertChild2 运行,它依赖于 LambertChild1 迭代 1,但最后运行的将是 LambertChild1 迭代 30,这一点都不好,

如果我将 Lambert.xls 文件作为测试资源上传,那么我当然会遇到上述情况,即引发无法找到文件的错误。

实际的错误信息是:

'[ALM] Resources\Lambert\TestData\Test1\Lambert.xls' could not be found. Check the spelling of the file name, and verify that the file location is correct.

所以我的问题是,有没有人知道通过这种封锁 ALM/UFT 问题的方法来将 Excel 文件作为对象从 ALM 路径读取?我认为的一件事是资源的名称应该与文件的名称匹配,所以我也尝试过,但这没有帮助。

也许有一种从 DataTable ALM 资源加载 Excel 文件的方法?如果是这样,执行此操作的代码会是什么样子,我将如何使其工作?请问详细点?请与我一直在描述问题一样准确地回答您的问题。我可能无法理解涉及我不熟悉的术语/流程的模糊答案。

系统和版本信息:Windows7;IE8(业务要求);UFT 12.0 内部版本 0511;ALM OTA 客户端 11.52.444.0;ALM 用户界面 11.52.444.0;ALM WebGateClient 11.52.444.0;ALM 测试运行计划程序 11.52.444.00;ALM 短跑运动员 11.50.444;ALM 分析扩展 11.50.444;ALM QC v11.50.444;用于功能和性能测试的 ALM 实验室扩展 11.50.1178

很抱歉这么啰嗦,但我想在我的问题中明确表达,而不是含糊其辞,并且必须回答很多问题,即使我过于复杂了问题。

提前感谢所有读过这本小说的人!我很感激我能得到的每一点帮助,因为我们已经在这个问题上困了几个星期了。我一直在研究这个,但很难从混乱的问题中解脱出来,以获得关于这个特定问题的直接答案。

4

3 回答 3

2

很好的解决方案。这里的关键是您使用 Excel 来加载电子表格,而不是 QTP/UFT。Excel 对 ALM 及其文件系统一无所知。您需要做的是在本地下载文件(可能到临时文件夹),然后将本地文件路径传递给 Excel 以加载文件。

在 QTP/UFT 中,您可以在运行测试时使用“QCConnection”对象与 ALM 的活动连接进行交互。有关如何从资源模块下载文件,请参阅 OTA API 文档。

于 2014-07-24T12:12:33.417 回答
1

您可以直接从 ALM 导入表,如下所示

考虑到测试 1 是资源名称,兰伯特是工作表名称(不是 excel 文件名)

Dim Filename : Filename = "[ALM] Resources\Lambert\TestData\Test1"
Dim SheetSource : SheetSource = "Lambert"
Dim SheetDest : SheetDest = "Global"

Datatable.ImportSheet Filename, SheetSource, SheetDest
于 2015-06-10T19:26:48.773 回答
1

虽然接受的答案没有任何问题,但我允许自己强调,PathFinder.Locate方法不仅可用于将相对路径解析为绝对路径,如文档所述,还可用于将 ALM 路径解析为本地路径

由于它总是返回一个本地路径(进入本地 TEMP 目录),您可以使用它来下载存储在文件系统中的任何内容的工作副本,或者更重要的是,在 ALM 系统中。下载过程在这里有点副作用。

这包括资源、附件、测试、组件——一切。很有用。您可以使用适当的前缀来处理 alm“选项卡”,并通过像单独文件一样处理附件(如在“[QualityCenter] Subject\Folder\Test\MyAttachment.docx”中)

那么,如果一行就足够了,为什么要直接使用数百行代码来处理 ALM API?;)

于 2016-01-11T06:45:04.393 回答