天天看點

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

本節書摘來自異步社群《精通qtp——自動化測試技術領航》一書中的第1章1.8節資料池(data table)的應用,作者餘傑 , 趙旭斌,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

1.8 資料池(data table)的應用

精通qtp——自動化測試技術領航

階段要點

熟悉測試資料和腳本業務分離的好處和優勢。

學會利用data table将測試資料與業務分離。

global sheet與local sheet的差別。

test datatable vs run-time datatable。

datatable常用方法指引。

1.8.1 引言

作為一個qtp自動化測試工程師,學會使用data table是必不可少的。data table其實和excel非常相似,幾乎可以說是“克隆”出來的。是以,讀者會上手的很快。

雖然上手會比較快,但是也别小看了它,因為在自動化測試過程中,資料之間的傳遞是非常重要和常用的,小小的一個data table可絕對是自動化測試的主力和核心元件。在前面已經學會了整個對象庫的使用。那麼在本章節就讓我們來一起領略data table是如何管理好龐大而且繁瑣的測試資料的、是如何進行不同測試資料的傳遞的……

**1.8.2 學會使用datatable進行參數化

1.8.2.1 為什麼要進行參數化**

首先,從最簡單和常見的說起,相信大家對參數化這個詞非常熟悉,在本書的前面也提到過,不過并沒有細緻地講解如何參數化。因為,qtp内置的參數化功能其實在真實項目中是不會去使用的。那如何去參數化測試資料呢?答案就是利用這個data table,使用它配合代碼來管理好繁雜的測試資料才是自動化測試的正道。接下來,讓我們進入第一個執行個體,先來看下面這段代碼:

然後,圖1-195是腳本對應的對象庫,讀者可以看一下。

最後,我們解讀一下腳本:這段腳本其實還是比較簡單的。先打開一個浏覽器,然後進入百度的首頁,接着輸入關鍵字“qtp自動化測試技術領航”,最後點選“百度一下”按鈕。這樣,百度會進入搜尋比對頁面,此時便可以開始做很多測試驗證。當然,這裡驗證省略掉了,因為這是後面章節的内容。那我們假設驗證是通過的,成功比對到了“qtp自動化測試技術領航”的一些相關資訊,那麼通過點選“到百度首頁”這個image對象回到首頁,因為需要再一次輸入測試資料,再進行n次測試,測試什麼?就是測試關鍵字輸入後點選搜尋能否正确搜尋到相關的資訊。是以,在這裡寫了一個循環。這樣,qtp就能測試10次了,這個結果應該很可靠了吧?如果10次都通過了,那這個功能就應該沒問題了。

單從表面上看,的确是!但是,同樣面臨一個問題,那就是在用同一個測試資料“qtp自動化測試技術領航”在做測試。是以,執行1次和執行上百次是沒有什麼實質性的差別的,特别像這種搜尋框之類的功能點,這樣的自動化測試也算是一種浪費時間的無效測試(特殊情況除外,如可靠性測試)。怎麼才算有效?從手工測試的角度上來說,就是輸入完全不同的測試資料,然後檢視測試結果。那qtp該怎麼做呢?很簡單,隻要把關鍵字輸入框中set的資料改掉就可以了,如下面這個腳本:

上面這段代碼最後完全實作了想要的效果,但是,缺點大家都已經看到了,有太多的重複内容,假設是要輸入100個測試資料呢?複制、粘貼100次嗎?顯然不需這樣,完全可以将set的值進行參數化。先給出第一個解決方案,使用前面第一段代碼相同的循環,但又每次輸入不同的關鍵字,代碼如下所示:

我們來分析一下這個腳本,其實這段代碼幾乎和先前的那段代碼沒有兩樣,作者隻改動了一句而已(代碼裡用注釋标注的句1)。解決方案其實也不難,就是把每次循環的計數和測試輸入組合,這樣每個測試資料就都不一樣了。不過,讀者應該發現了吧,在這裡并沒有直接将測試資料明确寫出來,取而代之的是datatable.value("關鍵字輸入","action1")這句話。這個就是本章節介紹的參數化,通過datatable參數化。

