1. 程式人生 > >Robot Framework自定義測試庫的作用域的理解

Robot Framework自定義測試庫的作用域的理解

  robot framework中,強大的測試庫api支援,使用者可根據實際需求定義測試庫,匯入後可使用自定義庫中相應的關鍵字。

  當自定義的測試庫是類庫,則需要考慮一個問題:類例項。用類實現的庫可以有內部狀態, 這些狀態可以被關鍵字或建構函式修改. 因為這些狀態會影響到關鍵字實際的行為, 所以, 保證一個測試用例不會意外地影響到另一個用例顯得非常重要. 這種依賴行為有可能造成非常難定位的bug。例如, 添加了新的測試用例, 而這些用例使用庫的方式並不一致。

  Robot Framework 為了保證測試用例之間的獨立性, 預設情況下, 它為每個測試用例建立新的測試庫例項. 然而, 這種方式不總是我們想要的, 比如有時測試用例需要共享某個狀態的時候. 此外, 那些無狀態的庫顯然也不需要每次都建立新例項。例項化測試庫類的方式可以通過屬性ROBOT_LIBRARY_SCOPE

定義的三個作用域來控制

  1.TEST CASE:為每個測試用例建立測試庫例項,用例間相互獨立,此為預設情況;

  建立測試庫類:GTest.py

 1 class GTest(object):
 2 
 3     ROBOT_LIBRARY_SCOPE = "TEST CASE"
 4     counter = 0
 5 
 6     def __init__(self):
 7         GTest.counter += 1
 8 
 9     def count(self):
10         return self.counter, id(self)
View Code

   建立測試套件login.robot:

 1 *** Settings ***
 2 Documentation     Suite description
 3 Library           GTest.py
 4 
 5 *** Test Cases ***
 6 Test title
 7     [Tags]    DEBUG
 8     @{res}   count
 9     log many    @{res}
10 
11 Test title2
12     [Tags]      DEBUG
13     @{res}   count
14     log many    @{res}
View Code

 從用例的執行結果來看,每個使用GTest庫的測試用例執行時,counter值加1,且例項id各不相同,所以SCOPE為"TEST CASE"的測試庫會為每個測試用例建立例項,這種配置更適用於嚴格控制用例間相互影響的場景;

  2.TEST SUITE:為每個測試套件建立測試庫例項,該測試套件內的所有用例共享這個庫例項

  修改測試庫類GTest.py, 將ROBOT_LIBRARY_SCOPE值替換為"TEST SUITE"

 1 class GTest(object):
 2 
 3     ROBOT_LIBRARY_SCOPE = "TEST SUITE"
 4     counter = 0
 5 
 6     def __init__(self):
 7         GTest.counter += 1
 8 
 9     def count(self):
10         return self.counter, id(self)
View Code

  新增測試套件login2.robot

 1 *** Settings ***
 2 Documentation     Suite description
 3 Library           GTest.py
 4 
 5 *** Test Cases ***
 6 Test title
 7     [Tags]    DEBUG
 8     @{res}   count
 9     log many    @{res}
10 
11 Test title2
12     [Tags]      DEBUG
13     @{res}   count
14     log many    @{res}
View Code

  執行測試套件login.robot和login2.robot

 

 

 

 

 從以上測試結果來看,圖1中,同一測試套件內所有測試用例獲取到的GTest例項相同;圖2中,不同測試套件獲取到的GTest例項不同,因此SCOPE設定為"TEST SUITE"時,會為每個測試套件建立一個測試庫例項;

  3.GLOBAL:整個測試過程中只建立一個測試庫例項,所有測試套件、測試用例共享同一個測試庫例項

  修改測試庫GTest.py,將ROBOT_LIBRARY_SCOPE修改為"GLOBAL"

 1 class GTest(object):
 2 
 3     ROBOT_LIBRARY_SCOPE = "GLOBAL"
 4     counter = 0
 5 
 6     def __init__(self):
 7         GTest.counter += 1
 8 
 9     def count(self):
10         return self.counter, id(self)
View Code

  執行測試套件login.robot和login2.robot

 

 

 從用例執行結果來看,測試套件login.robot和login2.robot所用GTest的同一個例項,且只有一個。因此SCOPE設定為"GLOBAL"後,整個測試過程中只生成一個測試庫例項。所有套件、測試用例共享這個測試庫例項;

  robot官網中說明,如果同一個測試庫被多次以不同引數匯入,則不管ROBOT_LIBRARY_SCOPE是否定義,每個測試套件會建立一個新的例項

  建立測試庫GTest.py,  ROBOT_LIBRARY_SCOPE定義為"GLOBAL"

 1 class GTest(object):
 2 
 3     ROBOT_LIBRARY_SCOPE = "GLOBAL"
 4     counter = 0
 5 
 6     def __init__(self, *args):
 7         self.args = args
 8         GTest.counter += 1
 9 
10     def count(self):
11         return self.counter, id(self)
View Code

  建立測試套件login.robot

 1 *** Settings ***
 2 Documentation     Suite description
 3 Library           GTest.py      suite1      login1
 4 
 5 *** Test Cases ***
 6 Test title
 7     [Tags]    DEBUG
 8     @{res}   count
 9     log many    @{res}
10 
11 Test title2
12     [Tags]      DEBUG
13     @{res}   count
14     log many    @{res}
View Code

  建立測試套件login2.robot

 1 *** Settings ***
 2 Documentation     Suite description
 3 Library           GTest.py      login2      suite2
 4 
 5 *** Test Cases ***
 6 Test title
 7     [Tags]    DEBUG
 8     @{res}   count
 9     log many    @{res}
10 
11 Test title2
12     [Tags]      DEBUG
13     @{res}   count
14     log many    @{res}
View Code

 

從測試用例執行結果來看,雖然將作用域定義成了全域性的,但是由於在不同測試套件中以不同引數匯入,所以用例執行過程中為不同的測試套件生成了不同的實