專利名稱:本地化數據采集方法和系統的制作方法
技術領域:
本發明涉及網絡和計算機軟件技術,特別涉及計算機軟件的自動化測試,具體的講是一種本地化數據采集方法。
背景技術:
自動化測試的初次投入是手工測試的3至10倍。如果自動化測試只做一次的話,還不如用手工測試。同一個自動化測試進行多次,不可避免地面對測試環境的準備和恢復問題。一般靜態的數據準備的做法是通過做一個交易產生一個符合這次測試的數據,通過人手記錄下來,經過這個測試后,這個數據的狀態發生了改變,不再適合這個測試,再次進行這個測試時,又需要重復這個過程來產生一個符合這個測試的數據。舉個簡單的例子要測試一個活期帳戶的銷戶交易,那么首先就需要一個正常狀態的活期帳戶。這個帳戶從何而來,你需要做一個活期帳戶的開戶交易來開出一個正常狀態的活期帳戶,并記下這個帳戶的帳號。然后開始進行銷戶交易的測試,交易成功后,這個活期帳戶就變成了一個已銷戶狀態的帳戶,不能再用來測試銷戶交易了,需要重新新開一個帳戶。自動化測試事前要做很多的測試準備數據,自動化測試完成后會使開始準備的數據的狀態等屬性發生變化,下次進行自動化測試時又需要重新準備數據。目前很多公司的做法是采用測試前備份,測試后恢復數據的做法來實現自動化測試和回歸測試,但這種做法在較為復雜的服務器環境上實現不現實,由于每套測試環境上都可能有多個項目正在開展測試,各項目的開始和結束時間點不可能完全相同,如果偶爾少數幾次的環境恢復可能測試人員還能勉強接受,但長期做環境的備份恢復肯定會給其他項目測試進度帶來重大影響。
發明內容
本發明克服了現有自動化測試技術在數據和環境準備中的不足,提供一種實現簡單,實施成本低,能夠有效避免重復準備數據的方法。
在本發明的一個方面,提供了一種用于從測試數據庫中將數據采集到本地數據庫的數據采集系統,包括數據描述管理裝置,用于產生具有預定特征的數據項的數據描述;以及數據采集裝置,用于根據所述數據描述以批量的方式從測試數據庫中將相應的數據項采集到本地數據庫中。
根據本發明的實施例,該系統還包括環境設置裝置,用于設定進行數據采集的測試數據庫環境,并把各個測試數據庫環境的參數值保存在本地數據庫的表中。
根據本發明的實施例,該系統還包括數據采集機器人裝置,用于實時檢測本地數據庫中與預定特征的數據描述相對應的數據項的數目,并且在所述數目小于預定的閾值的情況下從測試數據庫中采集具有所述預定特征的數據項。
根據本發明的實施例,該系統還包括本地數據分配裝置,用于把本地數據庫中的各個數據項分配給相應的應用。
根據本發明的實施例,所述數據描述管理裝置包括SQL輔助生成裝置,用于將中文名稱轉換成英文名稱以生成數據描述所需的SQL語句;SQL輔助查詢裝置,用于將所述SQL語句發送給測試數據庫以驗證所述SQL語句的正確性。
根據本發明的實施例,所述數據描述管理裝置還包括數據描述新增裝置,用戶通過所述數據描述新增裝置輸入數據描述名稱、狀態、預期采集的數據量,以在本地數據庫中產生新的數據描述。
根據本發明的實施例,所述數據采集裝置包括數據采集總控裝置,用于控制各個線程下的批量數據采集過程;數據采集線程裝置,用于將與一個環境下的所有數據描述相對應的數據項批量采集到本地數據庫。
根據本發明的實施例,所述數據采集機器人裝置包括數據監聽/檢測裝置,用于每隔一段時間檢測一次本地數據庫中每一種數據描述的可用數量,以確定缺乏的數據項的數據描述;以及單個數據描述的數據采集裝置,用于從測試數據庫中采集本地數據庫中缺乏的數據項。
在本發明的另一方面,提供了一種用于從測試數據庫中將數據采集到本地數據庫的數據采集方法,包括步驟在本地產生具有預定特征的數據項的數據描述;以及根據所述數據描述以批量的方式從測試數據庫中將相應的數據項采集到本地數據庫中。
根據本發明的實施例,該方法還包括步驟設定進行數據采集的測試數據庫環境,并把各個測試數據庫環境的參數值保存在本地數據庫的表中。
根據本發明的實施例,該方法還包括步驟實時檢測本地數據庫中與預定特征的數據描述相對應的數據項的數目,并且在所述數目小于預定的閾值的情況下從測試數據庫中采集具有所述預定特征的數據項。
根據本發明的實施例,該方法還包括步驟把本地數據庫中的各個數據項分配給相應的應用。
根據本發明的實施例,該方法還包括步驟將中文名稱轉換成英文名稱以生成數據描述所需的SQL語句;將所述SQL語句發送給測試數據庫以驗證所述SQL語句的正確性。
根據本發明的實施例,該方法還包括步驟輸入數據描述名稱、狀態、預期采集的數據量,以在本地數據庫中產生新的數據描述。
根據本發明的實施例,所述采集步驟包括將與一個環境下的所有數據描述相對應的數據項批量采集到本地數據庫。
根據本發明的實施例,該方法還包括步驟每隔一段時間檢測一次本地數據庫中每一種數據描述的可用數量,以確定缺乏的數據項的數據描述;以及從測試數據庫中采集本地數據庫中缺乏的數據項。
根據本發明的上述方法和系統,利用數據描述進行數據采集,可以實現準備一次數據描述,以后就可以重復采集這一類型的數據,避免重復做繁瑣的環境數據準備,提高了效率。此外,對采集下來數據進行二次分配,避免數據使用沖突。
圖1是本地化數據采集的結構示意圖;圖2是數據描述管理裝置的結構示意圖;圖3是數據采集裝置的結構示意圖;圖4是數據采集機器人裝置的一個結構示意圖;圖5是數據采集總控裝置的流程圖;圖6是一個數據采集線程的流程圖;圖7是數據采集機器人裝置的流程圖。
具體實施例方式
下面將對照附圖,對本發明的具體實施例進行詳細說明。
如圖1所示,被采集的測試數據庫1處于一個環境相對復雜的測試環境中,為各種應用提供數據來源。換句話說,要被采集的數據存儲在該測試數據庫1中。這個測試環境可以是大型機,同樣也可以擴展到一般的小型,微型服務器,前提是這個服務器不適宜頻繁地進行環境的恢復。
本地數據庫2是一個跟數據采集裝置7處于同一個局域網內的數據庫,因此稱之為本地數據庫。它可以是DB2,ORACLE,SQLSERVER等各種關系數據庫。本地數據庫2里面主要有環境表、數據描述表(數據結構表1)、本地數據表(數據結構表2)。
下面的表1和表2示出了數據描述表1和本地數據表的結構。
表1、數據描述表(DATADESC)
表2、本地數據表(LOCAL_DATA)
在表1中,數據描述是指事先定義的一些對測試案例需要的數據的詳細而清晰的描述。例如“正常的人民幣活期帳戶”,“已掛失的靈通卡卡號”,“余額大于10萬元的正常的美元往來戶”這些都是數據描述,對應存放在數據結構表1(DATADESC)的DATADESC_NAME字段。
帶參數的數據描述SQL是指每一個數據描述會對應一條能夠從測試數據庫取到這類型數據的SQL,這個SQL中所有跟實際環境的參數值相關的地方都用參數表示,因此稱作帶參數的數據描述SQL,存放在數據結構表1(DATADESC)的DATADESC_SQL字段。
可執行的數據描述SQL是指當帶參數的數據描述SQL中的參數被實際的環境參數值替換后,這個SQL就是可執行的SQL了。
內部/外部網絡3可以為內部網絡企業的局域網,以太網(Ethernet),其它局域網絡,如光纖分布式數據接口(FDDI)、令牌環(Token-Ring)等。它同時可以是外部的網絡互聯網(Internet)或者其它企業外部網(Extranet)。主要視被采集的測試數據庫1與其它裝置是否處于同一內部網絡而定。
內部網絡4為企業的局域網,可以是以太網(Ethernet),也可以是其它局域網絡,如光纖分布式數據接口(FDDI)、令牌環(Token-Ring)等。
環境設置裝置5是一個提供界面給用戶以對特定應用的測試環境進行設置的客戶端,它把各個環境的一些參數值保存在本地數據庫特定的數據結構——環境表中,供數據采集裝置7用來替換帶參數的數據描述SQL中的參數。參數值隨著各個具體測試環境的不同而不同,但是能清晰描述各個環境在測試數據庫中的特征。
數據描述管理裝置6是一個提供界面可以讓用戶能夠新增,修改,拷貝,刪除數據描述的客戶端。數據描述管理裝置6生成的數據描述插入到本地數據庫的數據描述表(數據結構表1)中,供數據采集裝置7,本地數據分配裝置8和數據采集機器人裝置9使用。
數據描述管理裝置6包括圖2所示的6個部分。
SQL輔助生成裝置61是一個用來幫助用戶產生數據描述所需的SQL的工具。由于測試數據庫的表很多,用戶不可能全部都能記住需要查詢的表的表名、字段名等,產生數據描述SQL會有一定的困難。而使用SQL輔助生成裝置61,用戶只需選擇需要查詢的表的中文名,表的中文字段名,以及一些常用的函數,運算符等,就可以由SQL輔助生成裝置61進行測試數據庫表名以及各字段名的中英文轉換等各種轉換,產生SQL語句。
SQL輔助查詢裝置62是一個提供給用戶驗證自己手寫的或者SQL輔助生成裝置61產生的SQL語句的工具。它是一個SQL執行客戶端。用戶只需要按一個查詢按鈕,就可以直接把SQL送上測試數據庫,通過測試數據庫返回信息驗證SQL是否有錯誤。
數據描述新增裝置63提供一個界面讓用戶輸入數據描述名稱,選擇數據描述狀態,通過對手寫或者SQL輔助生成裝置61產生的SQL中跟環境相關的參數值變成參數,產生帶參數的數據描述SQL,以及選擇SQL語句是否檢測通過,填入預期采集的數據量,最后由數據描述新增裝置63根據數據庫序列生成一個數據描述ID,插入本地數據庫的數據描述表DATADESC(數據結構表1)中的相應字段,至此,一條數據描述新增成功。
數據描述修改裝置64提供了一個界面讓用戶對數據描述新增裝置63產生的數據描述的各個屬性進行修改。
數據描述拷貝裝置65提供了一個復制已存在的數據描述的功能,目的是為了讓用戶復制一個數據描述,在這個基礎上進行修改,加速生成相近或相似的數據描述。
數據描述刪除裝置66提供了刪除由數據描述新增裝置63和數據描述拷貝裝置65產生的數據描述的功能。
數據采集裝置7是一個根據數據描述批量采集測試數據庫各個環境的數據到本地的裝置。它可以是通過任何一種數據庫連接驅動(ODBC,JDBC等)連接上目標測試環境的數據庫。例如,使用DB2直連的ODBC驅動連接上目標測試環境。它通過將數據描述管理裝置6產生的帶參數的數據描述SQL和環境設置裝置5產生的具體環境的參數值組合成可以執行的SQL語句,采用多線程送上測試數據庫進行數據采集。
數據采集裝置7包括圖3所示的兩個部件。
數據采集總控裝置71是一個負責控制數據采集線程裝置72以及整個采集流程的部件。數據采集線程裝置72是一個實際的對一個環境的所有數據描述進行批量數據采集的一個部件。
先看數據采集總控裝置71的具體操作流程,如圖5所示步驟10數據采集總控裝置71先進行一些訪問數據庫、啟動線程等的初始化工作,把線程計數器變量置為0。
步驟11通過SQL語句查詢本地數據庫的環境表,獲取整個環境參數值的數據集。
步驟12判斷環境數據集是否為空,如果是空,則結束整個數據采集流程。如果不為空,則轉到步驟13。
步驟13數據采集總控裝置71先從環境數據集中取一個環境的具體參數值。
步驟14啟動一個數據采集線程,把這個環境的參數值傳入線程內,同時將線程計數器加1,并且開始數據采集線程裝置72的流程。為了加快采集的速度,同時也避免連接上測試環境的數據庫連接過多,因此經過衡量,在這里采用多線程技術,每一個環境將會起一個線程對所有有效的數據描述進行采集。一個線程對應一個數據庫連接。
步驟15將環境數據集中的游標向下移動一位。
步驟16判斷是否到達環境數據集的結尾,如果否則轉到步驟13;如果是則轉到步驟17。
步驟17等待所有線程的結束。每一個線程結束時,都會將線程計數器減1。
步驟18判斷線程計數器是否為0,看線程是否全部結束,如果是,則結束程序,否則轉向步驟17繼續等待。
下面描述數據采集線程裝置72的具體操作流程,如圖6所示步驟20獲取數據采集總控裝置71傳入的環境的參數值,保存到各個變量中。
步驟21從本地數據庫的數據描述表(DATADESC)中取出所有數據描述狀態(DATADESC_STATUS)值為1——有效和SQL語句檢測狀態(ISTEST)值為1——檢測通過的數據描述到一個數據集中。
步驟22判斷數據描述數據集是否為空,如果為空則轉到步驟29,如果不為空則轉到步驟23。
步驟23從數據描述數據集取一條數據描述記錄,包括表1中的數據描述ID字段,數據描述SQL語句字段,預期采集數據量字段。
步驟24用步驟20的環境參數值和步驟21的帶參數的數據描述SQL以及預期采集數據量組合成一條可執行的SQL語句。這一過程就是用環境參數值把帶參數的數據描述SQL中的參數替換掉,并用把采集數據量變成SQL語句的一個條件限制。例如預期采集100條數據,在DB2中是“FETCH FIRST 100 ROWS ONLY”,其他數據庫有類似的用法。然后將這條可執行的SQL語句上送測試數據庫進行查詢。
步驟25判斷是否有采集到符合條件的數據,如果否則轉到步驟27。如果是則轉到步驟26。
步驟26把采集下來的數據以及數據描述ID,測試數據庫環境ID插入數據結構表2本地數據表(LOCAL_DATA)中,其中采集下來的數據放在DATA字段中。
步驟27將數據描述數據集的游標向下移動一位。
步驟28判斷是否到達數據描述數據集的結尾,是則轉到步驟20,否則轉到步驟23。
步驟29將線程計數器減1,同時做一些線程結束的收尾工作。
至此,一個采集線程結束。
本地數據分配裝置8是一個針對各個使用采集下來的數據的應用的一個分配裝置,它可以對數據的使用進行一種限制,避免使用沖突。它的實現可以是一個接口給各個應用來調用,各個應用跟具體的數據描述進行一種關聯后,需要用到這個數據描述的數據時,調用這個接口,由本地數據分配裝置8在本地數據表2(LOCAL_DATA)中根據使用的環境參數選擇一條合適的數據,同時把表2本地數據表(LOCAL_DATA)中的這條數據的ISUSETODAY字段的值置成1-已使用,以及把使用人、使用時間更新進本地數據表(表2)中相應的USER_ID和OPR_DATE字段。
數據采集機器人裝置9是一個避免本地數據使用完畢后應用沒有數據可用的一個機器人程序。它的實現原理是通過不停檢測本地數據表2(LOCAL_DATA)中每一種數據描述的可用數據量,當發現存在可用數據量小于某一指定閥值的數據描述時,取得這個(這些)數據描述ID,清空本地數據表2(LOCAL_DATA)中的這類數據描述數據,重新單獨從測試數據庫采集一定數量的數據到本地數據表2(LOCAL_DATA)中。
數據采集機器人裝置9包括圖4所示的數據量監聽/檢測裝置91和單個數據描述數據采集裝置92兩個部件。
數據量監聽檢測裝置91可以是每隔一段時間檢測一次本地數據庫表2(LOCAL_DATA)中每一種數據描述的可用數量。實際可以根據數據庫的不同采取不同的做法,例如本實施例采用的是ORACLE數據庫,可以用ORACLE AQ(高級隊列)和ORACLE job以及存儲過程來實現。ORACLE job定時調用一個檢測本地數據表中每種數據描述的可用數量的存儲過程,如果發現可用數量小于某一指定的數值,在ORACLE高級隊列表中插入一條記錄,記錄的USER_DATA字段記錄了數據描述的ID。
數據量監聽檢測裝置91通過使用ORACLE OCI監聽高級隊列表,一旦發現里面有記錄,就會將高級隊列中的記錄出列,獲取缺乏數據的數據描述ID,然后轉向單個數據描述數據采集裝置92進行采集。
單個數據描述數據采集裝置92與數據采集裝置7不同的是,數據采集裝置7是對所有環境所有數據描述進行批量采集;而單個數據描述數據采集裝置92則只是對單個數據描述在所有環境中進行采集。
數據采集機器人裝置9的的流程如圖7所示步驟30;數據量監聽/檢測裝置91不停監聽本地數據表2(LOCAL_DATA)。
步驟31判斷是否存在可用數據量小于指定值的數據描述。如果存在則轉到步驟32。如果不存在則轉到步驟30繼續監聽/檢測。
步驟32獲取可用數據量小于指定值的這條數據描述的各個屬性值,例如帶參數的數據描述SQL等。
步驟33刪除本地數據表2(local_data)中這個數據描述在各個環境的數據,保證數據采集機器人裝置9采集下來的數據能夠順利插入本地數據表2。
步驟34從環境表中獲取含有測試數據庫各個環境參數值的數據集。
步驟35判斷環境數據集是否為空,如果為空則轉到步驟30繼續監聽。如果不為空則轉到步驟36。
步驟36取一個環境的參數值。
步驟37用步驟36的環境參數值和步驟32的帶參數的數據描述SQL以及預期采集數據量組合成一條可執行的SQL語句。然后將這條可執行的SQL語句上送測試數據庫進行查詢。
步驟38判斷是否有采集到符合條件的數據,如果否則轉到步驟40。如果是則轉到步驟39。
步驟39把采集下來的數據以及數據描述ID,測試數據庫環境ID插入表2本地數據表(LOCAL_DATA)中,其中采集下來的數據放在DATA字段中。
步驟40將環境數據集中的游標向下移動一位。
步驟41判斷是否到達環境數據集的結尾,如果是則轉到步驟30繼續監聽。如果否則轉到步驟36。
因此,與一般的靜態數據準備方法不同的是,本發明采用的本地化數據采集及分配方法,是一種動態的方法。其實現方法是通過環境設置裝置設置好環境的參數值,存放在本地數據庫的環境表中。通過數據描述管理裝置6預先定義好自動化測試所需要的數據描述,放在本地數據庫的數據描述表中。根據數據描述表中預先定義的一些數據描述對應的SQL上測試數據庫獲取數據,但由于平臺跟測試數據庫之間交互太多,容易影響效率,因此初始環境時根據帶參數的數據描述SQL和環境的具體參數值從測試數據庫采集一批符合數據描述條件的數據到本地數據庫的本地數據表中。使用數據時不是直接指定需要某一個具體數據,而是指定需要哪一種數據描述所描述的數據,由本地數據分配裝置8從這一類數據中取一條當天沒人使用過的數據。同時,本地化數據采集機器人裝置(robot)9不停地檢測本地數據表中每一個數據描述的可用數據量,當發現這個數值低于某一個設定值時,自動重新從測試數據庫采集一批符合這個數據描述的數據到本地數據表。在一個經過較長時間運行的測試數據庫環境,各種類型的數據都應該是已有一定的數量,符合應用這種通過數據描述采集數據到本地進行分配的數據本地化數據采集方法,并且在一個較長的應用周期后,各種類型的數據應該是能夠趨于平衡的。
另外,由于數據存在于測試數據庫1和本地數據庫兩個數據庫2中,采集到的結果是對測試數據庫某個時刻的一個快照。數據不一致的可能性是肯定存在的,但在實際的應用中,即使出現某些數據狀態不一致的情況,也可以把這條記錄標記為失敗,繼續執行下面的測試案例或者重新執行測試,此外,測試數據庫1上的海量數據以及上述數據采集裝置7和數據采集機器人裝置9將保證本地數據庫2中的準備測試用數據能夠滿足自動化測試的數據量要求,并不會影響實際的測試效果。
以上所述,僅為本發明中的具體實施方式
,但本發明的保護范圍并不局限于此,任何熟悉該技術的人在本發明所揭露的技術范圍內,可輕易想到的變換或替換,都應涵蓋在本發明的包含范圍之內。因此,本發明的保護范圍應該以權利要求書的保護范圍為準。
權利要求
1.一種用于從測試數據庫中將數據采集到本地數據庫的數據采集系統,包括數據描述管理裝置,用于產生具有預定特征的數據項的數據描述;以及數據采集裝置,用于根據所述數據描述以批量的方式從測試數據庫中將相應的數據項采集到本地數據庫中。
2.如權利要求1所述的數據采集系統,還包括環境設置裝置,用于設定進行數據采集的測試數據庫環境,并把各個測試數據庫環境的參數值保存在本地數據庫的表中。
3.如權利要求2所述的數據采集系統,還包括數據采集機器人裝置,用于實時檢測本地數據庫中與預定特征的數據描述相對應的數據項的數目,并且在所述數目小于預定的閾值的情況下從測試數據庫中采集具有所述預定特征的數據項。
4.如權利要求3所述的數據采集系統,還包括本地數據分配裝置,用于把本地數據庫中的各個數據項分配給相應的應用。
5.如權利要求1所述的數據采集系統,其中所述數據描述管理裝置包括SQL輔助生成裝置,用于將中文名稱轉換成英文名稱以生成數據描述所需的SQL語句;SQL輔助查詢裝置,用于將所述SQL語句發送給測試數據庫以驗證所述SQL語句的正確性。
6.如權利要求5所述的數據采集系統,其中所述數據描述管理裝置還包括數據描述新增裝置,用戶通過所述數據描述新增裝置輸入數據描述名稱、狀態、預期采集的數據量,以在本地數據庫中產生新的數據描述。
7.如權利要求1所述的數據采集系統,其中所述數據采集裝置包括數據采集總控裝置,用于控制各個線程下的批量數據采集過程;數據采集線程裝置,用于將與一個環境下的所有數據描述相對應的數據項批量采集到本地數據庫。
8.如權利要求3所述的數據采集系統,其中所述數據采集機器人裝置包括數據監聽/檢測裝置,用于每隔一段時間檢測一次本地數據庫中每一種數據描述的可用數量,以確定缺乏的數據項的數據描述;以及單個數據描述的數據采集裝置,用于從測試數據庫中采集本地數據庫中缺乏的數據項。
9.一種用于從測試數據庫中將數據采集到本地數據庫的數據采集方法,包括步驟在本地產生具有預定特征的數據項的數據描述;以及根據所述數據描述以批量的方式從測試數據庫中將相應的數據項采集到本地數據庫中。
10.如權利要求9所述的數據采集方法,還包括步驟設定進行數據采集的測試數據庫環境,并把各個測試數據庫環境的參數值保存在本地數據庫的表中。
11.如權利要求10所述的數據采集方法,還包括步驟實時檢測本地數據庫中與預定特征的數據描述相對應的數據項的數目,并且在所述數目小于預定的閾值的情況下從測試數據庫中采集具有所述預定特征的數據項。
12.如權利要求11所述的數據采集方法,還包括步驟把本地數據庫中的各個數據項分配給相應的應用。
13.如權利要求9所述的數據采集方法,還包括步驟將中文名稱轉換成英文名稱以生成數據描述所需的SQL語句;將所述SQL語句發送給測試數據庫以驗證所述SQL語句的正確性。
14.如權利要求13所述的數據采集方法,還包括步驟輸入數據描述名稱、狀態、預期采集的數據量,以在本地數據庫中產生新的數據描述。
15.如權利要求9所述的數據采集方法,所述采集步驟包括將與一個環境下的所有數據描述相對應的數據項批量采集到本地數據庫。
16.如權利要求11所述的數據采集方法,其中還包括步驟每隔一段時間檢測一次本地數據庫中每一種數據描述的可用數量,以確定缺乏的數據項的數據描述;以及從測試數據庫中采集本地數據庫中缺乏的數據項。
全文摘要
公開了一種用于從測試數據庫中將數據采集到本地數據庫的數據采集系統,包括數據描述管理裝置,用于產生具有預定特征的數據項的數據描述;以及數據采集裝置,用于根據所述數據描述以批量的方式從測試數據庫中將相應的數據項采集到本地數據庫中。利用數據描述進行數據采集,可以實現準備一次數據描述,以后就可以重復采集這一類型的數據,避免重復做繁瑣的環境數據準備,提高了效率。此外,對采集下來數據進行二次分配,避免數據使用沖突。
文檔編號G06F17/30GK1851702SQ20061001198
公開日2006年10月25日 申請日期2006年5月25日 優先權日2006年5月25日
發明者丘嘉宜, 江煒斌, 鄺嘉升, 周尚勤, 林艷椿, 鄭子柔 申請人:中國工商銀行股份有限公司