作者把測試資料封裝到了datatable.value("關鍵字輸入","action1")裡,如圖1-196所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

如圖1-196所示,這個就是qtp内置的data talbe界面,可以在這裡輸入一些資料。把測試資料“qtp自動化測試技術領航”輸入到了a1這個單元格裡。這樣做有什麼好處?首先,一定知道現在所做的事情的意義和意圖。其實從某種角度上講,雖然操作很簡便,但是,我們是在做封裝的動作,将測試資料獨立出來,并封裝到一個容器裡,以後可以供腳本調用。為什麼要封裝并且要把測試資料獨立出來存放到一個儲存的地方?試想一下,如果不進行測試資料封裝會有什麼後果。比如腳本裡有100處地方需要輸入這個測試資料,如果突然有一天測試需求變化了,不再需要輸入這個關鍵字,需要換另一種測試資料進行輸入,因為需要修改100處地方!如果此時測試資料和腳本是分離的,那我們隻需要在a1這個單元格修改1次就可以了!1:100哪個劃算,相信讀者和本人一樣清楚!到此,也引出了自動化測試的一個重要理念:測試資料和腳本業務的抽離。當然,将測試資料剝離出腳本的方法有很多種,在這裡隻介紹如何利用qtp的data table進行測試資料分離。

1.8.2.2 如何具體操作

在上個小節中,已經介紹了将測試資料與腳本業務分離的知識,并且讀者也看到了資料分離後的情況。那麼接下來,一步步地介紹具體該如何去完成資料與業務相分離的操作。在開始前,首先一起來看一下data table的原始情況,如圖1-197所示。

如圖1-197所示,可以看到目前一共有兩個sheet,它們分别是global和action1。接下來,暫且不對global“做文章”,隻對action1做文章。那麼,操作步驟正式開始。

step 1,選中“action1”這個sheet,将滑鼠光标移動至column“a”,然後輕按兩下,如圖1-198所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

step 2,待彈出change parameter name視窗後,任意輸入一個name值,這個值将會變成a列的列名。在這裡,作者輸入了“示範”這兩個字,最後點選ok,如圖1-199(注:本步驟可以省略,這樣的話,列名等于a)。

step 3,到此為止,已經完成了一大半的操作,已經為測試資料建好了一個“家”,以後它們完全可以搬到這個位置“居住”。接下來,在對應“示範”這列的第一行交叉處寫入一個值,這個值就是測試資料,如圖1-200所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

如圖1-200所示,測試資料部分的工作已經完成了,最後一步就是如何在腳本中引用了。在此,介紹第一個data table文法—“引用單元格”,如下:

datatable.value (parameterid , sheetid)

datatable (parameterid , sheetid)

文法分析。

data table本身就是一個object,它可以點出一個value方法,然後就可以通過在後面括号中設定參數來定位到單元格的值了。參數一共有兩個,第一個參數“parameterid”指代列名(在這個執行個體中列名是“示範”),第二個參數“sheetid”則指代sheet的名字。

在這裡,value方法可以省略,效果也是一樣的。

step 4,最後一步,完成以下腳本成功引用到單元格,使得百度搜尋框可以輸入單元格中的測試資料,腳本如下所示:

browser("百度一下,你就知道").page("百度一下,你就知道")._

webedit("關鍵字輸入框").set datatable.value("示範","action1")

當datatable的列數超過2列時,在輸入“datatable”(以後會自動出現代碼提示,列出目前sheet下的所有列的列名。datatable.value不适用),如圖1-201和圖1-202所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

小結: 這是一個最基本的例子,隻有學會了這個基本執行個體,讀者才能繼續後面的學習,後面的一些内容是萬變不離其宗的,核心的東西是一緻的。

1.8.2.3 global sheet vs local sheet

如果有這樣一個測試需求—進行3次百度搜尋的業務流程,但是每次輸入的關鍵字必須不一樣,此時qtp該怎麼完成?請看參考答案,見如下腳本:

'打開網頁 -- 第1次

systemutil.run "www.baidu.com"

'輸入關鍵字“test1”并點選搜尋

webedit("關鍵字輸入框").set "test1"

webbutton("百度一下").click

