您如何使用ALM中的Excel文件驱动相关的UFTtesting脚本?

我们有这个我们在过去几个月中开发的非常好且灵活的自动化架构。 让我来概述系统是如何devise的,作为我的问题的一部分。

因此,我们有这些主驱动程序脚本,它们会调用一堆子脚本来执行我们网站上的每个页面/选项卡。 每个页面都有自己的子脚本/动作,这些子脚本/动作可以互换,轻松打开或closures,而且每个子脚本/动作都有自己的数据表,可以在Excel工作簿中将其驱动。 即使主驱动程序脚本也有自己的表格,可以在调用这些子脚本/动作时驱动它的行为。

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

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

示例文件列表:

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

我们有这样的情况:多个testing人员可能需要同时执行不同的主驱动程序脚本,而这些主驱动程序脚本在很多情况下会同时执行相同的脚本。 如果他们都引用相同的Lambert.xls,那么这将是一个问题。 所以我通过创build一个Configuration.xls文件find了一个解决方法,该文件列出了所有主驱动程序脚本名称的所有名称,以及服务器上存在于不同path中Lambert.xls的所有对应副本的path。

例:

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

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

 Set oExcel = CreateObject("Excel.Application") oExcel.DisplayAlerts = False '...Code opens the Configuration.xls, passes the name of the current Master Driver, eg "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中时,我没有任何麻烦将引用转换为ALMpath,或将引用转换为ALMpath。 但是,当我尝试将Lambert.xlspath转换为ALMpath时,我开始遇到问题。

如果我按照他们的方式离开Lambert.xlspath,按照上面的描述指向:

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

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

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

它会抛出一个文件找不到的错误。 如果我将Lambert.xls文件作为数据表上载,那么UFT希望它作为数据表而不是Excel.xls文件,因此我无法访问该对象并在子脚本之间传递对象。 此外,如果我为每个子脚本添加这个数据表,那么LambertChild1脚本就会遍历所有迭代,然后LambertChild2将遍历所有的迭代…但是回想一下,这不是我需要的行为,因为LambertChild2 iteration1取决于运行LambertChild1 iteration1作为先决条件。 因此,如果LambertChild1已经运行了迭代1-30,那么LambertChild2运行,它依赖于LambertChild1迭代1,但是最后一个运行将是LambertChild1 iteration30,这根本不好,特别是在如此复杂和相关的环境中我们已经发展了。

如果我上传Lambert.xls文件作为testing资源,那么我当然会遇到上述情况,在这种情况下,会出现无法find文件的错误。

实际的错误信息是:

 '[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问题的任何方式来读取从ALMpath作为对象的Excel文件? 有一件事我以为是资源的名称应该匹配的文件的名称,所以我也试过,但没有帮助。

也许有一种从DataTable ALM资源加载Excel文件的方法? 如果是的话,这样做的代码是什么样子,我将如何使它工作? 请详细说明 请正确回答我所描述的问题。 我可能不明白涉及到我不熟悉的术语/过程的模糊答案。

系统和版本信息:Windows7; IE8(业务要求); UFT 12.0 Build 0511; ALM OTA客户端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; 用于function和性能testing的ALM实验室扩展11.50.1178

对不起,这么长时间的啰嗦,但我想在我的问题上明确,而不是含糊不清,必须回答很多问题,即使我过分复杂的问题。

提前感谢任何人通过这本小说! 现在我们已经在这个问题上陷入困境了,我感谢每一点帮助。 我一直在研究这个问题,但是很难彻底解决这个问题,直接回答这个问题。

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

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

您可以直接从ALM导入表格

考虑到testing1是ResourceName,Lambert是表名(不是Excel文件名)

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

虽然接受的答案没有任何问题,但我允许自己强调, PathFinder.Locate方法不仅可以用来parsing相对于绝对path的path(如文档所述),还可以将ALMpathparsing为本地path

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

这包括资源,附件,testing,组件 – 一切。 很有用。 您通过使用适当的前缀和附件,通过将它们像一个单独的文件(如“[QualityCenter]主题\文件夹\testing\ MyAttachment.docx”)寻址alm“选项卡”)

那么,为什么直接用数百行代码来处理ALM API呢? ;)