如何使用ALM中的Excel文件将数据驱动相关的UFT测试脚本?

时间:2014-07-23 22:54:37

标签: excel qtp qc alm hp-uft

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

因此,我们有这些主驱动程序脚本调用一堆子脚本来执行我们网站上的每个页面/选项卡。每个页面都有自己的子脚本/操作,这样它们可以互换,轻松打开或关闭,每个子脚本/操作都有自己的数据表,可以在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相应副本的路径。 / p>

示例:

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路径,或者将引用转换为Object Repository到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 iteration1所需的行为取决于运行LambertChild1 iteration1作为先决条件。因此,如果LambertChild1已经运行了迭代1-30,那么LambertChild2运行,它依赖于LambertChild1 iteration1,但最后一个运行将是LambertChild1 iteration30,这一点都不好,特别是在如此复杂和依赖的环境中我们已经发展了。

如果我将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问题来从ALM路径读取作为对象的Excel文件吗?我认为有一件事是资源的名称应该与文件的名称相匹配,所以我也尝试过,但这没有用。

也许有一种从DataTable ALM资源加载Excel文件的方法?如果是这样,这样做的代码是什么样的,我将如何使其工作?细节好吗?请尽可能准确地回答我的问题。我可能不理解那些涉及我不熟悉的术语/过程的模糊答案。

系统&版本信息:Windows7; IE8(业务要求); UFT 12.0 Build 0511; ALM OTA Client 11.52.444.0; ALM UI 11.52.444.0; ALM WebGateClient 11.52.444.0; ALM Test Run Scheduler 11.52.444.00; ALM Sprinter 11.50.444; ALM分析扩展11.50.444; ALM QC v11.50.444; ALM Lab Extension for functional&性能测试11.50.1178

对于这么长时间的啰嗦而感到抱歉,但我希望在我的问题中明确表达,而不是模糊,并且必须回答很多问题,即使我过分复杂化了这个问题。

感谢任何通过这部小说的人!我感谢我能得到的一切帮助,因为我们已经坚持了几个星期这个问题。我一直在研究这个问题,但要解决这个特定问题的答案,很难找到问题的混乱。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

考虑测试1是ResourceName,Lambert是工作表名称(不是excel文件名)

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

Datatable.ImportSheet Filename, SheetSource, SheetDest

答案 2 :(得分:1)

虽然接受的答案没有任何问题,但我允许自己强调 PathFinder.Locate方法可以用于解决绝对路径的相对路径,因为文档状态,但解析本地路径的ALM路径

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

这包括资源,附件,测试,组件 - 一切。非常有用。您通过使用适当的前缀来解决alm“标签”,并通过将它们作为单独的文件(例如“[QualityCenter] Subject \ Folder \ Test \ MyAttachment.docx”中)来解决附件

那么,当一行足够时,为什么直接用数百行来处理ALM API呢? ;)