'關閉網頁

browser("百度一下,你就知道").close

'相同代碼 -- 第2次

'隻變更測試資料

webedit("關鍵字輸入框").set "test2"

'相同代碼 --第3次

webedit("關鍵字輸入框").set "test3"

正确答案已經公布了,運作成功,自動化測試腳本成功實作!但是,這就是我們想要的嗎?但是如果要輸入10次不同的測試資料呢?甚至于上百次呢?難道也要跟着複制→粘貼100次嗎?那這腳本該有多龐大啊!

有什麼更好的解決方法嗎?答案是肯定的,那就是接下來要介紹的global sheet。在上一個小節中,所講的執行個體是用local sheet(action1)來完成的,那麼接下來就來看下面這段代碼,看看用global sheet是否能夠圓滿完成任務,腳本如下所示:

'打開百度首頁

'将datatable裡的值傳遞給一個變量

testdata = datatable.value("關鍵字輸入","global")

'使用該變量,并将其填入關鍵字輸入框

webedit("關鍵字輸入框").set testdata

該腳本僅用了幾行代碼就能完成3次業務循環嗎?而且還要用不同的資料?别着急,我們來運作一下該腳本,看一下運作結果,是否自動化測試圓滿完成了,如圖1-203所示。

圖1-203是qtp的另一個重要子產品“測試報告(test results)”,這個在後面的章節會詳細介紹,這裡讀者隻需要看運作結果就行了。我們可以看到,qtp運作了3次疊代,這就證明了qtp的确進行了3次業務循環。那接下來,再來證明這3次業務循環所用的測試資料都是完全不同的,如圖1-204所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

如圖1-204所示,點選run-time data table以後,可以看到腳本在運作過程中所使用的所有資料記錄,分别是test1、test2、test3。到此,大家應該沒有任何疑問了吧?的确是運作了3次業務,切實地輸入了各不相同的測試資料。想知道這些測試資料哪裡來的嗎?答案現在正式揭曉,如圖1-205所示。

有沒有似曾相識的感覺?在上一個小節中的執行個體就已經和它打過交道了,它就是qtp的data table。請大家注意目前腳本使用的是global sheet而不是local sheet!在“關鍵字輸入”這一列中輸入了3行測試資料,這就是實際運作時輸入的資料。

測試資料是怎麼來的,我們已經搞清楚了。但是相信讀者現在一定還有另外一個疑問,那就是qtp為什麼會執行3次,腳本中并沒有做任何循環!這就要引出本小節内容的第一個知識點了。

1.global sheet是一個全局變量!有幾行資料,程式就要回放幾次

是以,這也就很清楚地解釋了為什麼qtp運作了3次,就是因為目前的global sheet中有3行測試資料。第1次執行使用第一行資料test1,第二次執行使用第二行資料test2,第三次執行使用第三行資料test3,依此可以一直類推下去。

現在設定了3行測試資料,這些資料不一定是我們每次都需要的,那該怎麼辦?删除它們?等需要了再添加?那多麻煩。qtp提供了一個很有用的功能,那就是data table iterations設定,先來認識一下它,調用它的方法如下。

qtp上方菜單欄→file→settings→run打開後的結果如圖1-206所示。

如圖1-206所示,這就是data table iterations設定界面,預設選中的是run on all rows(圖中标記2),即datatable中有幾行資料就運作幾次,剛才的執行個體根據業務要求設定了3行資料,是以它會去運作3次。在很多情況下,自動化測試資料隻需要1個,那麼此時就可以選中run one iteration only這個選項(圖中标記1),這樣就完全可以不必去删除本次不會用到的業務資料了。最後一個選項(圖中标記3)叫run from row x to row y,這個也非常好了解,就是設定一個範圍,qtp就會根據設定的範圍進行疊代運作,當然,千萬不要将範圍超出最大的範圍(在本執行個體中最大範圍是3)。到此,就要引出另一個知識點了。

2.global sheet這個全局變量是受data table iterations控制的

那麼,讀者要問了:“現在global sheet和local sheet都通過執行個體講解過了,那它們之間有什麼差別呢?”讓我們再次引出另一個知識點。

