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}
從用例的執行結果來看,每個使用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
從測試用例執行結果來看,雖然將作用域定義成了全域性的,但是由於在不同測試套件中以不同引數匯入,所以用例執行過程中為不同的測試套件生成了不同的實