3.local sheet是個局部變量,它并不受data table iterations控制,無論有多少行資料,它隻運作一次(前提是global sheet沒有資料,或隻有一行資料,或設定為隻運作一次)

讓我們來看一個執行個體,把global sheet的資料都清空,然後在local sheet中建立3行測試資料,如圖1-207和圖1-208所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

然後,仍然複用之前的腳本,唯一更改的一處就是把引用globl sheet改成引用local sheet,代碼如下所示:

'唯一的差別就是把global改成了action1

testdata = datatable.value("關鍵字輸入","action1")

browser("百度一下,你就知道").page("百度一下,你就知道").webedit("關鍵字輸入框").set testdata

browser("百度一下,你就知道").page("百度一下,你就知道").webbutton("百度一下").click

然後,運作腳本,來看一下盡管local sheet中有3行測試資料,但是是否隻運作了一次,如圖1-209所示。

很明顯,圖1-209已經給出了結果!通過這兩個執行個體,已經明确了它們之間各自的用處。但是呢,data table的确是qtp的一個難點,即使global sheet沒有資料,仍然可以通過别的方式(代碼控制的方式排除在外)去執行local sheet下的所有行。在test flow(後續章節會介紹)裡反擊action後可以進入action的一些相關設定,如圖1-210和圖1-211所示。

如圖1-211,界面很熟悉吧?它和global的data table iterations設定界面相似,在這裡選中run on all rows就可以執行local sheet下的所有測試資料了。雖然都是執行所有行資料,不過它們的差別還是很大的,先看一下執行結果,如圖1-212(腳本略)。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

光看一張圖可不行,絕對不夠直覺,再回過頭看之前global的那張圖,如圖1-213所示。

這樣很直覺了吧?差別相當明顯,local sheet執行了3次自身action的疊代,而global sheet就相當于執行了3次腳本,這之間可是有着天壤之别的!至于這天囊之别的細節之處不是一本書能夠細緻介紹的,需要讀者親自實踐、細細品味,結合自己的項目多思考。

在最後,還總結了一些global和local之間的邏輯規則,大緻為以下幾點。

global不止一行資料(設定為run on all rows,以下都是……),action也設定為run on all rows(以下都是……)且假設雙方都具有3行測試資料,此時global和action的每行都要運作且同步運作(即global在取第2行資料時,action也對應地取它的第二行資料)。

當global不止一行資料且global的行數大于action的行數,那麼當action執行到最後一行後,global以後所執行的行數,action都用它的最後一行資料去補,比如action的最後一行測試資料是test3,那麼即使global執行到了100行,也一直對應的是action中test3的這一行資料。

引用上面的條件,如果global的行數小于action的行數的話,action就執行不到最後一行了。

1.8.3 test datatable vs run-time datatable

這個标題很熟悉吧,在本書的前面幾個章節,介紹過test object和run-time object。在這裡,我們又和test…以及run-time…見面了。回顧一下,test object是什麼意思?就是固定在測試對象庫裡的測試對象。那麼run-time object呢?就是程式運作時實際的測試對象。那麼在這裡test datatable和run-time datatable的理念完全是借鑒它們的。先來看一下test datatable和run-time datatable之間的差別和含義。

test datatable—在data table裡事先準備好的、固定的測試資料,它是一組靜态資料,是由自動化測試工程師人為事先填寫進去的。

run-time datatable—在qtp執行過程中,将測試資料填寫到data table裡,qtp運作結束,測試資料就消失(不會儲存在data table裡),但是可以在測試報告中看到它。

先來看一下test datatable,這個就相當簡單了,并且之前就已經全面地做過執行個體(global sheet和local sheet),可以手工在data table中設定一些測試資料。主要來看看run-time datatable究竟是怎麼回事。

我們試想一下,現在有一個注冊的業務需要進行自動化測試。因為自動化測試有子產品化和細分化的原則,是以,需要把這個業務拆成兩個腳本,第一個腳本主要做注冊的操作。而大家都知道通常現在的任何網站都會在注冊後進入另一個驗證界面,往往要驗證一些基本資訊,比如,确認你填寫的使用者名、生日、住址等是否正确。是以,把這個驗證的業務過程封裝到第二個腳本中去。那麼問題就來了,如果一個測試業務由兩個腳本組成,那麼它們之間的資料中轉該如何進行?即将第一個腳本中填寫的注冊資訊放到第二個腳本中去驗證。此時,通常情況下有兩個比較好的方法,第一個就是通過eom轉出資料,這個是後續章節的内容,這裡不多做闡述。而另一個好方法就是利用qtp自帶的data table,方法與實作步驟如下(假設以注冊舉例,隻在注冊後的驗證界面中校驗使用者名這個資料)。

(1)填寫完所有必填項,并使用getroproperty來擷取已填寫的使用者名。

(2)将這個動态的擷取到的值動态地傳入global sheet的某個指定列中。

(3)在第二個腳本(校驗注冊資訊的這個頁面)中動态讀取這個值并做判斷校驗。

(4)腳本運作完畢,run-time資料消失,不過可以通過test report來檢視腳本在運作時使用過的所有測試資料。

那麼接下來就來做一個執行個體,需完成如下業務。

(1)進入百度首頁。

(2)在搜尋框中輸入“qtp自動化測試技術領航”字樣。

(3)點選“百度一下”按鈕。

(4)校驗在搜尋結果頁面中的搜尋框中是否保留了剛才輸入的字樣。

在看到這個業務後,先進行業務分析,并大緻給出一個實作思路,步驟如下所示。

腳本1。

(3)使用getroproperty去擷取搜尋框中剛才輸入的字樣,并傳入global sheet的指定列中。

在這裡讀者肯定要問,為什麼不直接把“qtp自動化測試技術領航”字樣傳入global sheet,而要多一個步驟通過getroproperty去擷取?因為,如果你直接傳入資料,就少了一個驗證是否成功輸入到搜尋框中的過程了,這樣的自動化測試是不可靠的。

腳本2。

(4)讀取global sheet中的run-time data。

(5)擷取搜尋結果頁面中的搜尋框的值,假設為checkvalue。

(6)将run-time data與checkvalue做比較。

最後,通過上述分解步驟完成腳本如下:

腳本1:

webedit("關鍵字輸入框").set "qtp自動化測試技術領航"

run_time = browser("百度一下,你就知道").page("百度一下,你就知道")._

webedit("關鍵字輸入框").getroproperty("value")

'将run_time傳入global sheet指定列

datatable.value("runtime_data","global") = run_time

圖1-214就是設定global sheet中的列。

由圖1-214可以看到,這個單元格裡是沒有資料的。接下來繼續看看腳本2。

腳本2:

run_time = datatable.value("runtime_data","global")

checkvalue = browser("百度一下,你就知道").page("百度搜尋結果頁面")._

webedit("結果頁面_關鍵字輸入框").getroproperty("value")

if checkvalue = run_time then

else

end if

最後就是将腳本1和2組合在一起的腳本x了,這裡不貼出這部分腳本,因為這将是下一個章節的學習内容。

從腳本2中可以看到,如果最終驗證通過了,會彈出對話框,顯示“passed”。那麼,來看一下運作結果到底是什麼呢?最終是否驗證成功呢?如圖1-215所示。

我們可以看到,自動化測試圓滿成功!接下來,讓我們見證是否run-time data的生命周期相當的短,qtp運作完畢就會消失,如圖1-216所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

再讓我們看看,qtp運作期間是否有資料被填寫到runtime_data這個列中,如圖1-217所示。

最後,讓我們驗證是否可以在qtp的test report中看到運作時所用到的資料,如圖1-218所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

驗證全部結束,一切都和叙述得完全一緻!到此,相信讀者都已經對qtp的datatable有了更深刻的認知。

細心的讀者一定注意到了,好像這個小節中都在使用global sheet。是以,相信讀者一定會有疑問“為什麼不能用localsheet?”因為針對将不同腳本組合成一個業務腳本的這種形式,用local sheet是不能将值傳遞給另一個腳本的,隻有global sheet才是被共享的!就算不是用組合腳本這種形式,把所有的業務寫在一個腳本中,用action劃分,那為了共享不同action間的資料,仍然要使用global sheet。

至于如何把兩個腳本嵌入到一個腳本中,這是後續章節的内容。

1.8.4 用好datatable對象使腳本更加靈活

因為qtp的datatable是一個保留對象,是以,mercury在實作此功能的時候為它寫了很多的實用方法。使用好這些實用的方法,可以讓我們的腳本更加靈活、多變。作者接下來列舉一些常用的方法供讀者參考:

1.動态地在datatable中添加新列并指派

datatable.globalsheet.addparameter "column1","value1"

datatable.globalsheet.addparameter "column2","value2"

datatable.localsheet.addparameter "column3","value3"

運作結果圖1-219和圖1-220所示。

global sheet local sheet

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

2.動态地在datatable裡增加新行并指派

datatable.getsheet("action1").setcurrentrow ( 2 ) '句1

datatable.value("column4","action1") = "row2"

'或者也可以是:

datatable.value(1,2) = "row2"

運作結果圖1-221所示。

必須使用“句1”才能新增行,不然會被原值替代。因為qtp在getcurrentrow這個過程結束後仍然處于第1行。

運作結果如圖1-222所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

如圖1-222所示,我們可以看到,“row2”這個值被賦到了第一行中。

3.動态擷取datatable中指定列的值

以上兩種其實我們已經在之前的執行個體中都用過了,還有一種更加簡單的寫法,在上面也已經用過,就是直接輸入列的序号,比如引用第一列就直接輸入1,依此類推,完全不用去關心“列”具體叫什麼名字,代碼如下所示:

getvalue3 = datatable(1, "action1")

msgbox getvalue3

也正是因為這樣,完全可以引申出另一個應用:循環讀取action1的n列,代碼如下所示:

for i = 1 to n

msgbox datatable(i, "action1")

next

如果有兩個action,分别是action1和action2,要想使它們在擷取的時候保持讀取的行數一緻,可以使用下面兩種方法:

'方法1:直接定位action2的行。

datatable.getsheet("action2").setcurrentrow(2)

'方法2:使用變量傳遞保持行數一緻

currentrow = datatable.getsheet("action1").getcurrentrow

datatable.getsheet("action2").setcurrentrow(currentrow)

4.動态擷取datatable中指定行的值

getvaluebyrow = datatable.getsheet("action1").getparameter("column7").valuebyrow(2)

msgbox getvaluebyrow

5.動态擷取datatable中目前行和設定目前行

'1、擷取目前行

'msgbox currentrow

'2、設定目前行

datatable.getsheet("action2").setcurrentrow(5)

'注意:增加action2的列數跟行數的計算沒有任何關系

datatable.getsheet("action2").addparameter "column8","value4"

currentrow2 = datatable.getsheet("action2").getcurrentrow

'msgbox currentrow2

6.擷取得到datatable總行數的指令

allrowcount = datatable.getsheet("action1").getrowcount

msgbox allrowcount

1.8.5 總結

datatable是qtp的一個亮點環節,但是也是qtp的一個難點。比如global sheet和local sheet的差別以及它們的邏輯應用。還比如在1.8.4小節中介紹的一些關于datatable的應用,隻是列舉了一些個人認為比較常用的,其實還有很多方法經常會被使用到。不過讀者完全不必擔心,很多東西在qtp強大的“f1”裡都有參考資料和示例,包括舉例的那些方法在f1裡一個都沒有漏掉!不光要用好幫助文檔,最終讀者要做到的是,能夠看着示例舉一反三,随意地應用到項目中去。下面就是關于datatable的示例截圖,如圖1-223所示。

比如點選圖1-223中的getcurrentrow method連結就能夠進入到該方法的具體示例,如圖1-224所示。

《精通QTP——自動化測試技術領航》—第1章1.8節資料池(Data Table)的應用

知識點鞏固和舉一反三練習

一、查閱“兵書”,根據下述要求寫出相應的代碼。

(1)删除qtp的action1這個sheet。

(2)将某個excel表格全部導入qtp的datatable中。

二、統計qtp目前datatable的sheet總數,并将該資料填入global sheet的“1行1列”。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